2015-04-20 65 views
1

我想用另一個腳本創建一個shell腳本。 以下是代碼。編寫一個嵌套的shell腳本 - 無法傳遞參數

#!/bin/bash 
count=$# 
cat <<EOF> /tmp/kill_loop.sh 
#!/bin/bash 

while true; 
do 
    for i in "[email protected]" 
    do 
     echo $i 
    done 

done 
EOF 

當我看到kill_loop.sh時,「$ i」爲空。

#!/bin/bash 
while true; 
do 
    for i in "one two three" 
    do 
     echo 

    done 
done 

我想「$ I」在kill_loop.sh文件被打印成這樣,這樣,如果我執行kill_loop.sh,與之呼應的價值「一」,「二」和「三化」

+0

這看起來像一個運動中的「這裏」 -file語法。並不是那麼高效。這裏有一個替代練習:編寫一個函數「foreach」,它執行剩餘的第一個參數。那麼整個練習就變成:「foreach回聲一二三」,更不要說在原始代碼中,即使使用正確的語法,while也是如此;做...永不終止?! –

+0

或者如果這是一個在後臺執行任務的練習,那麼你不需要「he​​re」文件來創建一個「永久」循環?!在一次練習中將兩個學習點混爲一談並不是一種有用的方法。原諒我,如果我不正確地假設這是一個練習 –

回答

3

你的「外層」shell腳本正在解釋$ i,就好像它是它自己的變量之一一樣,它沒有設置,因此它不計算任何東西。嘗試逃脫$使外殼不展開:

echo \$i 
+0

或把它放在單引號 –

+1

單引號不會幫助。作爲here文檔的一部分,'$'實際上在雙引號內。 – chepner

0

這裏是「的foreach」功能:

function foreach 
{ 
    typeset cmd=$1; 
    shift; 
    for arg in "[email protected]"; 
    do 
     $cmd $arg; 
    done 
} 
+0

如果您不打算引用'$ arg',引用''$ @「是什麼意思? –

+0

讓'$ cmd'不加引號也是一個有趣的決定;取決於圍繞如何處理由多個單詞組成的'cmd'(或​​包括外殼間接引用或擴展)所需的語義,引用'cmd'的擴展可能是正確的;使用'read -a'將其讀入數組並對該數組執行引用擴展;或者一路走來使用'eval'(甚至可以使用危險的殼結構)。 –

+0

另外,爲什麼'function'關鍵字?這打破了POSIX sh兼容性......並且到底是什麼? –