循环字符串比较时遇到Bash / Shell问题

时间:2017-07-05 19:17:31

标签: bash shell

我正在学习编写脚本来帮助我的工作,而我只是试着用while循环来解决问题。

如果用户没有回答是或否,我想重复一个问题 目前我使用if条件语句,这很容易,但如果用户没有用y或n回答,它只是退出脚本。

我已经尝试了下面的各种迭代,发现我不能使用-ne,除非它是一个整数,但我似乎无法正确的是字符串比较。

我找到了更好的方法在线完成此操作,但如果我遗漏了一些关于简单while循环的基本内容,那么复制粘贴那些是毫无意义的。

#!/bin/sh

while [ $CONFIRM != "^y"|"^n"] # This is where I'm stuck
do
echo "Please say Yes or No."   # Probably not doing this right either
read CONFIRM                   # Or this
done

if  echo "$CONFIRM" | grep -iq "^n" ; then
echo "Okay, stopping script."
else

#do some cool stuff

fi

赞赏任何建议。

正确答案是......

#!/bin/bash

shopt -s nocasematch

while ! [[ $CONFIRM =~ ^(y|n) ]]
do
echo "Please say Yes or No."
read CONFIRM
done

echo "Success!"

2 个答案:

答案 0 :(得分:1)

您正在将正则表达式与模式匹配混合在一起。

# Regular expression
while ! [[ $confirm =~ ^(y|n) ]]; do

# extended pattern
while [[ $confirm != @(y|n)* ]]; do 

每个人都应该做你想做的事。

read命令将变量的名称作为参数。

read confirm

使用参数扩展会导致read设置名称包含在confirm中的变量的值:

$ confirm=foo
$ read $confirm <<< 3
$ echo "$foo"
3

答案 1 :(得分:0)

尝试这样的事情:

while [[ -z $confirm || ( $confirm != y && $confirm != n ) ]]; do
 read confirm
done