13

いくつかのテンプレートを埋めてプロジェクトフォルダに挿入するためのスクリプトを作成したいと思います。これにはシェルスクリプトを使用したいのですが、テンプレートが非常に小さいので、シェルスクリプトに埋め込みたいと思います。問題はecho、文字列の改行を無視しているように見えることです。それか、文字列に最初から改行が含まれていません。次に例を示します。

MY_STRING="
Hello, world! This
Is
A
Multi lined
String."

echo -e $MY_STRING

これは以下を出力します:

こんにちは世界!これは複数行の文字列です。

echoここが原因だと思います。どうすれば改行を確認できますか?

4

3 に答える 3

20

変数の補間を二重引用符で囲む必要があります。

 echo -e "$MY_STRING"

これは非常に一般的なエラーです。特に空白で区切られたトークンに分割したり、ワイルドカードを展開したりする必要がない限り、常に文字列を引用する習慣を身に付ける必要があります。

したがって、明示的に言うと、シェルはコマンドラインを解析するときに空白を正規化します。argv配列を出力する単純なCプログラムを作成すると、これを確認できます。

argv[0]='Hello,'
argv[1]='world!'
argv[2]='This'
argv[3]='Is'
argv[4]='A'
argv[5]='Multi'
argv[6]='lined'
argv[7]='String.'

対照的に、引用符を使用すると、文字列全体がargv[0]改行とすべてになります。

価値があるものについては、ヒアドキュメント(with cat、not echo)も検討してください。

cat <<"HERE"
foo
Bar
HERE

ヒアドキュメントで変数を補間することもできます。

cat <<HERE
$MY_STRING
HERE

...この特定のケースでは、それはあなたが望むものではありませんが。

于 2012-05-14T12:20:10.243 に答える
14

echoとても90年代です。ブロック上の新しい(POSIX)キッドはですprintf

 printf '%s\n' "$MY_STRING"

いいえ-e、またはSYSV vs BSDエコーの狂気と、何がどこにどのくらいの幅で印刷されるかを完全に制御し、Cのようにシーケンスをエスケープします。誰もprintfが今すぐ使い始めて、決して振り返らないでください。

于 2012-05-14T12:26:00.617 に答える
2

これを試して :

echo  "$MY_STRING"
于 2012-05-14T12:21:11.113 に答える