次のコマンドを実行すると
./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