如果否则将num1与num2或num3比较的结果不正确

时间:2018-11-08 15:20:28

标签: bash if-statement scripting compare

我是bash脚本的新手,需要帮助。

我编写的脚本需要比较用户输入(045、046、287或279的固定选项)。具有其他价值。

当用户输入045或046时,if语句为true并应显示

您已选择$ SID。将使用菜单1

如果用户输入287或279,则该语句需要为false并显示

您已选择$ SID。将使用菜单2

$ SID是上面给出的用户输入。

  if [ "$SID" == "046" -o "045" ] ; then
        printf "You have choosen $SID. Menu 1 will be used" 
        else 
        printf "You have choosen $SID. Menu 2 will be used"
  fi

但是在运行脚本时,它始终显示true语句,并在$ SID位置显示用户输入。

You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used
You have choosen 287. Menu 1 will be used
You have choosen 279. Menu 1 will be used

我希望这是

使用045或046时:

You have choosen 045. Menu 1 will be used
You have choosen 046. Menu 1 will be used

使用279或287时:

You have choosen 287. Menu 2 will be used
You have choosen 279. Menu 2 will be used

我还尝试了以下if语句,但没有结果:

  if [ $SID -eq 046 -o 045 ] ; then

  if [ "$SID" -eq "046" -o "045" ] ; then

  if [ $SID = 046 -o 045 ] ; then

  if [ "$SID" = "046" -o "045" ] ; then

我想念什么?

1 个答案:

答案 0 :(得分:3)

-o连接表达式,而不是单个表达式中的多个值。

if [ "$SID" = 046 -o "$SID" = 045 ] ; then

但是,-o本身不应该使用;它被认为已过时,并且不能保证由POSIX兼容的shell支持。使用||来代替连接两个单独的[命令。

if [ "$SID" = 046 ] || [ "$SID" = 045 ] ; then

case语句可能更简洁:

case $SID in
  045|046) printf 'You have chosen %s. Menu 1 will be used\n' "$SID" ;;
  *)       printf 'You have chosen %s. Menu 2 will be used\n' "$SID" ;;
esac

这将立即建议(通过使用空格来突出显示)重构

case $SID in
  045|046) menu=1 ;;
  *) menu=2 ;;
esac

printf 'You have chosen %s. Menu %s will be used\n' "$SID" "$menu"

鉴于您实际上是在使用bash,因此您可以选择使用[[命令而不是[,它允许case样式的模式匹配:

if [[ $SID = 04[56] ]]; then