如何在Bash脚本中对参数进行迭代

我有一个复杂的命令,我想把它做成一个shell/bash脚本。 我可以很容易地用"$1 "来写它。

foo $1 args -o $1.ext

我希望能够向脚本传递多个输入名称。正确的方法是什么?

当然,我还想处理含有空格的文件名。

解决办法

使用"$@"来表示所有的参数。

for var in "$@"
do
    echo "$var"
done

这将遍历每个参数,并在单独一行中打印出来。 $@的行为与$*类似,只是在引用时,如果参数中存在空格,则会被正确分割开。

sh test.sh 1 2 '3 4'
1
2
3 4
评论(7)

重写现已删除的答案,作者是VonC

评论(1)

请注意,Robert的答案是正确的,它在sh中也能工作。 你可以(可移植地)进一步简化它。

for i in "$@"

相当于。

for i

即,你不需要任何东西!

测试($是命令提示)。

$ set a b "spaces here" d
$ for i; do echo "$i"; done
a
b
spaces here
d
$ for i in "$@"; do echo "$i"; done
a
b
spaces here
d

我第一次在Kernighan和Pike的《Unix编程环境》*中读到这个内容。

bash中,help for记录了这一点。

for NAME [in WORDS ... ; ] do COMMANDS; done.

如果'in WORDS ...;'不存在,则假定'in "$@"'

评论(10)