この bash スクリプトが動作しないのはなぜですか?

この bash スクリプトが動作しないのはなぜですか?

次のコマンドを実行すると

./command *

このスクリプトを使用する

#!/bin/bash

for f in ./$1
do
    echo $f
done

$1 で指定された最初のファイルのみがエコーされます。なぜでしょうか?

答え1

コマンドを実行するときに単純引用符または二重引用符を使用しなかったためです:

./command '*'

または:

./command "*"

または、確実に を使用したい場合は./command *、スクリプトに次の変更を加えます。

#!/bin/bash

for f in ./"$@"
do
    echo $f
done

これは、$1がコマンドの最初の引数を参照し、 が$@コマンドのすべての引数を参照するためです。

この意味でのいくつかのドキュメントも読んでみてください:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF

答え2

シェルは*コマンドを実行すると を展開します。したがって、スクリプトを実行すると、

./command file1.txt file2.txt file3.txt

$1最初の引数に対応するため、ループには 1 回の反復のみが含まれます。

答え3

$1は最初の引数のみを参照します。 を使用する必要があります$*

#!/bin/bash

for f in $*
do
     echo $f
done

関連情報