name=Jackson
echo $name
Run Code Online (Sandbox Code Playgroud)
这将显示杰克逊。
name="Jackson"
echo $name
Run Code Online (Sandbox Code Playgroud)
这也将显示杰克逊。
所以我假设通过在变量周围加上引号,它使它成为一个字符串。从技术上讲,name=Jackson 是什么?它也会被识别为字符串吗?
Linux 环境变量始终是字符串。仅当字符串中有特殊字符(shell 元字符或空格)时才需要引号。Shell 元字符是:
<>()[]{}*?$|&#\;`'"
Run Code Online (Sandbox Code Playgroud)
使用 $、\ 和 ` 双引号是不够的,因为它们甚至在其中展开。在那里你需要单引号或用 \ 转义它们。
正如评论中所指出的,bash 具有特殊类型的变量,但很少需要它们,并且默认情况下所有 bash 变量也是字符串。
Bash 不是强类型的;1唯一显着的区别是标量和复合类型(数组)。 标量总是被认为是 strings,但有可以在算术上使用的“数字字符串”:
a="5"
b=10
echo "$a + $b = "$(($a+$b));
Run Code Online (Sandbox Code Playgroud)
“数字字符串”只是一个仅包含数字的字符串,因此可以转换为整数值。bash 中的所有标量值仍然只是字符串,此处声明中的引号无关紧要。 a=5
与 完全相同a="5"
。如果您比较$a
和$b
使用(例如)-lt
它们将被视为数字。如果您使用<
它们进行比较,则按字典顺序处理它们。做出决定的是操作员/上下文,而不是变量的特征。
您还可以使用“整数标志”声明变量,这将导致声明的值被解释为算术表达式:
x=10/2
echo "$x" # output: 10/2
declare -i x=10/2
echo "$x" # output: 5
declare -i x=what
echo "$x" # output: 0
Run Code Online (Sandbox Code Playgroud)
随后,分配给该变量的任何内容都将被算术解释:
a=5
declare -i b=10
a=$a/5
b=$b/5
echo "$a $b" #output: 5/5 2
a=hello
b=world
echo $a$b #output hello0
Run Code Online (Sandbox Code Playgroud)
但是变量的内容仍然是(数字)字符串。整数标志限制字符串的内容并影响分配给它的值的解释。
1这也不是简单的动态类型,正如声明的整数的情况所示。也许我们可以称之为一种鸭子类型,或者,根据Bash 高级脚本指南,它是“无类型的”。