以下适用于Ubuntu但不适用于Yocto(Poky).
root@system:~/# x='abc'
root@system:~/# y=''
root@system:~/# [[ $(echo $x) != '' ]] && echo true
true
root@system:~/# [[ $(echo $y) != '' ]] && echo true
sh: : unknown operand
Run Code Online (Sandbox Code Playgroud)
在Ubuntu中,最后一行不返回任何内容(如预期的那样).任何想法为什么它在Yocto中抛出错误?
Eri*_*ouf 10
问题似乎$(echo $y)是扩展到一个空字符串,然后[[没有正确处理它。解决方案是引用命令替换,如
[[ "$(echo "$y")" != '' ]] && echo true
Run Code Online (Sandbox Code Playgroud)
虽然使用printf可能比使用echo更好,所以你可以这样做
[[ "$(printf '%s' "$y")" != '' ]] && echo true
Run Code Online (Sandbox Code Playgroud)
以防万一$y最终可能会出现可能绊倒echo或类似的特殊字符
显然,busybox ash的实现相当简单[[.它是相同的,[除了它期望一个]]而不是]最终的参数.这就错过了为什么它[[可以是有用的:[[应该是一个具有特殊解析的关键字,使用它看起来更漂亮并避免各种陷阱(同时添加一些自己的陷阱).我猜他们添加了它,所以在busybox ash上运行了一些未修改的bash脚本.
为避免混淆,我建议不要[[在busybox中使用.使用[和引用所有命令替换和参数扩展.
| 归档时间: |
|
| 查看次数: |
14867 次 |
| 最近记录: |