2012-03-09 11 views
2

複数の行にまたがって分割されるmultilne変数を作成して、インデントされていない各行にインデントしたいとします。私は、いくつかの方法を試みた:bash変数の改行とタブをエスケープするには?

function regprompt { 
    case "$TERM" in 
     xterm*) 
      PS1=$(cat <<-EOF 
        ${blue} \u ${txtrst}on ${cyan}\h${white}\$gitps1 ${blue}\${fill} \ 
        ${undgrn}\d \D{%r} ${blue}\ 
        \n[ ${yellow}\$newPWD ${blue}] ${txtrst}$ ${blue} 
EOF 
) 
     ;; 
     linux*) 
      PS1="${green} \u ${txtrst}on ${cyan}\h${white}\$gitps1 ${green}\${fill} \ 
       ${undgrn}\d \D{%r} ${green}\ 
       \n[ ${yellow}\$newPWD ${green}] ${txtrst}$ ${green}" 
     ;; 
     screen*) 
      PS1="${green} \u ${txtrst}on ${cyan}\h${white}\$gitps1 ${green}\${fill} \ 
${undgrn}\d \D{%r} ${green}\ 
       \n[ ${yellow}\$newPWD ${green}] ${txtrst}$ ${green}" 
     ;; 
    esac 
} 

最初のオプションは、私が唯一の空間(エスケープ前のもの)を表示したい日付の部分(\ D \ D {%のR})インデントを示します。その上のすべてが正しく表示されます。 2番目のオプションも同じです。画面オプションが正しく表示されます。整理しておく方法があるかどうかを知りたいだけですか?

答えて

3

変数にタブを含める必要がない場合は、一重引用符(改行を許可)を使用し、タブでインデントしてからtrを使用してタブを削除できます。例:

var='ab 
     cd 
         ef 
gh 
     ij' 
var=$(echo "$var" | tr -d '\t') 
echo "$var" 

インデントはタブでなければならず、これが動作するためのスペースではないことに注意してください。残念ながら、私は書式設定でこれを示す方法を知らない。このトリックはスクリプトでは動作しますが、タブを入力するインタラクティブシェルではタブがタブ補完のためにreadlineによって使用されるため、タブを入力できないことがあります。変数に先頭のスペースが必要ない場合は、スペースを使用することもでき、tr -d '\t'の代わりにsed -e 's/^ \+//'のようなものを使用します。

+0

すごくうまくいった!ありがとう、これを整理しようとする苦痛だった、ここで最初に尋ねられるべきである。 sedとtrなどの学習を始める時間を推測してください:|。 – bluTaz

関連する問題