函数参数和bash中的循环问题

时间:2010-09-28 11:53:17

标签: bash

为什么不在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
...

代替。

6 个答案:

答案 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