2016-02-08 50 views
2

我試着用簡單的菜單使用內建select語句回答another SO question。該代碼/etc/passwd顯示名稱,讓您可以通過給出了一些選擇名稱:爲什麼我的菜單第一次失敗?

PS3="Enter a number: " 
select name in $(cut -d: -f1 /etc/passwd) ; do 
    if [ -n "${name}" ]; then 
     break 
    fi 
    echo "Sorry, please enter a number as shown." 
done 
echo "Entry from passwd is: ${name}" 

的作品除了第一次罰款。當你第一次給出正確答案時,它會要求你再試一次。
我試圖得到第一次更詳細的解釋,但我無法得到一個可重現的廚師書。當你將這些代碼複製粘貼到你的服務器上,並給出正確的答案時,你可能會遇到同樣的問題。當您重複命令(從歷史記錄或新的粘貼)時,代碼現在顯示問題。我試圖通過註銷並登錄(有時可用)或重新啓動來再次解決問題。
我嘗試不同的方式來重現在其他情況下的問題(使用不同的變量名,解封變量,使用值的緩慢清單,select name in $(echo One; sleep 1; echo Two; sleep 2; echo Three; sleep 1);並打開一個新的外殼。

我搜索了其他的例子有select,但我。無法找到其他職位的線索像https://stackoverflow.com/a/16750755/3220113https://askubuntu.com/a/1716

我試圖解決我的代碼同步,這似乎是一個解決方法:

PS3="Enter a number: " 
select name in $(cut -d: -f1 /etc/passwd) ; do 
    # is sync needed here? 
    sync 
    if [ -n "${name}" ]; then 
     break 
    fi 
    echo "Sorry, please enter a number as shown." 
done 
echo "Entry from passwd is: ${name}" 

我無法重現電子當我包含同步命令時出錯。同步確實是一個工作補丁,爲什麼我需要在這裏?

我不需要其他方法來編寫菜單。我已經找到了圖形對話框Dialog from bash script,並且正在尋找我自己過於複雜的https://unix.stackexchange.com/a/115371/57293的簡單替換。

+0

'sync'用於刷新緩衝區到文件,它與shell變量無關。 – Barmar

+0

我無法重現該問題。它對我來說是第一次。 http://ideone.com/ogpver – Barmar

+0

好的,我可以通過將命令粘貼到交互式shell中來重現它,而不是在腳本中運行它們。 – Barmar

回答

2

僅當您以交互方式鍵入命令而不是在腳本中時,纔會出現此問題。原因是您在select行之後鍵入的行被用作對提示的響應。由於if不在菜單中,因此會報告錯誤。然後它不會執行if命令,因爲它被讀爲對提示的響應。

這不是腳本中的問題,因爲腳本中的命令不被用作標準輸入。

+0

粘貼是魔法字。而不是在$(cut -d:-f1/etc/passwd)中粘貼'select name';做2;如果[-n「$ {name}」];然後打破;網絡連接;回聲「對不起,請輸入一個數字,如圖所示。」;完成;回聲「來自passwd的輸入是:$ {name}」'但帶有換行符。 '2'試圖粘貼2作爲答案,但首先選擇讀取輸入,而不是bash報告2不是命令。 –

相關問題