2011-07-29 65 views
9

我試圖對來自cat命令的每一行執行一個命令。我基於我從供應商處獲得的示例代碼。在bash腳本循環中輸出cat語句的輸出

這裏的腳本:

for tbl in 'cat /tmp/tables' 
do 
    echo $tbl 
done 

所以我期待的輸出爲文件中的每一行。相反,我得到這個:

cat 
/tmp/tables 

這顯然不是我想要的。

我打算用與數據庫接口的實際命令替換回顯。

任何幫助矯直這將不勝感激。

回答

14

您使用的是錯誤的引號類型。

您需要使用反引號而不是單引號使參數成爲程序運行並將內容導出到forloop。

for tbl in `cat /tmp/tables` 
do 
    echo "$tbl" 
done 

也爲更好的可讀性(如果你使用bash),你可以把它寫成

for tbl in $(cat /tmp/tables) 
do 
    echo "$tbl" 
done 

如果你的期望是讓每個線(for循環上述會給你每個字),那麼你可能會關閉使用xargs更好,這樣

cat /tmp/tables | xargs -L1 echo 

或作爲循環

cat /tmp/tables | while read line; do echo "$line"; done 
+1

做在bash很多分析的,我知道這是愚蠢的東西是這樣的。謝謝。 – geoffrobinson

2

單引號應該是反引號:

for tbl in `cat /etc/tables` 

雖然,這不會得到由線你輸入/輸出,而是由詞。爲了處理一行行,你應該嘗試這樣的:

cat /etc/tables | while read line 
    echo $line 
done 
3

隨着循環:

while read line 
do 
echo "$line" 
done < "file" 
2
while IFS= read -r tbl; do echo "$tbl" ; done < /etc/tables 

閱讀this

0

您可以通過重新定義IFS(輸入字段分隔符),例如

IFS='\t\n' 
for tbl in `cat /tmp/tables` 
do 
    echo "$tbl" 
done 
+0

'\ t \ n'?你真的用bash試過嗎?它會分裂爲'\','t','n',毫無幫助。 – kubanczyk