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

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

这将显示杰克逊。

name="Jackson"
echo $name

这也将展示杰克逊。

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

答案1

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

<>()[]{}*?$|&#\;`'"

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

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

答案2

Bash 不是强类型的;1唯一显着的区别在于标量类型和复合类型(数组)之间。 标量始终被视为字符串,但是有可以算术使用的“数字字符串”:

a="5"
b=10

echo "$a + $b = "$(($a+$b)); 

“数字字符串”只是一个仅包含数字的字符串,因此可以转换为整数值。 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  

随后,分配给该变量的任何内容都将以算术方式解释:

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

但变量的内容仍然是一个(数字)字符串。整数标志限制字符串的内容并影响分配给它的值的解释。

1这也不是简单的动态类型,正如声明的整数的情况所示。也许我们可以称之为某种鸭子打字,或者,根据Bash 高级脚本编写指南,它是“无类型的”。

答案3

有区别:尝试一下

unset name
name="Michael Jackson" ; echo "$name" 

unset name #to reset name, see comments
name=Michael Jackson ; echo "$name"

这是非常不同的:第二次,它尝试启动“Jackson”命令,并将“name=Michael”环境传递给它。因此它会抱怨“杰克逊:找不到命令”我必须将“重置”unset name名称添加到“重置”名称中,因为下一行的name=Michael部分将仅传递给“杰克逊”命令(并且仅传递给该命令),因此不是在调用 shell 级别完成! (因此,name="Michael Jackson"如果我们在第二次尝试之前没有将其设置回第一个命令,那么它仍然会包含""第一个命令。因此,如果我们没有忘记第一次尝试,“echo $name”仍然会令人困惑地显示“Michael Jackson” .)

平时,总是定义时,尤其是使用变量时,请使用双引号。

cd "${var}" 

cd $var 

如果 $var 未定义,第二个版本将默默地转到 homedir 而不是抗议......

然后仅当您删除周围的双引号时知道那你需要分隔变量的每个元素,即在 a 中:

for i in $var ; do something_using_i ; done

相关内容