不能在bash中的双括号中执行命令

为了保持一致,我试图在所有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的一样简单,只是检查一个命令是否成功运行,如果没有,就退出。

Solutions Collecting From Web of "不能在bash中的双括号中执行命令"

简短的回答是:

  • [[[期待一个表达

  • 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