2015-05-12 41 views
0

我目前正在學習Linux和作爲一個家庭作業,我們需要創建一些基本的shell腳本不能正常工作。沒有什麼特別複雜的,但這個讓我頭疼。這裏是我的代碼:Until循環如預期

until [ "$toPrint" == 'fin' ] 
    do 
    echo "Enter file name to print out :" ; read toPrint 
    sh ./afficher.sh "$toPrint" 
    done 

基本上,我有叫afficher.sh另一個腳本(我是法國人,所以不要介意用法語)和讀取任何文件名它會作爲一個參數。然而,當我輸入「fin」時,除非它仍然試圖打印名爲「fin」的文件,否則應該停止一切。我讀了一點關於直到在互聯網上,一旦它成爲真正的循環,應立即停止,這不是我的情況......

+1

FYI,''==不是由POSIX標準保證內部'[]'工作。使用'='進行字符串比較以與所有POSIX shell兼容。 –

+0

看操作的順序 - 你讀,然後運行該腳本,然後你回去到循環的頂部,並檢查退出條件。您不會檢查讀取值和運行腳本之間的退出條件,因此當然不會立即退出。 –

回答

1

就個人而言,我會實現這個像這樣 - 用while循環,而不是一個until循環,並分別並明確檢查的退出條件:

while true; do 
    echo "Enter file name to print out :" ; read toPrint 
    [ "$toPrint" = fin ] && break 
    sh ./afficher.sh "$toPrint" 
done 

如果你真的想使用循環的情況下,你可以這樣做:

while echo "Enter file name to print out :"; 
     read toPrint && 
     [ "$toPrint" != fin ]; do 
    sh ./afficher.sh "$toPrint" 
done 

...但就個人而言,我對審美的理由不太喜歡這種方式。

+0

所以基本上,我必須測試循環中的條件並使用break如果爲真? – ATragicEnding

+0

我不會說「得到」。還有其他方法,但這是最短和最簡單的。 –

+0

我已經添加了一個這樣的其他(更糟糕的)方法的例子。 –

1

您在循環頂部檢查車況,但你在輸入值循環的中間。你做的下一件事讀取值後,一直把它傳遞給afficher.sh,然後一旦做到這一點,你檢查它的值,看看是否應該停止。如果你不想在fin值運行afficher.sh,你需要確保你的控制流允許您在調用afficher.sh之前做比較。