Answers:
如果命令成功或失败,如何有条件地执行某些操作
这正是bash的if
声明所要做的:
if command ; then
echo "Command succeeded"
else
echo "Command failed"
fi
从留言中加入信息:您没有需要使用[
... ]
语法,在这种情况下。[
本身就是命令,几乎等同于test
。这可能是在中使用的最常见的命令if
,这可能导致人们假设它是Shell语法的一部分。但是,如果要测试命令是否成功,请直接使用本身if
显示命令,如上所示。
编辑:为了清楚起见,在顶部引用了问题(此答案未出现在页面顶部附近)。
then
一行。
if ! command ; then ... ; fi
。 [
本身就是命令,在这种情况下不需要。
对于如果shell命令起作用而希望发生的小事情,可以使用以下&&
结构:
rm -rf somedir && trace_output "Removed the directory"
同样,对于在shell命令失败时希望发生的小事情,可以使用||
:
rm -rf somedir || exit_on_error "Failed to remove the directory"
或两者
rm -rf somedir && trace_output "Removed the directory" || exit_on_error "Failed to remove the directory"
对这些结构进行很多工作可能是不明智的,但是有时它们可以使控制流程更加清晰。
检查的值$?
,其中包含执行最新命令/函数的结果:
#!/bin/bash
echo "this will work"
RESULT=$?
if [ $RESULT -eq 0 ]; then
echo success
else
echo failed
fi
if [ $RESULT == 0 ]; then
echo success 2
else
echo failed 2
fi
if
习惯用法。我更喜欢基思·汤普森的答案。
if
是这样做。Bash中的流控制条件都在$?
后台检查;那就是他们的工作。在绝大多数情况下,没有必要明确检查其值,并且通常是初学者的反模式。
if ! cmd
可以。否则,常见的安排是使用else
子句。你不能有一个空的then
,但你有时会看到then : nothing; else
其中的:
任何操作是显著。true
也会在那里工作。
这为我工作:
command && echo "OK" || echo "NOK"
如果command
成功,则echo "OK"
执行,并且由于成功,因此在此处停止执行。否则,将&&
被跳过并echo "NOK"
执行。
command && echo "OK" || c=$?; echo "NOK"; $(exit $c)
command && echo "OK" || (c=$?; echo "NOK"; (exit $c))
吗?
echo "OK"
零件本身可能会失效,那么这会更好:command && (echo "OK"; exit 0) || (c=$?; echo "NOK"; (exit $c))
应该注意的是,if...then...fi
和&&
/ ||
方法的类型涉及我们要测试的命令返回的退出状态(成功时为0);但是,如果命令失败或无法处理输入,则某些命令不会返回非零退出状态。这意味着通常的if
和&&
/ ||
方法对那些特定命令不起作用。
例如,在Linux上file
,如果GNU 接收到不存在的文件作为参数并且find
无法找到指定的文件用户,则GNU 仍将以0退出。
$ find . -name "not_existing_file"
$ echo $?
0
$ file ./not_existing_file
./not_existing_file: cannot open `./not_existing_file' (No such file or directory)
$ echo $?
0
在这种情况下,我们可能会处理这种情况的一种可能方式是读取stderr
/ stdin
消息,例如,由file
命令返回的消息,或解析命令的输出,例如in find
。为此,case
可以使用语句。
$ file ./doesntexist | while IFS= read -r output; do
> case "$output" in
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed
$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi
File not found
我能想到的最容易出错的是:
RR=$?
现在,不仅针对这种情况,而且可能面对的其他情况,请考虑:
$ AA=1 ; if (( "10#0${AA}" == 1 )) ; then echo yes ; else echo no ; fi
答:是的
$ AA=1 ; if (( "10#0${AA}" != 1 )) ; then echo yes ; else echo no ; fi
答:不可以
$ AA=1 ; if (( "10#0${BB}" == 1 )) ; then echo yes ; else echo no ; fi
答:不可以
$ AA=1 ; if (( "10#0${BB}" != 1 )) ; then echo yes ; else echo no ; fi
答:是的
$ AA=1 ; if (( "10#0${BB}" == 0 )) ; then echo yes ; else echo no ; fi
答:是的
这样可以防止各种错误。
您可能已经知道所有语法,但是这里有一些提示:
"blank"
成为nothing
。${variable}
。base-8
。您将收到类似以下的错误:
value too great for base (error token is "08")
对于以上数字7
。那是什么时候10#
起作用:10#
强制数字为base-10
。你可以这样做:
if ($( ping 4.4.4.4 -c1 > /dev/null )) ; then
echo "ping response succsess!!!"
fi
ping
鉴于将其作为命令运行,将捕获的输出。但是因为输出重定向到/ dev / null,所以它将始终是空字符串。因此,您在子Shell中什么也没有运行,这意味着将保留先前的退出状态(命令替换子Shell的状态,即ping)。显然,正确的方法就if ping ...; then
在这里。
如本主题其他地方所述,原始问题基本上可以回答自己。这是说明if
条件也可能嵌套的图示。
本示例用于if
检查文件是否存在以及是否为常规文件。如果满足这些条件,则检查其大小是否大于0。
#!/bin/bash
echo "Which error log are you checking today? "
read answer
if [ -f /opt/logs/$answer*.errors ]
then
if [ -s /opt/logs/$answer*.errors ]
then
echo "Content is present in the $answer error log file."
else
echo "No errors are present in the $answer error log file."
fi
else
echo "$answer does not have an error log at this time."
fi
#!/bin/bash
if command-1 ; then
echo "command-1 succeeded and now running from this block command-2"
command-2
else
echo "command-1 failed and now running from this block command-3"
command-3
fi