#!/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 ...
时才会退出我怎么能在这做?我不想使用条件......
谢谢!
答案 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