退出单行

时间:2011-10-26 06:55:51

标签: linux shell redhat

#!/bin/bash
grep -q 'string1' abc.txt && sed -i~ "s/string1/string2/g" abc.txt || echo "ERROR1! Exiting..."; exit
grep -q 'string2' pqr.txt && sed -i~ "s/string2/string3/g" pqr.txt || echo "ERROR2! Exiting..."; exit

#...Several similar above commands here...

在上面的脚本中,当string1存在时,它将替换为string2但它会退出。我希望脚本执行下一个命令。只有在找不到string1 ...

时才会退出

我怎么能在这做?我不想使用条件......

谢谢!

5 个答案:

答案 0 :(得分:3)

你似乎有什么迷恋(基于这个问题和last)在一行中做所有事情。你有垂直挑战的终端设备吗?您的部门是否按照它们存储在源代码存储库中的每行代码收费?

短语“我不想使用,如果条件”没有出现在智慧生物的口中,这是我听过的最离奇的人工限制之一的。说真的,可读性的代码!

那样,那些必须维护你的代码的人(包括你自己六个月的时间)将不会诅咒你的名字,因为这样一个骨头的决定(a)

您必须询问如何执行此操作这一事实足以表明这是一个坏主意。我打赌你不必问如何将它作为一个多行,可读,可维护的if语句。

随意向我投票 - 这并不是因为我缺乏代表:-)我会抓住这个机会,因为SO有很多先例提供答案,说明问题背后的前提不是好的。我还质疑那些希望在8051机器代码中对COBOL或会计应用程序中的操作系统进行编码的人的理智。


(a)没有违法行为,但我怀疑你不会接受这个答案: - )

答案 1 :(得分:3)

您可以使用{}

运行多个命令
cmd1 || { echo "ERROR" ; exit 1 ; }

但我更喜欢在函数中包装错误处理:

error() { # msg 
    echo "$@" 1>&2
    exit 1
}

这使它更具可读性:

cmd1 || error "ERROR"

或者如何:

try() { # cmd args...
    local msg="ERROR: command failed: $@"
    "$@" || { echo "$msg" 2>&1 ; exit 1 }
}

try cmd1 arg1 arg2...

也会给你一个很好的错误信息。

如果您需要解释,那也很简单:

try2() { # msg cmd args...
    local msg="ERROR: $@"
    shift # Swallow first argument
    "$@" || { echo "$msg" 2>&1 ; exit 1 }
}

try2 "Explain what the command is supposed to do" \
    cmd1 arg1 arg2...

答案 2 :(得分:2)

您也可以将最后一个exit&&相关联。使用;时,它将按顺序执行所有命令。 &&之后的命令仅在先前命令运行成功时执行,||之后的命令仅在先前命令运行成功时执行。

grep  && sed || echo "ERROR1! Exiting..." && exit
grep  && sed || echo "ERROR1! Exiting..." && exit

答案 3 :(得分:0)

您需要使用&&而不是;,因为;表示无论第一个命令是否有效,都将执行下一个命令。

答案 4 :(得分:0)

怎么样:

sed -i~ "s/string1/string2/g" abc.txt || exit 1
sed -i~ "s/string2/string3/g" pqr.txt

或者如果你想要更冗长的东西:

function doexit
{
    echo "error " $1
    exit $1
}

sed -i~ "s/string1/string2/g" abc.txt || doexit 1
sed -i~ "s/string2/string3/g" pqr.txt