16. 变量基础知识


以下是有关 bash 变量需要记住的要点。

  • 正确:当您使用VAR=VALUE时,shell 将=视为符号,并将该命令视为变量赋值。
  • 错误:当您使用VAR = VALUE时,shell 假定 VAR必须是命令的名称,并尝试执行命令VAR
  • 正确:以下示例将值 "ramesh" 分配给变量 USERNAME
$ USERNAME=ramesh

错误例子:以下示例尝试使用两个参数="ramesh" 执行命令USERNAME。 由于没有名为USERNAME的命令,bash 显示 command not find

$ USERNAME = ramesh
-bash: USERNAME: command not found

错误例子:以下示例尝试使用参数 "=ramesh" 执行命令USERNAME。 由于不存在名USERNAME的命令,因此显示 command not find

$ USERNAME =ramesh
-bash: USERNAME: command not found

错误例子: 下面的例子和上面两个错误的例子没什么不同,因为 bash 会识别出 "USERNAME" 是一个变量而不是一个命令。 但这仍然是错误的,因为它为变量 USERNAME 分配了一个空值,然后尝试执行命令 ramesh。 由于没有名为refresh的命令,因此显示 command not find

$ USERNAME= ramesh
-bash: ramesh: command not found

$ USERNAME=ramesh
$ echo "Value of USERNAME variable is: $USERNAME"
Value of USERNAME variable is: ramesh

大多数情况下,$${}是相同的。 例如:

$ echo "Value of USERNAME variable is: ${USERNAME}"
Value of USERNAME variable is: ramesh

但是,当您将一个变量的值与另一个值连接时,您应该使用${}引用形式。 例如,假设您要将静态值 "home" 附加到 $USERNAME 变量的值。

以下内容将不起作用。 这实际上是在尝试显示变量 $USERNAMEhome 的值。 由于没有这样的变量,所以不会显示任何内容

$ echo $USERNAMEhome

但是,以下内容将起作用。 现在,我们已经使用${}清楚地将变量名称与字符串的其余部分分开。

$ echo ${USERNAME}home
rameshhome

注意:使用${}形式称为参数替换。参数替换还有很多内容,我们将在后面的技巧中介绍。

简单来说:

  • 如果您引用,则将其视为一个单词。
  • 如果不引用,它将被分成多个单词。

在下面的示例中,for 循环中的$states没有被引用。 如下所示,使用这些值时不会用引号引起来。

在此示例中,(for i in $states) 与 (for i in CA NY UT TX) 相同。

$ cat var.sh
states="CA NY UT TX"
for i in $states
do
   echo $i
done

当您执行此示例时,您将看到$states的值被拆分为多个单词并单独显示,如下所示。

$ ./var.sh
CA
NY
UT
TX

在下面的示例中,for 循环中的$states被引用。 如下所示,在使用时,这些值将被引用。

在此示例中,(for i in "$states") 与 (for i in "CA NY UT TX") 相同。

$ cat var1.sh
states="CA NY UT TX"
for i in "$states"
do
    echo $i
done

当您执行此示例时,您将看到$states的值未拆分为多个单词。 它被视为单个单词并显示在一行中。

$ ./var1.sh
CA NY UT TX

Bash shell 不关心变量的类型。 即变量可以存储字符串、整数或实数。

变量不必声明。但是,当您访问到目前为止未使用的变量时,您将不会收到任何警告或错误消息。 相反,它将显示一个空白值,如下所示。

$ echo "VAR1 Value: $VAR1"
VAR1 Value:

当值中包含空格时,请使用双引号将该值引起来。 稍后将详细介绍引用。

$ VAR1="The Geek Stuff"
$ echo "VAR1 Value: $VAR1"
VAR1 Value: The Geek Stuff

首先,在命令行中定义一个变量。

$ VAR1="The Geek Stuff"

接下来,创建一个使用我们刚刚定义的变量的 shell 脚本。

$ vi variable.sh
#!/bin/bash
echo "VAR1 Value: $VAR1"

现在,执行这个 shell 脚本。

$ ./variable.sh
VAR1 Value:

执行此 shell 脚本会显示空白值,即使我们从命令行为 VAR1 分配了一个值。 为什么?

答案是:在执行 variable.sh期间,它会生成一个新的bash shell并执行脚本。 因此变量 VAR1 在生成的 shell 中不会有值。 您需要导出该变量,以便其他程序(包括 shell 脚本)继承它,如下所示。

$ export VAR1="The Geek Stuff"
$ ./variable.sh
VAR1 Value: The Geek Stuff

USERNAMEusername 不通。它们是不同的变量。

$ USERNAME=ramesh
$ username=john

$ echo "USERNAME=$USERNAME username=$username"
USERNAME=ramesh username=john