0

我能够在单独的脚本上创建 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
4

2 回答 2

2

原始代码的第一部分分配$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
于 2020-05-28T06:07:58.543 回答
0

现在已修复此问题,我还在下面添加了 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
于 2020-06-05T14:37:28.983 回答