在 bash 脚本中使用 $1 循环遍历 * 文件

在 bash 脚本中使用 $1 循环遍历 * 文件

我正在编写一个脚本,以使用 $1 变量对提供给脚本的文件进行操作。循环浏览这些文件的最佳方法是什么?目前我已经使用类似的东西对脚本进行了硬编码

for file in *.pdf
do 
   act on $file
done

不过我宁愿使用 $1 变量来做到这一点谢谢巴里

答案1

$1只是传递给 shell 脚本的第一个参数。因此,如果你有一个脚本myscript,我这样称呼它:

myscript somefile

那么$1将会是somefile。如果我这样称呼它:

myscript *

并且我当前的目录中恰好有以下文件:

foo bar baz

那么$1将会是foo。无论哪种情况,$1都只有一个值,并且没有任何内容可以循环。

有几种方法可以循环参数。最常见的是:

for file in "$@"; do
  echo doing something with "$file"
done

请注意,这与;$@不同。"$@"后者是一种特殊的构造,可以正确处理包含空格的文件名。您还可以执行以下操作:

while [ -n "$1" ]; do
  echo doing something with "$1"
  shift
done

在这里,该shift命令删除第一个参数,并$2变为$1(依此类推)。只要$1非空,就会循环。您也可以使用$#它(包含命令行参数数量的变量):

while [ $# -gt 0 ]; do
    echo arg: "$1"
    shift
done

答案2

如果你这样做

script *.pdf

*.pdf已经在命令行上展开,并且$1只会引用第一个文件

for file in $1

因此不会做你需要的事情。你可以使用

for file in "$@"

反而。

参见 参考资料 部分特殊参数在里面man bash

相关内容