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
${}
形式称为参数替换。参数替换还有很多内容,我们将在后面的技巧中介绍。
引用 vs 不引用("$VAR" vs $VAR)
简单来说:
- 如果您引用,则将其视为一个单词。
- 如果不引用,它将被分成多个单词。
在下面的示例中,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
从环境获取变量到 Bash Shell 脚本
首先,在命令行中定义一个变量。
$ 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
变量区分大小写
USERNAME
与 username
不通。它们是不同的变量。
$ USERNAME=ramesh
$ username=john
$ echo "USERNAME=$USERNAME username=$username"
USERNAME=ramesh username=john