首页 > 解决方案 > BASH - 使用 until 或 while 循环时获得无效响应

问题描述

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

脚本

#!/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

标签: bashwhile-loopuntil-loop

解决方案


原始代码的第一部分分配$ACTION不正确,更糟糕的是,它在确定$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)

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

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

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


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

rollback
proceed

推荐阅读