【问题标题】:BASH - getting invalid response when using until or while loopBASH - 使用 until 或 while 循环时获得无效响应
【发布时间】:2020-06-05 22:38:14
【问题描述】:

我能够在单独的脚本上创建 if-elif-then-else 代码块并验证工作正常。但是,当我添加 UNTIL 或 WHILE 逻辑时,我得到了无效的响应。如果我使用 手动创建 VALIDATE.txt 文件,我希望得到此响应 = “无效操作”继续”“回滚” 在文件中。请检查我下面的代码

WHILE 脚本

#!/bin/bash
FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
ACTION=`cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt >>/dev/null 2>&1`
while [ ! -f "$FILE" ]
do
  echo "not exist"
  sleep 60
done

  if [ "${ACTION}" = "proceed" ];
    then
      echo "performing proceed"
      rm -rf $FILE
  elif [ "${ACTION}" = "rollback" ];
    then
      echo "performing rollback"
      rm -rf $FILE
  else
      echo "invalid operation"
      rm -rf $FILE
  fi

直到脚本

#!/bin/bash
FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
ACTION=`cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt >>/dev/null 2>&1`
until [ -f "$FILE" ]
do
   echo "not exist"
   sleep 60
done
if [ "${ACTION}" = "proceed" ];
  then
    echo "performing proceed"
    rm -rf $FILE
elif [ "${ACTION}" = "rollback" ];
  then
    echo "performing rollback"
    rm -rf $FILE
else
    echo "invalid operation"
    rm -rf $FILE
fi

我在一个单独的窗口中创建了 VALIDATE.txt 并检查了自己

lagot-pc:BASH-TEST lagot$ echo proceed >> VALIDATE.txt
lagot-pc:BASH-TEST lagot$ pwd
/Users/lagot/Documents/BASH-TEST
lagot-pc:BASH-TEST lagot$ cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt
proceed

如果我尝试创建 VALIDATE.txt 并回显文件内的“回滚”

lagot-pc:BASH-TEST lagot$ ./while-script.sh
not exist
not exist
not exist
not exist
not exist
invalid operation

【问题讨论】:

  • elif [[ "${ACTION}"= "rollback" ]]; 应该是elif [[ "${ACTION}" == "rollback" ]]; = 表示赋值,== 表示比较也需要在变量和运算符之间放置空格
  • @DigvijayS 这是不正确的。在[[ ]] 条件表达式中,=== 是等价的。您正在考虑 (( )) 算术表达式。顺便说一句,在[ ] 测试表达式中,只有= 是标准比较(尽管有些shell 允许== 作为同义词)。
  • @GordonDavisson 谢谢。那么唯一的问题是变量和运算符之间没有空格
  • 我刚刚根据 Digvijay S 和 Gordon Davisson 的建议修改了 bash 脚本。我在测试时仍然得到相同的响应

标签: bash while-loop until-loop


【解决方案1】:

原始代码的第一部分assigns $ACTION incorrectly,更糟糕的是,它在确保$FILE 存在之前错误地尝试赋值。所以改变这些行:

FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
ACTION=`cat /Users/lagot/Documents/BASH-TEST/VALIDATE.txt >>/dev/null 2>&1`
until [ -f "$FILE" ]
do
   echo "not exist"
   sleep 60
done

收件人:

FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
until [ -f "$FILE" ]
do
   echo "not exist"
   sleep 60
done
ACTION=$(<$FILE)

或者,(因为$(&lt;$FILE)返回错误代码),少一行:

FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
until { ACTION=$(<$FILE); } 2> /dev/null
do
   echo "not exist"
   sleep 60
done

之后,测试${ACTION} 的其余原始代码应该可以工作了。


不要将 &gt;&gt; 重定向(附加到现有文件,或在文件不存在时创建)与 &gt; (覆盖文件,或如果文件不存在则创建)。所以像echo proceed &gt;&gt; VALIDATE.txt 这样的代码应该是echo proceed &gt; VALIDATE.txt,否则如果 VALIDATE.txt 已经存在并且包含 "rollback",结果将是两行 VALIDATE .txt 文件:

rollback
proceed

【讨论】:

    【解决方案2】:

    现在已修复,我还在下面添加了新格式的 UNTIL 和 WHILE 脚本

    在脚本中修复

    #!/bin/bash
    FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
    
    while [ ! -f "$FILE" ]
    do
      echo "not exist"
      sleep 60
    done
    
      if [ `cat "$FILE"` = "proceed" ];
        then
          echo "performing proceed"
          rm -rf $FILE
      elif [ `cat "$FILE"` = "rollback" ];
        then
          echo "performing rollback"
          rm -rf $FILE
      else
          echo "invalid operation"
          rm -rf $FILE
      fi
    

    在脚本中修复

    #!/bin/bash
    FILE=/Users/lagot/Documents/BASH-TEST/VALIDATE.txt
    
    until [ -f "$FILE" ]
    do
       echo "not exist"
       sleep 60
    done
    if [ `cat $FILE` = "proceed" ];
      then
        echo "performing proceed"
        rm -rf $FILE
    elif [ `cat $FILE` = "rollback" ];
      then
        echo "performing rollback"
        rm -rf $FILE
    else
        echo "invalid operation"
        rm -rf $FILE
    fi
    

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 2018-03-16
      • 2019-12-03
      • 1970-01-01
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 2012-01-07
      相关资源
      最近更新 更多