【问题标题】:bash for loop in function with passing parameters带有传递参数的函数中的bash for循环
【发布时间】:2020-08-12 04:37:33
【问题描述】:

我是 bash 新手,找不到任何合适的答案,希望你们能帮助我。对不起,如果我的问题的答案太明显了。

我想创建一个参数数量可变的函数,应该用 for 循环打印出来。 传递的参数是可打印的字符串。输出应该是“for 循环”的编号,从 1 开始,然后是传递的参数。我找不到解决办法说:打印迭代次数,然后在迭代位置打印函数参数。

我总是收到错误:无效号码

请原谅我的困惑。谢谢

应该是这样的

SOME TEXT

1: String1
2: String2
3: String3
func()  {
 echo -e "SOME TEXT"

        for i in "$@"; do
            printf  '%d: %s\n' "$i" "$@"   # I also tried "${i[@]}"
        done

}

func String1 String2 String3


【问题讨论】:

    标签: bash function loops parameters format-specifiers


    【解决方案1】:
    func() {
        echo -e "SOME TEXT"
        for ((i=1; i<=$#; i++)); do
            eval str=\$$i
            printf '%d: %s %s\n' "$i" "$str" "${!i}"
        done
    }
    

    使用间接引用来访问变量。 str 是旧方式,${!i} 是较新的速记方式。

    【讨论】:

    • func a b c: bash: printf: a: 无效号码。
    • 您好 John3136,感谢您的回答,遗憾的是它不适用于我的代码,我仍然收到错误消息:对于每个传递的参数,数字无效。我会更喜欢你的方式,因为循环参数更容易阅读。谢谢
    • 有一个错字 - 打印中的最后一个 %s 是一个 %d - 可能解释一个无效的数字...
    【解决方案2】:

    在您的代码中,$i 将是传递给函数的每个参数。这不能根据printf 转换为数字,所以它会抱怨。 那是因为$@ 是传递给函数的所有参数的列表。在您的情况下,$@ 包含元素 String1、String2 和 String3。

    这就是你的意思:

    func(){
        echo -e "SOME TEXT"
        i=0
        for arg in "$@"; do
            i=$((i+1))
            printf '%d: %s\n' "$i" "$arg"
        done
    }
    func String1 String2 String3
    

    【讨论】:

      猜你喜欢
      • 2020-04-19
      • 1970-01-01
      • 2020-04-16
      • 2018-05-24
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      相关资源
      最近更新 更多