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