linux – bash空字符串命令

linux – bash空字符串命令,第1张

概述我在bash中发现了一些奇怪的东西,我无法理解它是如何工作的. [test ~]$a=""[test ~]$$a && echo 11[test ~]$$a[test ~]$echo $?0 为什么$a(空的)返回0?它是否以某种方式转变为空命令? 如果我在&&之前添加引号或写空字符串,则会返回错误.而空命令返回0. [test ~]$"$a" && echo 1-bash: : c 我在bash中发现了一些奇怪的东西,我无法理解它是如何工作的. @H_404_7@

@H_404_7@

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

@H_404_7@

[test ~]$"$a" && echo 1-bash: : command not found[test ~]$"" && echo 1-bash: : command not found[test ~]$`` && echo 11
@H_404_7@那么,当我输入$a时会发生什么?

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

@H_404_7@

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

@H_404_7@

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

@H_404_7@反引号…

@H_404_7@

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

@H_404_7@

`echo "foo"`
@H_404_7@……会评价……

@H_404_7@

foo
@H_404_7@……然后将被执行.所以你…

@H_404_7@

``
@H_404_7@……评估……

@H_404_7@

<empty>
@H_404_7@…然后“成功执行”(因为没有错误).

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

@H_404_7@

test -n "$a" && echo 1
@H_404_7@测试有一个方便的别名,[也可以方便地忽略尾随] …

@H_404_7@

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

@H_404_7@

[[ -n $a ]] && echo 1
@H_404_7@……或者,当然,更详细……

@H_404_7@

if [[ -n $a ]]then    echo 1fi
@H_404_7@啊.错过了问题的核心部分:

@H_404_7@

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

@H_404_7@

$a
@H_404_7@这是…

@H_404_7@

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

@H_404_7@

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

总结

以上是内存溢出为你收集整理的linux – bash空字符串/命令全部内容,希望文章能够帮你解决linux – bash空字符串/命令所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1023920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存