bash - 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
解决方案
原始代码的第一部分分配$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
推荐阅读
- python - 在 Django 上使用 postcodes.io API
- css - 如何设置圆形 div 的样式?
- scala - sbt ThisBuild 范围是否有块语法?
- mysql - Hive,分区与未分区数据库所花费的时间
- node.js - Nodejs Zoho API v2“zcrmsdk”如何在 AWS Lambda 的“configuration.properties”文件中指定模块
- javascript - 解析点分隔的数字层次索引 JSON
- javascript - 使用 react-sortable-hoc 的待办事项列表
- java - 在 Spring 服务中跳过对内部服务到服务调用的授权
- javascript - 如何显示 javascript 循环函数的各个元素?
- wpf - 属性更改时触发的动画似乎没有触发