我写了下面的代码,但它不适用于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
答案 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 Y
和not 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"
。