我有一个带流控制的查询。当消息为:时,我想将脚本退出到终端HOSTNAME NOT ADDED IN /tmp/hosts EXITING
,这是一条失败消息。
if grep -o 'abcdefgh01.was.db.dcbc' /tmp/hosts; then
echo " HOSTNAME ADDED IN /tmp/hosts"
elif [ $?==1 ]; then
echo " HOSTNAME NOT ADDED IN /tmp/hosts EXITING"; exit
fi|tee -a /tmp/log;
我尝试了上述脚本,但失败时无法退出。我该如何修复此问题?
答案1
我认为问题在于,每当您创建管道时,shell 都会将两端放入单独的进程中,即使它不必这样做。特别是,您的if
-fi
语句块在与 shell 脚本本身不同的进程中运行,因此您的exit
语句只是终止了该if
块(无论如何,在即将结束的位置),因此它什么也没完成。
可能有几种方法可以解决这个问题 - 可能比下面的方法更简洁 - 但我现在无法访问 *nix 系统来测试其中任何一个。一种应该有效的简单方法是使用标志文件:
exit_flag_file="/tmp/my_exit.$$"
rm –f "$exit_flag_file"
if grep -o 'abcdefgh01.was.db.dcbc' /tmp/hosts
then
echo " HOSTNAME ADDED IN /tmp/hosts"
elif [ $?==1 ]
then
echo " HOSTNAME NOT ADDED IN /tmp/hosts; EXITING"
> "$exit_flag_file"
fi | tee -a /tmp/log
if [ -f "$exit_flag_file" ]
then
exit
fi