如果不加引号,bash 是否会将变量声明识别为字符串?

Joh*_*ohn 8 bash

name=Jackson
echo $name
Run Code Online (Sandbox Code Playgroud)

这将显示杰克逊。

name="Jackson"
echo $name
Run Code Online (Sandbox Code Playgroud)

这也将显示杰克逊。

所以我假设通过在变量周围加上引号,它使它成为一个字符串。从技术上讲,name=Jackson 是什么?它也会被识别为字符串吗?

Mic*_*ann 6

Linux 环境变量始终是字符串。仅当字符串中有特殊字符(shell 元字符或空格)时才需要引号。Shell 元字符是:

<>()[]{}*?$|&#\;`'"
Run Code Online (Sandbox Code Playgroud)

使用 $、\ 和 ` 双引号是不够的,因为它们甚至在其中展开。在那里你需要单引号或用 \ 转义它们。

正如评论中所指出的,bash 具有特殊类型的变量,但很少需要它们,并且默认情况下所有 bash 变量也是字符串。

  • +1 因为答案的核心是正确的。但是,除了字符串之外,更高级的 shell 确实还有其他数据类型。Bash 允许你说诸如 `typeset -i foo=2` 之类的东西来获取一个值为 `2` 的整数变量 `$foo`。 (3认同)

gol*_*cks 5

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 高级脚本指南,它是“无类型的”。