web-dev-qa-db-ja.com

複数のスペースを含む文字列をbashの「そのまま」にエコーするにはどうすればよいですか?

私はこのような変数を割り当てました:

MYCUSTOMTAB='     '

しかし、両方のエコーでそれを使用します:

echo $MYCUSTOMTAB"blah blah"

または

echo -e $MYCUSTOMTAB"blah blah"

シングルスペースと残りの文字列を返すだけです。

 blah blah

文字列全体をそのまま印刷するにはどうすればよいですか? \tは幅が広すぎるため、カスタムインデントに使用したいと思います。

17
user3450548

変数を二重引用符で囲んで フィールド分割 を防止しますateスペース:

$ MYCUSTOMTAB='     '
$ echo "${MYCUSTOMTAB}blah blah"
     blah blah
25
cuonglm

この答え で示唆されているように、変数を引用するだけで十分です。

あなたのケースで引用が必要な理由は、bashを使用しないと、split + glob演算子が_$MYCUSTOMTAB_の展開に適用されるためです。 _$IFS_のデフォルト値にはタブ文字が含まれているため、_echo -e $MYCUSTOMTAB"blah blah"_では、_$MYCUSTOMTAB_は何にも分割されないので、記述した場合と同じになります。

_echo -e "blah blah"
_

(おそらく_-e_はここでは必要ありません)。

printfの代わりにechoを使用することもできます。

_printf '%s\n' "$MYCUSTOMTAB"

printf '%s\n' "${MYCUSTOMTAB}blah blah"
_

または、printfで_\n_と同じ種類の_\t_、_echo -e_拡張を実行する場合は、_%b_の代わりに_%s_を使用します。

_printf '%b\n' "${MYCUSTOMTAB}blah blah"
_

参考までに printfがechoよりも優れている理由

9
techraf

変数には二重引用符を使用する必要があると思います

echo -e "$MYCUSTOMTAB"."blah blah"
2
mnille

あなたの質問にbashのタグが付いていることは知っていますが、とにかく、移植性と信頼性を最大にするために、以下を使用します。

printf "%sblah blah\n" "$MYCUSTOMTAB" 

または

someString="blah blah"
printf "%s%s\n" "$MYCUSTOMTAB" "$someString"
1
jlliagre