为了保持一致,我试图在所有if语句中使用双括号[[]]。 但是当我要检查我想运行的命令的返回值时,我确实遇到了一个问题。 在testing几种创buildif语句的方法之后,我发现只有没有括号才能执行命令。
以下不起作用:
if [[ $command ]] ; then echo "something" fi if [[ $(command) ]] ; then echo "something" fi if [[ ${command} ]] ; then echo "something" fi
上面的代码使if循环成为真,即使命令没有运行。 因为上面的代码不能使用大括号它不能使用这个:
[[ $command ]] || echo "failed"
而且它不能在子shell中工作。
以下工作:
if $command ; then echo "something" fi if $(command) ; then echo "something" fi
为什么不能在带括号的if循环中放置一个命令,为什么上面的if循环甚至没有运行该命令时报告为真? 我正在使用bash版本4.1.9。 我试了很多次,if循环和上面input的一样简单,只是检查一个命令是否成功运行,如果没有,就退出。
简短的回答是:
[
和[[
期待一个表达 。
if
需要一个命令 。
他说:
[[ $(command) ]]
基本上会执行:
[[ -n <command_output> ]]
这可能是也可能不是你想要的。 另一方面,说:
$command && echo something || echo other
会根据命令的返回码(分别为0
和非零)来回显something
。
双大括号是test
的捷径。 在你的例子中,发生了什么事是你正在测试shell变量$命令的存在。
if [[ $PWD ]]; then echo PWD is set to a value fi if [[ $NOT_A_REAL_VAR ]]; then echo Nope, its not set fi
在第二个示例中,您使用命令替换来检查该command
在标准输出上输出的内容。
if [[ $(echo hi) ]]; then echo "echo said hi' fi if [[ $(true) ]]; then #true is a program that just quits with successful exit status echo "This shouldn't execute" fi
你的第三个例子和你的第一个例子几乎一样。 如果你想分组你的变量,你可以使用大括号。 例如,如果你想在某物之后放一个's'。
WORD=Bike echo "$WORDS" #won't work because "WORDS" isn't a variable echo "${WORD}S" # will output "BikeS"
然后在你的第五个例子中,你正在运行在command
的程序。
所以,如果你想测试一些字符串,使用[[]]或[]。 如果你只是想测试一个程序的退出状态,那么不要使用这些,只要使用一个空的if。
检查man test
的大括号的细节。
如果您只是检查命令的返回值,请删除双括号。
if $command then echo "Command succeeded" else echo "Command failed: $!" fi
双括号是测试命令。 (嗯,不是真的,但是它们是test
命令别名的单个方括号的起始部分。)在早期的Bourne shell中,你会看到如下的东西:
if test -z "$string" then echo "This is an empty string" fi
方括号是句法糖:
if [ -z "$string" ] then echo "This is an empty string" fi
所以,如果你不做实际的测试,你可以消除双方或单方括号。
如果你使用的是方括号,你应该使用双精度,而不是单精度,因为双精度值有点宽容,可以多做一点:
if [ -z $string ] # No quotes: This will actually fail if string is zero bytes! if [[ -z $string ]] # This will work despite the lack of quotes