exit命令不在bash中工作

时间:2014-09-09 09:40:41

标签: linux bash sh

如果找不到特定文件,我希望我的脚本结束。因此,我写下以下内容:

[ -f "$DAEMON" ] || (echo "File $DAEMON not found" && exit 0)

但它无法正常工作。如果该文件不存在,我的脚本将输出此错误消息并继续工作。

我试过

[ -f "$DAEMON" ] || { echo "File $DAEMON not found" && exit 0 }

(正如这里建议exit doesn't work in bash),但我得到了语法错误(意外的文件结束)。

[ -f "$DAEMON" ] || exit 0效果不错但[ -f "$DAEMON" ] || (exit 0)  没有。

如何输出错误信息并停止执行脚本?

6 个答案:

答案 0 :(得分:6)

你的复合命令({ ... }构造)在结束括号之前需要分号 - 它不是可选的!所以这将有效:

[ -f "$DAEMON" ] || { echo "File $DAEMON not found" && exit 0; }

答案 1 :(得分:4)

我想您可能会发现,在someErrorProgram || (exit 0)中,由于括号,exit 0正在子shell 中运行。这意味着exit将退出子shell而不是您认为正在运行的shell。

但是,除非你绝对绝望将它保持在一条线上,否则我只会使用:

if [[ ! -f "$DAEMON" ]] ; then
    echo "File $DAEMON not found"
    exit 0
fi

答案 2 :(得分:3)

使用if语句:

if [ ! -f "$DAEMON" ]
then
  echo "File $DAEMON not found"
  exit 0
fi

答案 3 :(得分:3)

在这种情况下,我使用errecho函数,例如

errecho() { echo "$@" >&2; return 1; }

返回1允许我链接错误条件,例如像

[[ -f file ]] || errecho "file doesnt exists" || exit 1

对于更深层次的功能也很有用

action() {

     [[ some cond ]] || errecho "errmsg" || return 1
}

do_something() {
    action "$1" "$3" || errecho "action failed with $3" || return 1
}

#main
do_something || errecho "total fail " || exit 1

答案 4 :(得分:1)

如果您需要单行解决方案并且可以正常使用

,则可以使用此功能
[[ -f "filename" ]] || { echo "file doesnt exists" && exit ;}

echo "bye"

如果文件没有,我没有在控制台中找到再见。

答案 5 :(得分:0)

使用循环和if语句。使用echo,您可以检查脚本到哪一点。在当前情况下,脚本在遇到守护进程或C时会中断,因此只有回声A和B.

for i in A B Daemon C; do

if 
[ $i == Daemon ] || 
[ $i == C ]

then
    break
fi

echo "$i"

done