「echo」の代わりに「printf '%s \ n'」ステートメントを使用するのはなぜですか?私はシェルスクリプトが初めてなので、理解するのに役立ちます。

「echo」の代わりに「printf '%s \ n'」ステートメントを使用するのはなぜですか?私はシェルスクリプトが初めてなので、理解するのに役立ちます。
secondLarge=`printf '%s\n' "${array[@]}" | sort -n | tail -2 | head -1`

2番目に大きな数字を取得しようとすると取得しますが、取得しようとするとecho取得できません。理解するのに役立ちます

secondLarge=`echo "${array[@]}" | sort -n | tail -2 | head -1`

答え1

GNUバージョンprintf(通常はインストールされている/usr/bin/printf)と同じ名前のBash組み込みバージョンは、すべて%フォーマット文字列で-expandosよりも多くの引数を渡すとループのように動作します。

一方:

declare -a array=( a b c )

それから:

printf '%s\n' "${array[@]}"

以下と多少同じです。

for x in "${array[@]}"
do
    echo $x
done

上記の両方とも、次のような結果を生成します。

a
b
c

比較してみると:

echo "${array[@]}"

次を生成します。

a b c

パイプラインは出力をソートし、2番目から最後の行を取得します。例では、printf配列の各要素が独自の行に印刷されるため、配列内の2番目に大きい数値が表示されます。を使用すると、echo処理する行が1つしかないため、すべての配列値を含む行を1つ取得します。

関連情報