为什么声明shell脚本变量没有先前的`$`?

时间:2012-11-28 07:55:36

标签: shell

我注意到在shell脚本中,当我们声明一个变量时,不需要前面的美元符号,但是当我们想要稍后访问这个变量时,我们应该在这个变量名前添加一个美元符号。

就像:

#!/bin/sh
VAR_1=Hello
VAR_2=Unix

echo "$VAR_1 $VAR_2"

这与其他语言不同,例如Perl我们将始终拥有带有变量名称的前一个美元符号,我只是想知道shell脚本以这种方式执行它的任何好理由,或者它只是会议......?

3 个答案:

答案 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%
相关问题