我正在创建一个脚本,用户选择一个数字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;;
答案 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'"
您可以使用while
和case
解决方案并获得几乎相同的结果,例如:
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
要简单得多。