私が使用している単純なシェル関数呼び出しと渡したecho
引数printf
を印刷するコマンドがあります。私は以下を見つけました。
echo
印刷出力printf
印刷物なし
ここで何か抜けましたか?
check_host(){
# prints output
echo $1
# does not print the output
printf $1
}
check_host $(hostname)
答え1
表示される関数は、最初の引数を2回印刷します。一度は改行文字を追加し、一度は印刷します。改行文字なし2番目の出力が終わったら。
たとえば、対話型 Bash シェルでは、次のような結果が得られます。
user@foo /tmp$ check_host foo
foo
foouser@foo /tmp$
出力は以下から来ます。printf
はいそこ、同じ行にはありません。
echo
との違いは、要求しないようにすることができます(必要に応じてprintf
改行文字を取得するには、型文字列で明示的に使用する必要があります)。echo
echo -n
printf
printf()
\n
printf
通常、単語の分離の問題を回避するには、これらの変数とコマンドの置き換えを引用する必要があります。ホスト名に問題はないかもしれませんが、値にスペースがある場合は必須です。
だから:
check_host() {
echo "$1"
printf "%s\n" "$1"
}
check_host "$(hostname)"
任意のデータ印刷printf
も上記のフォーマット指定子を介して実行する必要があります%s
。そうしないと、%
データ内のすべてのシンボルが解釈されずに残りますprintf
。
また見なさい:なぜprintfがechoより優れているのですか?