微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – bash空字符串/命令

我在bash中发现了一些奇怪的东西,我无法理解它是如何工作的.

[test ~]$a=""
[test ~]$$a && echo 1
1

[test ~]$$a
[test ~]$echo $?
0

为什么$a(空的)返回0?它是否以某种方式转变为空命令?
如果我在&&之前添加引号或写空字符串,则会返回错误.而空命令返回0.

[test ~]$"$a" && echo 1
-bash: : command not found

[test ~]$"" && echo 1
-bash: : command not found

[test ~]$`` && echo 1
1

那么,当我输入$a时会发生什么?

解决方法:

你似乎把bash与其他一些编程语言混淆了.变量被替换,然后左边的内容被执行.

"$a"

这是引号之间的a的内容. a是空的,所以这相当于:

""

那不是命令. “没有找到指令.”由于存在错误,执行不成功(shell返回代码不为0),因此命令的后半部分 – && echo 1 – 没有被执行.

反引号…

``

…执行它们之间的任何内容,该命令的输出替换整个构造. (还有$()也做同样的事情,不太容易在脚本中被忽略.)所以……

`echo "foo"`

……会评价……

foo

……然后将被执行.所以你…

``

……评估……

 <empty>

…然后“成功执行”(因为没有错误).

如果要测试a的内容,并且仅当a不为空时才执行echo 1,则应使用test命令:

test -n "$a" && echo 1

测试有一个方便的别名,[也可以方便地忽略尾随] …

[ -n "$a" ] && echo 1

…和bash-ism [[知道]关于变量替换,因此不需要引号来避免抱怨缺少参数,如果$a确实评估为空…

[[ -n $a ]] && echo 1

……或者,当然,更详细……

if [[ -n $a ]]
then
    echo 1
fi

啊.错过了问题的核心部分:

$a && echo 1

这是两个陈述,用&&分隔.如果第一个语句执行OK,则仅执行第二个语句. bash将该行拆开并执行第一个语句:

$a

这是…

<empty>

…这是“成功的”,所以第二个语句被执行.反对

&& echo 1

…是语法错误,因为没有第一个语句. ;-)(Tricky,我知道,但这就是这个cookie崩溃的方式.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐