我想显示通过参数提供给我的 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
我想显示通过参数提供给我的 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 循环的正常行为是遍历参数。遍历所有参数:
#!/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
你可以使用类似的东西:
for (( i=1;$i<=$#;i=$i+1 ))
do
cat ${!i} #display the contents of the file currently being traversed
done
相应的手册部分:
如果参数的第一个字符是感叹号,则引入了变量间接级别。Bash 使用由其余参数形成的变量的值作为变量的名称;然后扩展此变量,并将该值用于其余的替换,而不是参数本身的值。这称为间接扩展。例外情况是下面描述的 ${!prefix*} 和 ${!name[@]} 的扩展。感叹号必须紧跟左大括号以引入间接性。