我正在编写一个脚本,以使用 $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