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

通配符在您的脚本看到它之前*.datshell扩展。所以文件名在你的脚本中显示为$1, $2, $3, 等等。

您可以使用特殊$@变量一次性使用它们:

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

请注意,周围的双引号"$@"是特殊的。来自man bash

@ 展开为位置参数,从一开始。膨胀的时候
   出现在双引号中,每个参数扩展为一个单独的单词。那
   就是,“$@”等价于“$1”“$2”……如果出现双引号展开
   总之,第一个参数的扩展与开始 -
   原词的 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 回答