linux – bash空字符串/命令
我在bash中发现了一些奇怪的东西,我无法理解它是如何工作的.
[test ~]$a="" [test ~]$$a && echo 1 1 [test ~]$$a [test ~]$echo $? 0 为什么$a(空的)返回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崩溃的方式.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |