while循环使用(不是)bash

时间:2014-08-27 12:43:40

标签: bash shell

我试图检查输入变量的值。例如,while仅在选项的值为1或2时才存在。

while option not in 1 2
do :
    read -p "Please choose an option" option
done

如何在bash中完成此操作?

[重复] 这不是重复的,因为标记为重复的那个考虑比较两个字符串,而一端没有多个选项。

7 个答案:

答案 0 :(得分:4)

经典的方式是:

while ! { test "$option" = 1 || test "$option" = 2; }; do ...

但更简洁的方法是使用案例陈述:

while :; do
  case "$option" in 
    1|2) break ;;
    *) ... ;;
  esac
done

答案 1 :(得分:2)

使用select内置:

$ cat select.sh
#!/bin/bash

options=("Option 1" "Option 2")

echo "Please choose an option:"
select option in "${options[@]}"; do
        [ -n "${option}" ] && break
done
echo "You picked: ${option}"

$ ./select.sh
Please choose an option:
1) Option 1
2) Option 2
#? 3
#? xyz
#? 2
You picked: Option 2

答案 2 :(得分:2)

bash中,您可以使用模式匹配来测试$option

while [[ $option != [12] ]]; do
    read -p "Please choose an option: " option
done

答案 3 :(得分:1)

我做了类似的事情:

#!/bin/bash

while : ; do
    echo "Please choose an option"
    read val
    [[ $val != 1 && $val != 2 ]] || break
done

答案 4 :(得分:1)

或者,如果您打算评估更多选项,请使用大小写:

#!/bin/bash

while true; do
  read -p "Please choose an option" option

  case "$option" in
    [12]) break
          ;;
    *)    echo "whatever"
  esac
done

答案 5 :(得分:0)

您可以使用while列表构建和{...}来使用此shell globbing条件:

option=0

while [[ $(echo {1,2}) != *"$option"* ]]; do
    read -p "Please choose an option: " option
done

答案 6 :(得分:0)

我认为这是最常见的方式

while [[ "$option" -ne 1 ]]  || [[ "$option" -ne 2 ]]; do
          read -p "Please choose an option" option
done