为什么不在bash中打印所有传递的参数?
function abc() {
echo "$1" #prints the correct argument
for x in `seq 1 $#`; do
echo "$x" #doesn't print the 1st, 2nd, etc arguments, but instead 1, 2, ..
done
}
正在打印
1
2
3
4
...
代替。
答案 0 :(得分:6)
我只会为其他人提供更多选项。最接近你试图写这个的方法是使用bash间接扩展:
function abc() {
for x in `seq 1 $#`; do
echo "${!x}" # the ! adds a level of indirection
done
}
...如果你只想对某些参数进行操作,另一个选择就是使用$ @进行数组切片:
function def() {
for arg in "${@:2:3}"; do # arguments 2 through 4 (i.e. 3 args starting at number 2)
echo "$arg"
done
}
类似地,"${@:2}"
将为您提供从数字2开始的所有参数,"${@:$start:$((end-start+1))}"
将为您提供参数$ start from $ end($((
表达式计算$之间的参数数量开始和$结束)等...
答案 1 :(得分:2)
seq
命令返回从开始到结束的所有数字。你在这里打电话的是seq 1 <number_of_arguments_to_abc>
。例如,如果您调用abc alpha beta gamma
,则参数将为seq 1 3
,因此您将获得数字1,2和3。
如果您希望参数改为abc,则表达式为for x in "$@"
。
答案 2 :(得分:2)
如果要打印所有参数,请尝试此
function abc() {
for arg in $@; do
echo "$arg"
done
}
答案 3 :(得分:1)
实际上这种情况有一个特殊的缺点:
function abc() {
for arg ; do
echo "$arg"
done
}
也就是说,如果省略in ...
部分,arg
将遍历函数的参数$@
。
顺便说一下,如果函数外部有for arg ; ...
,它将遍历命令行中给出的参数。
答案 4 :(得分:1)
您应该使用其他人展示的for arg
表单。但是,要解决您的问题和评论中的一些内容,请参阅以下内容:
在Bash中,没有必要使用seq
。您可以使用C风格的for
循环:
for ((i = 2; i <= $#; i++))
do
echo "${@:i:1}"
done
其中演示了数组切片,这是除了直接迭代(for arg
)或使用shift
之外您可以使用的另一种技术。
使用for
版本的一个优点是参数数组保持不变,而shift修改它。此外,对于带有数组切片的C风格表单,您可以跳过任何您喜欢的参数。这通常不会在下面显示的范围内完成,因为它依赖于遵循严格模式的参数。
for ((i = 2; i < $# - 2; i+=2))
这一点疯狂将从第二个参数开始,每隔一个参数处理一次并在最后两个或三个之前停止(取决于$#
是奇数还是偶数)。
答案 5 :(得分:0)
变量 X 包含文字数字。您正在尝试间接 - 替换 $ 1 ,其中 $ x 。间接扭曲了大脑。 $ @ 提供了一种更简单的循环参数机制 - 不会对您的心灵造成任何负面影响。
for x in "$@"; do
echo $x
done
有关 $ @ 的详细信息,请参阅the bash man page。