2016-08-02 21 views
1

我想創建一個腳本,並且在鍵入第一個命令後,我想要被髮送回前一個。#!/ bin/bash如果讀取然後返回讀取

#!/bin/bash 
read -p " Please enter [x ; y ; z]: " COMMAND 
if [ "$COMMAND" = x ] ; then 
    echo " This is command X. " 
#Then return to read -p " Please enter [x ; y ; z]: " COMMAND 

elif [ "$COMMAND" = y ]; then 
    echo " This is command y. " 
#Then return to read -p " Please enter [x ; y ; z]: " COMMAND 

elif [ "$COMMAND" = z ]; then 
    echo " This is command z" 
#Then return to read -p " Please enter [x ; y ; z]: " COMMAND 

else 
    echo " Command not found! " 
fi 

例如,如果您鍵入x,我希望可以在y或z之後鍵入。它可以在同一個腳本中完成?

回答

0

裹你想在一個循環中重複部分,並考慮你將如何從循環退出。這裏,如果輸入qbreak命令將退出循環。否則,在if語句結束後,您將返回到循環的頂部以進行另一輪。

while true; do 
    read -p " Please enter [x ; y ; z; q]: " COMMAND 
    if [ "$COMMAND" = x ] ; then 
     echo " This is command X. "   
    elif [ "$COMMAND" = y ]; then 
     echo " This is command y. "   
    elif [ "$COMMAND" = z ]; then 
     echo " This is command z" 
    elif [ "$COMMAND" = q ]; then 
     break 
    else 
     echo " Command not found! " 
    fi 
done 

您可以通過使用清潔這個了case語句而不是大if聲明。您可以爲每個選項執行多個命令; ;;表示每個特定塊的結束。

while true; do 
    read -p " Please enter [x ; y ; z; q]: " COMMAND 
    case $COMMAND in 
     x) echo "This is command X." 
      ;; 
     y) echo "This is command Y." 
      ;; 
     z) echo "This is command Z." 
      ;; 
     q) break ;; 
    esac 
done 

您還可以代替true命令的一個特定的測試,從而使循環本身可以檢查命令的價值和終止,而不是等待一個明確的break命令。

while [ "$COMMAND" -ne q ]; do 
    read -p " Please enter [x ; y ; z; q]: " COMMAND 
    case $COMMAND in 
     x) echo "This is command X." 
      ;; 
     y) echo "This is command Y." 
      ;; 
     z) echo "This is command Z." 
      ;; 
    esac 
done 
+0

非常感謝! 您的評論對我有幫助。我更喜歡if的第一個選項。 –

0

遞歸函數會使工作變得簡單

#!/bin/bash 
readfun(){ 
read -p " Please enter [x ; y ; z]: " command # Use lowercase names 
[[ "$command" =~ ^[xyz]$ ]] && readfun 
# logical AND ie '&&' terminates the recursion if any character other than x y z is entered 
} 
readfun #starting point for the script 
echo "Command : ${command} not found" 
+0

我不會用遞歸只是在外殼模擬迭代。 – chepner

+1

我非常懷疑'bash'是爲遞歸優化的;最終,你會在堆棧上用完房間。只需使用一個循環。 – chepner

+0

@chepner:我懷疑遞歸調用沒有優化,但我想知道文檔沒有提到這個。 – sjsam

0

只是包裝在一個永無止境的while環整件事:

while true 
do 
    [whatever] 
done 
0

whilecase

#!/bin/bash 
while true 
do 
    read -p " Please enter [x ; y ; z]: " COMMAND 
    case $COMMAND in 
     x) echo " This is command x. " 
      ;; 
     y) echo " This is command y. " 
      ;; 
     z) echo " This is command z. " 
      ;; 
     *) exit 0 
      ;; 
    esac 
done 

在行動:

$ bash test.sh 
Please enter [x ; y ; z]: x 
This is command x. 
Please enter [x ; y ; z]: y 
This is command y. 
Please enter [x ; y ; z]: z 
This is command z. 
Please enter [x ; y ; z]: a 
$ 
相關問題