我注意到,在 shell 脚本中,当我们声明一个变量时,前面的美元符号是不需要的,虽然当我们以后想要访问这个变量时,我们应该在这个变量名的前面加上一个美元符号。
就像:
#!/bin/sh
VAR_1=Hello
VAR_2=Unix
echo "$VAR_1 $VAR_2"
这与其他语言不同,就像Perl
我们总是有变量名前面的美元符号,我只是想知道 shell 脚本这样做的任何充分理由,或者它只是一个约定......?
我注意到,在 shell 脚本中,当我们声明一个变量时,前面的美元符号是不需要的,虽然当我们以后想要访问这个变量时,我们应该在这个变量名的前面加上一个美元符号。
就像:
#!/bin/sh
VAR_1=Hello
VAR_2=Unix
echo "$VAR_1 $VAR_2"
这与其他语言不同,就像Perl
我们总是有变量名前面的美元符号,我只是想知道 shell 脚本这样做的任何充分理由,或者它只是一个约定......?
Shell 是与 Perl 不同的语言,是与 C++ 不同的语言,是与 Python 不同的语言。您可以为每种语言添加“具有不同规则”。
在 shell 中,标识符之类VAR_1
的变量命名,美元符号用于调用扩展。$var
替换为var
' 内容;${var:-foo}
如果设置了,则替换为var
' 的内容,如果foo
未设置变量,则替换为单词。扩展也适用于非变量,例如,如果包含具有完整路径和扩展名的文件名,您可以像${${var##*/}%.*}
只留下文件基名一样进行链式扩展。var
在 Perl 中,变量前面的符号告诉 Perl 如何解释标识符:$var
是标量、@var
数组、%var
散列等。
在 Ruby 中,变量前面的 sigil 告诉 Ruby 它的作用域:var
是局部变量,$var
是全局@var
变量,是对象的实例变量,@@var
是类变量。
在 C++ 中,我们在变量名前面没有符号。
等等。
在 shell 中,$
符号不是变量名的一部分。它只是告诉shell 用同名变量的内容替换后面的单词,即$foo
“在此处插入变量的内容foo
”。
这在分配给变量时不使用,因为您明确不想插入旧内容;您想使用变量本身(在某些方面这类似于取消引用指针)。
它基本上是一个语法约定。
DOS/.bat 文件语法的工作方式相同。
1)创建一个变量,没有元字符。
2)要“取消引用”变量的内容,请使用元字符。
DOS:
set VAR=123
echo %VAR%