我有一个复杂的命令,我想把它做成一个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
重写现已删除的答案,作者是VonC。
请注意,Robert的答案是正确的,它在sh中也能工作。 你可以(可移植地)进一步简化它。
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记录了这一点。
bash
help for
for NAME [in WORDS ... ; ] do COMMANDS; done. 如果'in WORDS ...;'不存在,则假定'in "$@"'。
for NAME [in WORDS ... ; ] do COMMANDS; done.
for NAME [in WORDS ... ; ] do COMMANDS; done
如果'in WORDS ...;'不存在,则假定'in "$@"'。
'in WORDS ...;'
'in "$@"'
使用
"$@"
来表示所有的参数。这将遍历每个参数,并在单独一行中打印出来。 $@的行为与$*类似,只是在引用时,如果参数中存在空格,则会被正确分割开。
重写现已删除的答案,作者是VonC。
请注意,Robert的答案是正确的,它在
sh
中也能工作。 你可以(可移植地)进一步简化它。相当于。
即,你不需要任何东西!
测试(
$
是命令提示)。我第一次在Kernighan和Pike的《Unix编程环境》*中读到这个内容。
在
bash
中,help for
记录了这一点。