while 循环中的多个条件由于 Bash 中的输入类型或需要 3 位数字条件而失败



我正在尝试控制用户对脚本的输入,以便只能传递 3 位数字。我从两个if开始,这些工作正常。

echo -e "Input sequence number:"
read SEQUENCE
NUMTEST='^[0-9]+$'
if ! [[ $SEQUENCE =~ $NUMTEST ]]; then
echo "ERROR:" "$SEQUENCE" "is not a number! Try again!"
exit 1
fi
SEQLEN=$(printf "%s" "$SEQUENCE" | wc -c)  
if (($SEQLEN != 3)); then
echo "ERROR:" "$SEQUENCE" "is not a 3 digit number! Try again!"
exit 1
fi

更好的解决方案是使用 while 循环,这样用户就不必继续重新运行脚本,但是虽然我可以为每个单独的条件提供一个 while 循环来工作,但当我将它们组合在一起时,文本输入会杀死循环,因为数字条件不喜欢它。

echo -e "Input sequence number:"
read SEQUENCE
NUMTEST='^[0-9]+$'
SEQLEN=$(printf "%s" "$SEQUENCE" | wc -c)
while ! [[ $SEQUENCE =~ $NUMTEST ]] && (($SEQLEN != 3)); do
echo "ERROR:" "$SEQUENCE" "is not a 3 digit number! Try again!"
echo -e "Input sequence number:"
read SEQUENCE    
SEQLEN=$(printf "%s" "$SEQUENCE" | wc -c)
done

我在想要么我需要创建一个 == 3 位数字$SEQUENCE条件,要么找到一种方法来抑制错误,以便任何错误都意味着循环继续。

明确地说,我的问题是:

  • 有没有办法写条件$SEQUENCE== 3位数字?
  • 我可以抑制错误并仍然进入循环,还是脚本终止错误?

非常感谢建议和改进。这是我的第一个脚本,所以如果我犯了一些糟糕的做法,我不会感到惊讶,所以任何其他建议都值得赞赏。

没有办法写条件$SEQUENCE== 3位数字?

是的。将您的正则表达式更改为^[0-9]{3}

使用一个小技巧,您还可以删除重复的输入处理:

while true; do
read -p 'Input sequence number: ' sequence
[[ "$sequence" =~ ^[0-9]{3}$ ]] && break
echo "ERROR: '$sequence' is not a 3 digit number!"
done

你不是说:

while ! [[ $SEQUENCE =~ $NUMTEST ]] || (($SEQLEN != 3)); do

当不是数字或不是三位数字时,您需要再次循环(这与构造不同,在构造中,当不是数字且长度不是三时,您需要循环(。

此外,您可以创建一个正则表达式来计算三位数字,如 @Socowi 的答案中所述。

最新更新