我有一个疑问,我已经开始学习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]}
- 其他一些更小众的结构,如
${str:here:here}
,$[here]
let
的参数:let here
§在您的示例中,您使用的是test
命令,又名[
,它(大多数情况下)不将任何内容视为算术表达式。这就是为什么需要$
来区分字面值字符串name
和变量name
的值。
§这些词由空格分隔,因此可以终止表达式,但这并没有改变空格是可选的事实。它们只需要转义就可以被认为是表达式的一部分。