在shell脚本中使用for循环迭代参数列表?

时间:2012-04-08 07:13:54

标签: linux shell scripting parameters cat

我想通过参数显示提供给我的shell脚本的文件的内容。我需要使用普通的'for(())'循环而不是'for ar in arr'循环。

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

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

相应的手册部分:

  

如果参数的第一个字符是感叹号,则为级别   引入了变量间接。 Bash使用的值   由参数的其余部分形成的变量作为名称   变量;然后展开此变量,并在该变量中使用该值   其余的替换,而不是参数本身的值。   这被称为间接扩张。对此的例外是   下面描述的$ {!prefix *}和$ {!name [@]}的扩展。该   感叹号必须紧跟左支撑以便   介绍间接。

答案 1 :(得分:2)

for循环的正常行为是迭代参数。迭代所有参数:

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

您可以稍微修改它以仅对您的示例中的每个其他参数进行操作,方法有很多种。一种可能性是:

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

如果您坚持使用非标准表单,则可以使用$ {!var}基础,这将在绝大多数shell中失败,或者您可以使用eval

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