【问题标题】:Bash Shell: What is the differences in syntax?Bash Shell:语法上有什么区别?
【发布时间】:2013-05-12 20:27:05
【问题描述】:

我在教程中看到了两种在 BASH shell 中为 if 语句执行语法的方法:

除非我在变量周围加上引号并添加额外的 [ 和 ],否则这将不起作用:

if [[ "$step" -eq 0 ]]

这个没有在变量周围加上引号就可以工作,并且不需要额外的 [ 和 ]:

if [ $step -ge 1 ] && [ $step -le 52 ]

哪个是正确的最佳实践?有什么区别?谢谢!

【问题讨论】:

  • “行不通”是什么意思。你有错误吗?意外行为?
  • 是的,第一个错误是为了在 $step 周围加上双引号并在其周围添加额外的 [ 和 ]。
  • 错误是什么?你拿到 $step 时的价值是多少?
  • 两者都应该工作,除非$step 为空或包含空格

标签: bash if-statement syntax


【解决方案1】:

“当引用一个变量时,通常建议用双引号将其名称括起来” -- http://tldp.org/LDP/abs/html/quotingvar.html

if [ $step -ge 1 ] && [ $step -le 52 ]可以替换为

if [ "$step" -ge 1 -a "$step" -le 52 ]

if [[ "$step" -eq 0 ]]可以替换为if [ "$step" -eq 0 ]

另外,假设您有以下脚本:

#!/bin/bash
if [ $x -eq 0 ]
then
        echo "hello"
fi

运行脚本时出现此错误 -- example.sh: line 2: [: -eq: unary operator expected

但是使用if [ "$x" -eq 0 ]

运行脚本时会出现不同的错误 -- example.sh: line 2: [: : integer expression expected

因此,最好将变量放在引号内...

if [[ .... ]] 语法在条件语句中有 regex 时特别有用 -- http://honglus.blogspot.com/2010/03/regular-expression-in-condition.html

编辑:当我们处理字符串时——

#!/bin/bash
if [ $x = "name"  ]
then
        echo "hello"
fi

运行脚本时出现此错误 -- example.sh: line 2: [: =: unary operator expected

但是,如果您使用if [ "$x" = "name" ],它运行良好(即没有错误)并且if 语句被评估为false,因为x 的值是null,它与name 不匹配。

【讨论】:

  • 所以虽然它在某些情况下可能会起作用,例如处理计数器的单个数字,但在处理字符串时可能会导致问题?
  • @Edward 我已经在答案中添加了这个......如果您有更多问题,请告诉我。
猜你喜欢
  • 2015-11-07
  • 1970-01-01
  • 2013-08-10
  • 2010-10-10
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
相关资源
最近更新 更多