按y继续,退出任何其他键(Shell脚本)

时间:2014-09-12 13:55:58

标签: shell unix

我写了下面的代码,但它不适用于SPACE,特殊符号等。 我希望我的脚本退出,如果除了Y / y键盘上的任何键被按下。 它应该处理空格键,特殊符号

echo "enter y, any other key to exit "
read input
if [ $input != "Y" -o $input  = "y" ]; then
echo "Exiting"
fi

if [ $input == "Y" -o $input == "y" ]; then
echo "Working"
fi

3 个答案:

答案 0 :(得分:1)

请参阅http://wiki.bash-hackers.org/commands/builtin/read?s[]=read

通常你总是想使用-r标志。 -n 1告诉read只读1个字符。

asksure() {
echo -n "Are you sure (Y/N)? "
while read -r -n 1 -s answer; do
  if [[ $answer = [YyNn] ]]; then
    [[ $answer = [Yy] ]] && retval=0
    [[ $answer = [Nn] ]] && retval=1
    break
  fi
done

echo # just a final linefeed, optics...

return $retval
}

### using it
if asksure; then
  echo "Okay, performing rm -rf / then, master...."
else
  echo "Pfff..."
fi

答案 1 :(得分:1)

首先,您需要引用参数扩展,以确保在拆分单词和删除引号时不会完全删除某些输入。

您使用的操作符错误。无论您输入什么密钥,not Ynot y中的一个都是真的。例如,"Y" != "y"。您想使用and代替or

if [ "$input" != "Y" ] && [ "$input" != "y" ]; then

不再推荐使用布尔运算符-o-a,因为它们的使用可能会产生歧义。请改为使用test||分别加入的单独&&命令。

答案 2 :(得分:0)

您需要在引号中输入$ input,因此语句会正确解析。如果您的回复是空格,则脚本看到的是

if [  != "Y" -o != "y" ]; then

它显然无法正确解析。

使用

if [ "$input" != "Y" -o "$input"  = "y" ]; then

你应该没事。

顺便说一句,如果满足条件,你实际上不会退出。在return行之后添加echo "Exiting"