2012-05-14 8 views
11

いくつかのテンプレートを入力してプロジェクトフォルダに挿入するスクリプトをいくつか作成したいとします。私はこれにシェルスクリプトを使いたいと思うので、テンプレートは非常に小さいので、それらをシェルスクリプトに埋めたいと思っています。問題は、echoが文字列の改行を無視しているようです。どちらか、または文字列に改行が含まれていないと開始します。複数の文字列をBourneシェルにエコーする方法

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

echo -e $MY_STRING 

この出力:

Hello, world! This Is A Multi lined String.

私はechoを想定していますここで犯人れる例はここにあります。改行を確認するにはどうすればよいですか?

+0

これは実際はBourneシェルの質問です(bash固有ではありません)。それに応じてタイトルを編集してもよろしいですか? – Jens

+1

Jens:大胆で、あなたは自分で編集することができます(私がやったように)。 – tripleee

+0

@ tripleee:ちょうどいいと誰かのつま先にステップしないようにしたい。私はそれのために行くだろう。 – Jens

答えて

15

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

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]、改行とすべてです。

何が価値があるのは、こちらも考えるための文書(とcat、ないecho):また、ここでは、文書内の変数を補間することができます

cat <<"HERE" 
foo 
Bar 
HERE 

cat <<HERE 
$MY_STRING 
HERE 

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

+0

クールですが、あなたの答えを正しく記入する前になぜ説明できますか?編集:ああ私は今すぐそれを得る。 Bashが他のスクリプト言語のように文字列を渡さないことを忘れてしまった – Hubro

+0

編集のお知らせ。お役に立てれば。 – tripleee

2

これを試してみてください:

echo "$MY_STRING" 
12

echoがとても年代です。 The new (POSIX) kid on the block is printf

printf '%s\n' "$MY_STRING" 

ない-eまたはどこで、どのように広い、C.みんなで今printfの使用を開始し、振り返ることはありませんしてくださいのようなエスケープシーケンスを印刷する内容を超えるBSDエコーの狂気と完全な制御対SYSV。

+1

+1、printfにはより多くの便利な書式があります – Rony