2

ディレクトリ内のすべてのファイルを実行するために、myscript.sh を再帰的に実行したいと思います。

ここで、次のようにできることが議論されています。

#!/bin/bash

for file in * ; do
    echo $file
done

しかし、実行する特定のファイルタイプのみを選択できるように、myscript.sh を次の構文で実行したいと考えています。

./myscript.sh *.dat

したがって、上記のスクリプトを次のように変更します。

#!/bin/bash

for file in $1 ; do
    echo $file
done

実行時に、拡張子が *.dat のすべてのファイルではなく、最初に出現したファイルのみが実行されます。

ここで何が問題なのですか?

4

3 に答える 3

6

ワイルドカードは、スクリプトが認識する前にシェル*.datによって展開されます。したがって、ファイル名は、、、などとしてスクリプトに表示されます。$1$2$3

$@特別な変数を使用して、それらすべてを一度に操作できます。

for file in "$@"; do
    echo $file
done

"$@"前後の二重引用符は特別なものであることに注意してください。からman bash:

@ 1 から始まる定位置パラメーターに展開されます。拡張時
   が二重引用符で囲まれている場合、各パラメーターは個別の単語に展開されます。それか
   つまり、「$@」は「$1」「$2」と同等です...二重引用符で囲まれた展開が発生した場合
   単語内では、最初のパラメーターの展開が begin-
   元の単語の ning 部分であり、最後のパラメーターの展開は次のとおりです。
   元の単語の最後の部分に結合します。位置指定がない場合
   パラメータ、"$@" および $@ は何も展開されません (つまり、それらは削除されます)。
于 2012-07-16T21:29:17.340 に答える
-2

あなたはちょうどで同じことを行うことができます:ls *.dat | xargs echo

于 2012-07-16T21:30:30.287 に答える
-2

次のように、* の実際の内容を取得する必要があります。

for file in $* ; do
 echo $file 
done
于 2012-07-16T21:33:44.170 に答える