Bourne シェルの printf が %s 引数を反復処理するのはなぜですか?
質問
何が起きてる?
printf.sh:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" $NAME
コマンドラインセッション:
$ ./printf.sh
Hello, George
Hello, W.
Hello, Bush
アップデート: printf "Hello, %s\n" "$NAME"
動作します。使わない理由としては echo
, 、 考慮する
エコー.sh:
#! /bin/sh
FILE="C:\tmp"
echo "Filename: $FILE"
コマンドライン:
$ ./echo.sh
Filename: C: mp
の POSIX仕様 echo
「新しいアプリケーションを使用することをお勧めします。」 printf
の代わりに echo
」(これと他の理由から)。
解決
NAME 変数は次のように置き換えられます。
printf "Hello, %s\n" George W. Bush
これを使って:
#! /bin/sh
NAME="George W. Bush"
printf "Hello, %s\n" "$NAME"
他のヒント
printf を使用する特別な理由はありますか、それとも echo も同様に機能しますか?
NAME="George W. Bush"
echo "Hello, "$NAME
結果として
Hello, George W. Bush
編集:それが「ジョージ W.Bush」は、ボーン シェルがスペースで区切られているためです。printf を使い続けるには、$NAME を二重引用符で囲む必要があります
printf "Hello, %s\n" "$NAME"
私の解釈の仕方としては、 マニュアルページ 渡された文字列を引数として考慮するかどうか。文字列にスペースが含まれている場合、複数の引数を渡していると見なされます。ColinYounger は変数を引用符で囲み、シェルに文字列を単一の引数として解釈させるという点で正しいと思います。
別の方法として、printf に変数を展開させることもできます。
printf "Hello, $NAME."
リンクは bash 用ですが、同じことが sh にも当てはまると確信しています。
これらの単語をすべて単独で出力したい場合は、次を使用します。 印刷する の代わりに プリントフ
プリントフ は書式指定を受け取り、それを渡す各引数に適用します。3 つの引数 {George, W., Bush} があるため、異なる引数を使用して文字列を 3 回出力します。
所属していません StackOverflow