【问题标题】:How to output every argument of a Bash function?如何输出 Bash 函数的每个参数?
【发布时间】:2017-05-26 02:44:11
【问题描述】:

我想一一输出函数的所有参数。
该函数可以接收许多参数,$# 是参数的长度。

showArg(){
    num=$#
    for order in `seq 1 ${num}`
    do
        echo $order
    done
}

执行它。

showArg  x1 x2 x3 
1
2
3

如何修复 echo 语句 echo $order 以获得如下输出?

x1
x2
x3

我试过echo $$order

在for循环中用“$@”调用每个参数都可以列出来,但这不是我期望的方式。

showArg(){
    for var in "$@"
    do
        echo "$var"
    done
}

【问题讨论】:

    标签: bash function arguments


    【解决方案1】:

    你可以使用间接:

    showArg() {
      num=$#
      for order in $(seq 1 ${num}); do # `$(...)` is better than backticks
        echo "${!order}"               # indirection
      done
    }
    

    使用 C 风格的循环(如 @chepner 和 @CharlesDuffy 建议的那样),上面的代码可以重写为:

    showArg() {
      for ((argnum = 1; argnum <= $#; argnum++)); do
        echo "${!argnum}"
      done
    }
    

    但是 Bash 提供了一种更方便的方法 - 使用 "$@"

    showArgs() {
      for arg in "$@"; do  # can also be written as: for arg; do
        echo "$arg"        # or, better: printf '%s\n' "$arg"
      done
    }
    

    另见:

    【讨论】:

    • 不要使用seq;使用 C 风格的 for 循环。
    • 第一个循环只是对 OP 原始代码的更正。我保留了循环格式,因为 OP 可能有意将更多逻辑放入其中,而不仅仅是打印。
    • @codeforester,当然,但你不需要seqfor ((order=1; order&lt;=num; order++)); do ...
    • 嗯。可能实际上想要展示printf 'argument %d is %q\n' "$argnum" "${!argnum}" 或类似的东西——这样你就可以以eval-安全的方式打印文本,使隐藏的字符(尾随的DOS换行符等)可见。
    【解决方案2】:

    您不需要显式循环:

    printf '%s\n' "$@"
    

    【讨论】:

      【解决方案3】:

      通常,使用“$*”来表示所有参数更容易,所以:

      #!/bin/bash
      
      for arg in $*
      do
          echo $arg
      done
      

      事实上,这是'for'循环的默认行为,所以in可以省略:

      #!/bin/bash
      
      for arg
      do
          echo $arg
      done
      

      如果你真的想使用序列号,你可以使用感叹号语法,它使用提供的变量的值作为名称,所以:

      #!/bin/bash
      
      num=$#
      for order in $(seq 1 ${num})
      do
          echo ${!order}
      done
      

      【讨论】:

      • 使用$* 不是 for 的默认值。
      • 尝试使用以下参数列表运行任何测试脚本,以观察先前评论者直接指出的一些问题:./yourscript "*" "hello world" $'goodbye\t\tworld'
      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多