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