$在条件语句的情况下是强制性的-linux []?



我有一个疑问,我已经开始学习Linux和学习我们可以执行数学运算的方式。例如

a)使用expr>$space为必选。示例:sum= expr $a + $b

b)使用let关键字>$是可选的,但我们应该使用space

c) using(())>$space都是可选的。

d)使用[ ]>$space都是可选的。

所以现在我写了一个简单的if语句。

#! /bin/bash
read -p "Please enter username:" name
if [ name = sunny ]
then
echo "hello Sunny is available. "
fi
echo "Sunny is busy-remaining line code"

那么在方括号内,我正在做算术运算,那么为什么这里我需要使用$符号来获取名称值。

注意如果我使用if [ $name = sunny ],我会得到预期的结果。

任何关于这方面的帮助/建议都将是非常感谢的。

规则相对简单:$和空格在算术上下文中是可选的,但在字符串上下文中不是。

这是因为如果你期待一个数字,看到foo,你可以放心地假设它一定是一个变量,因为它肯定不是一个数字。这对于字符串是不可能的。

算术上下文包括:

  • 算术展开$((here))和算术命令((here))
  • [[ .. ]](但不是[ .. ])中的整数比较器,如[[ here -eq here ]]§。特别注意=是一个字符串比较器。
  • 赋值给声明为整型的变量:declare -i foo=here§
  • 索引数组的索引:${array[here]}
  • let的参数:let here§
  • 其他一些更小众的结构,如${str:here:here},$[here]

在您的示例中,您使用的是test命令,又名[,它(大多数情况下)不将任何内容视为算术表达式。这就是为什么需要$来区分字面值字符串name和变量name的值。


§这些词由空格分隔,因此可以终止表达式,但这并没有改变空格是可选的事实。它们只需要转义就可以被认为是表达式的一部分。

最新更新