【问题标题】:Bash if else compare num1 with num2 or num3 does not compare correctlyBash if else 将 num1 与 num2 或 num3 比较不正确
【发布时间】:2019-04-12 03:22:45
【问题描述】:

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

我制作了需要比较用户输入的脚本(固定选择 045、046、287 或 279)。与其他值。

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

您选择了 $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

但在运行脚本时,它总是显示真实的语句,用户输入显示在 $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

我错过了什么?

【问题讨论】:

  • [ "$SID" == "046" -o "$SID" == "045" ] 这是正确的语法
  • 它是(expr) -o (expr),而不是operand operator (operand -o operand);在您的情况下,045 被认为是正确的,因此条件始终为真,因为 x -o true = true
  • 啊!太感谢了!在过去的几天里,我一直在为此头疼。现在完美运行!
  • 请注意,在[ ] 中,您应该使用= 而不是==(bash 可以同时理解这两者,但并非所有其他 shell 都可以;如果您指望 bash,您可以使用[[ ]] 而不是[ ])。另外,请注意=(和==)在此上下文中进行字符串比较,因此如果用户输入“45”,则不等于“045”。在[ ][[ ]] 中,使用-eq 进行数值比较。实际上,“045”在数值上也不等于“45”,因为shell假定以“0”开头的数字是八进制,所以“045”在数值上等于“37”。是的,这很复杂。
  • 最好假设 045 和 046 只是字符串文字,没有任何真正的数字含义。

标签: bash if-statement scripting compare


【解决方案1】:

-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

【讨论】:

  • 在这种情况下你不需要extglob04[56] 是等效的全局模式。
  • 呃。你知道,我觉得我想多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多