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
。