2012-04-08 162 views
2

我想通過參數顯示提供給我的shell腳本的文件的內容。我需要使用正常的'for(())'循環而不是'for arr'循環。在shell腳本中使用for循環遍歷參數列表?

這是我的代碼。我應該如何正確地爲該cat命令輸入文件名?

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

「(())」正常的方式是什麼?使用其他形式更爲常見。 – 2012-04-08 07:56:26

回答

2

可以使用類似:

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

相應手冊部分:

如果參數的第一個字符是一個感嘆號,可變間接層 被引入。 Bash使用由參數其餘部分形成的 變量的值作爲 變量的名稱;然後展開此變量,並將該值用於其餘替換中的 ,而不是參數本身的值。 這被稱爲間接擴展。例外情況如下所述的 擴展$ {!prefix *}和$ {!name [@]}。 感嘆號必須緊跟左括號以 介紹間接。

+0

非常感謝! :) – Ivin 2012-04-08 07:25:20

2

for循環的正常行爲是迭代參數。遍歷所有參數:

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

可以修改稍微你在你的例子在許多不同的方式做只對其它的所有參數進行操作。一種可能性是:{!VAR}

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

如果你堅持使用非標準的形式,你可以使用$ bashism將在絕大多數殼的失敗,或者您可以使用eval

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