【问题标题】:Iterating through argument list using for loop in shell script?在shell脚本中使用for循环遍历参数列表?
【发布时间】:2012-04-08 07:13:53
【问题描述】:

我想显示通过参数提供给我的 shell 脚本的文件的内容。我需要使用正常的“for (())”循环而不是“for x in arr”循环来执行此操作。

这是我的代码。我应该如何为该 cat 命令正确输入文件名?

for (( i=1;$i<=$#;i=$i+2 ))
do
    cat '$'$i   #display the contents of the file currently being traversed
done

【问题讨论】:

  • “for(())”在什么情况下是正常的?使用另一种形式更为常见。

标签: linux shell scripting parameters cat


【解决方案1】:

你可以使用类似的东西:

for (( i=1;$i<=$#;i=$i+1 ))
do
    cat ${!i}  #display the contents of the file currently being traversed
done

相应的手册部分:

如果参数的第一个字符是感叹号,则级别 引入了变量间接法。 Bash 使用 由参数的其余部分形成的变量作为 多变的;然后扩展此变量,并将该值用于 其余的替换,而不是参数本身的值。 这称为间接扩展。例外情况是 ${!prefix*} 和 ${!name[@]} 的扩展如下所述。这 感叹号必须紧跟左大括号,以便 引入间接性。

【讨论】:

    【解决方案2】:

    for 循环的正常行为是遍历参数。遍历所有参数:

    #!/bin/sh -e
    for x; do cat $x; done
    

    您可以稍微修改一下,只对其他所有参数进行操作,就像您在示例中所做的那样,以多种不同的方式进行操作。一种可能性是:

    for x; do expr $(( i++ )) % 2 > /dev/null || cat "$x"; done
    

    如果你坚持使用非标准形式,你可以使用 ${!var} bashism,它在绝大多数 shell 中都会失败,或者你可以使用eval

    for (( i = 1; i <= $#; i += 2 ))
    do
        eval cat '"$'$i\"
    done
    

    【讨论】:

      猜你喜欢
      • 2016-02-02
      • 2019-09-07
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2016-04-14
      相关资源
      最近更新 更多