2016-08-02 62 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 
$ 
相关问题