检查菜单中的无效输入

时间:2018-02-27 20:00:15

标签: bash shell ubuntu

我正在创建一个脚本,用户选择一个数字1-5,它将循环直到用户输入5.我不想使用exit命令。我想检查以确保用户除了输入无效输入之外没有输入任何内容。

任何帮助将不胜感激

#!/bin/bash
  PS3='Please enter your choice: '
options=("1.Move empty files" "2.Check file size" "3.Which files is newer" "4.File check rwx" select opt in "${options[@]}")


 while($opt != 5); do
   case $opt in

        "Option 1")
          echo "you chose choice 1"
          ;;
        "Option 2")
          echo "you chose choice 2"
          ;;

        "Option 3")


     echo "you chose choice 3"
    ;;
 "Option 4")
  echo "you chose choice 3"
               ;;
          "Option 5")
           break
           ;;
   ) echo invalid input;;

1 个答案:

答案 0 :(得分:0)

你好像很困惑。我甚至不知道从哪里开始纠正你对这是如何工作的任何误解

在原始代码中,您设置options的方式不太可能有用。

options=("1.Move empty files" "2.Check file size" "3.Which files is newer" "4.File check rwx" select opt in "${options[@]}"
printf '%s\n' "${options[@]}"

这会发出

1.Move empty files
2.Check file size
3.Which files is newer
4.File check rwx
select
opt
in

select命令不会被执行。

这是你想要的东西。

options=(
    'Move empty files'
    'Check file size'
    'Which file is newer'
    'File check rwx'
)

PS3='Please enter your choice: '
select opt in "${options[@]}" ; do
    [[ -n $opt ]] && break || {
        echo "invalid input"
    }
done
echo "user chose '$opt'"

您可以使用whilecase解决方案并获得几乎相同的结果,例如:

options=(
    'Move empty files'
    'Check file size'
    'Which file is newer'
    'File check rwx'
)

for (( i=0 ; i < ${#options[@]} ; i++ )) ; do
    printf '%d) %s\n' $((i+1)) "${options[$i]}"
done
while true ; do
    read -p 'Please enter your choice: ' opt
    case "$opt" in
        [1-5])
            opt="${options[$opt]}"
            break
        ;;
        *)
            echo "invalid input"
        ;;
    esac
done

echo "user chose '$opt'"

但您不需要两者,正如您所看到的,使用select要简单得多。