我正在学习Bash,我发现以下形式:
和以下形式:C=例子
echo "$C"
会得到相同的结果。我想知道在变量赋值时将“”放在变量名称之后还是在$符号之后更好,或者是否没有区别,或者其中一个比另一个更美观。C="例子"
echo $C
如果您确定一个变量的值是一个单词(没有空格),那么可以使用$varname
或${varname}
。但如果不能保证这一点,则应使用"$varname"
或"${varname}"
。请注意,Bash在解释命令之前进行分词,因此如果不引用表达式,实际上可能会出现语法错误,例如:
C="white space"
if [ -z $C ]
then
...
fi
会导致语法错误:
-bash: [: white: binary operator expected
虽然这样做可以正常工作:
C="white space"
if [ -z "$C" ]
then
...
fi
if [ -z white space ]
then
...
fi
而-z
运算符仅期望一个参数,而不是两个参数。在第二种带引号的情况下,Bash 看到了这个:
if [ -z "white space" ]
then
...
fi
C="white space"
如果你写成这样,它也会产生一个错误:
C=white space
因为这意味着:使用包含添加变量C=white
的环境来执行命令space
。
因此,通常应引用这些表达式,以确保您的代码更加健壮,可以抵御未预料到的变量值。特别是如果变量值来自输入、文件等,那么这一点尤其重要。对于整数变量或仅想显示变量值的情况(例如echo $C
),通常可以安全地省略引号。
当字符串包含空白字符时,这很重要。如果没有引号,空格字符被视为标记分隔符,并尝试将替换的字符串解释为表达式。
为了安全起见,请始终使用引号,当您不打算将变量作为表达式的一部分进行评估时。
想象一下,将输入从“example”更改为“two words”,那么在执行脚本时,如果您忽视了上述内容,可能会遇到奇怪的行为甚至语法错误。
换句话说,
C="abc def"
# the echo command receives one argument: "abc def"
echo "$C"
# echo receives two arguments: "abc" and "def"
echo $C
# bash tries to execute the program "abc" with a first argument "def"
$C
# bash tries to execute the program "abc def"
"$C"
尝试使用带有空格的实际示例。对于字符串example
,您根本不需要任何引用。因此,请创建名为This is an example.txt
的文件,然后重试。将echo
替换为ls
...