2008-09-03 9 views
6

ここには何が起こっていますか?なぜBourneシェルは%s引数に対してprintfを反復処理しますか?

printf.sh:

#! /bin/sh 
NAME="George W. Bush" 
printf "Hello, %s\n" $NAME 

コマンドラインセッション:

$ ./printf.sh 
Hello, George 
Hello, W. 
Hello, Bush 

UPDATE:printf "Hello, %s\n" "$NAME"作品。私はechoを使用していない理由について、検討し

echo.sh:

#! /bin/sh 
FILE="C:\tmp" 
echo "Filename: $FILE" 

コマンドライン:

$ ./echo.sh 
Filename: C: mp 

POSIX spec for echoは、「新しいアプリケーションは、代わりにprintfを使用することが推奨されている、と言いますecho "(これと他の理由で)。あなたがそれらの単語のすべてが自分でプリントアウトしたい場合は

+0

bash組み込みエコーはデフォルトでは\ replacementにはなりませんが、POSIXシェル(たとえばダッシュなど)は、その仕様へのリンクが示すようにエコーします。とにかくシェルを使用しているので、単に "Hello、$ NAME \ n"という文字をプリントすることができます。 –

+0

実際、%sを使用するのはセキュリティと正確性の理由から、おそらく良い習慣です。 printfは\ replacementやその他のものをフォーマット文字列に渡しますので、可能な限り変数を外してください。 –

答えて

6

を$ NAMEを入れて持っているのprintfを使い続けるために、 man pageは、それを渡す文字列を引数と見なします。あなたの文字列にスペースがある場合は、複数の引数を渡していると考えます。変数を引用符で囲むことで、ColinYoungerが正しいと信じています。これにより、シェルは文字列を単一の引数として解釈します。

代替はprintfの変数を拡張できるようにするかもしれません:

printf "Hello, $NAME." 

リンクはbashのためのものですが、私は同じことが、SHのために保持しているかなり確信しています。

0

、のprintf

のprintf 印刷の代わりを使用するには、フォーマットの仕様を取り、あなたが渡す各引数に適用します。 {George、W.、Bush}という3つの引数を持つので、異なる引数を使って3回文字列を出力します。

+0

print(1)は、mime-typeをチェックした後、ファイルをプリンタに印刷するためのものです。これはbashに組み込まれたシェルではありません。 –

1

あなたはprintfを使用している特定の理由がありますか、あなたにもうってつけの効果がありますか?

Hello, George W. Bush 

編集中

NAME="George W. Bush" 
echo "Hello, "$NAME 

結果:Bourneシェルがスペースdelimittedあるので それはを反復処理される理由は、 "ジョージ・W・ブッシュ" です。私は解釈方法

#! /bin/sh 
NAME="George W. Bush" 
printf "Hello, %s\n" "$NAME" 
1

printf "Hello, %s\n" George W. Bush 

はこれを使用する:あなたはあなたの名前の変数は次のように置換されている二重引用符で

printf "Hello, %s\n" "$NAME" 
+0

いいえ、「考えている」というのはありません。彼はprintfコマンドで$ NAMEの拡張を引用しなかったので、複数の引数を渡しました。シェルはそれを展開した後、単語分割してprintfに3つの引数を渡しました。しかし、あなたが言うように、ColinYoungerは正しいです。 –

関連する問題