bashスクリプトでawkのエコーが改行を削除するのはなぜですか? [コピー]

bashスクリプトでawkのエコーが改行を削除するのはなぜですか? [コピー]

Bashスクリプトにいくつかのawkコマンドを含めようとしましたが、予期しない動作が発生しました。私が何を逃しているのか手がかりを与えることができますか?

たとえば、次のファイルがあるとしますlist

1
2
3
4

この単純なawkコマンドは目的の操作を実行します。

$ awk -F, '{ print $1 }' list
1
2
3
4

しかし、このコマンドをbashスクリプトに入れると:

#!/bin/bash
echo "list:"
cat $1

echo "list after awk:"
echo `awk -F, '{ print $1 }' $1`

exit 0

私は次のような結果を得ます。

$ ./script list
list:
1
2
3
4
list after awk:
1 2 3 4

awkキャリッジリターン文字がbashスクリプトから神秘的に削除されました。

私はOS XのbashとBSDのzshでこれらの動作を見たことがあります。

どんなアイデアがありますか?

ベストアンサー1

いいえawk、シェルが拡張する方法です。

たとえば、見てみましょう。

$ a="1
> 2
> 3
> 4"

だから私たちは4行以上の変数を作ります。しかし...

$ echo $a
1 2 3 4

では、なぜ一行だけなのか?

$ echo "$a"
1
2
3
4

ああ、いいえ!

だから何かがあります魔法についてecho $a

空白でも同様の魔法を見ることができます。

$ a="1    2    3    4"
$ echo $a
1 2 3 4
$ echo "$a"
1    2    3    4

echoさて、ここは実際に魔法が起こる場所ではありません。これが殻です。ラッパーがない場合、"..."シェルは変数の拡張を試みます。したがって、地球は次のように拡張されます。

$ ls
a  file

$ a="*"
$ echo $a
a file
$ echo "$a"
*

同様に、シェルは戻り値を含む出力を取得して展開し、それを引数として返します。

とにかく...この拡張が発生しないようにするには"..."

しかし、短い例ではそうではありません。必要 echo別言します。ただ電話してくださいawk

おすすめ記事