2

我想显示通过参数提供给我的 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
4

2 回答 2

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
于 2012-04-08T07:54:35.517 回答
2

你可以使用类似的东西:

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

相应的手册部分:

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

于 2012-04-08T07:23:41.927 回答