Shell脚步中的变量可以分为“系统环境变量”和“用户自定义变量”两种。系统环境变量用来记录特定的系统信息,比如系统名称、用户、用户名、用户系统ID(UID
)等。此外,系统环境变量还被用来存储有关Shell回话和工作环境的信息,环境变量可以分为“全局变量”、“局部变量”。
env
或是printenv
命令可以查看当前Linux环境上面所有的全局变量。=
)”前面的变量就是“系统环境全局变量”。要引入某个环境变量,需要在变量名前面添加“$
(美元符)”。比如引用“JAVA_HOME
”,可以直接在终端使用echo
命令来输出,如:UNIX
环境中没有单独查看句柄环境变量的命令,但是可以借助set
命令来查看,然后和env/printenv
命令得到的结果进行比对得知。因为set
命令会显示特定进程中的所有环境变量,比如局部变量、全局变量和用户自定义变量(而且会对结果安装字母顺序进行排序);而env/printenv
不会输出局部变量和用户自定义变量,此外,还不会对结果进行排序。用户变量可以是“任何由字母(a
到 z
或 A
到 Z
)、数字(0
到 9
)或下划线(_
)组成的文本字符串”。
比如下面的变量名是有效的:
#!/bin/bash
var="1"
_VAr="2"
VAR_1="3"
VAR_="4"
echo "$var $_VAr $VAR_1 $VAR_"
其打印结果如下图所:
而下面的这些变量名是无效的:
#!/bin/bash
2VAR="1"
-var="2"
!var="3"
echo ${2VAR} ${-var} ${!var}
如下图所示:
不能使用其他字符(如
!
、*
或-
)的原因是,这些字符对Shell有特殊的含义。
要定义一个变量,其格式如下:
//var、=和value直接没有空格符号
var=value
Shell对变量是区分大小的,比如var
和Var
是两个不同的变量,比如:
在Shell脚步中,变量是没有数据类型概念的。直接定义一个变量名就可以,比如定义一个变量var
,其值是一个字符串“Hello World.
”,直接这样定义:
#!/bin/sh
var="Hello World."
需要注意的是:变量名、等号和值之间是没有空格的。如果在等号前加上了空格,则var
会被当成单独的命令:
如果在等号后面加上等号,则“Hello World.”会被认为是一个单独的命令:
使用一个已定义的变量,直接在变量名前面添加“$
”符号就可以,如下所示:
#!/bin/sh
var="Hello World."
echo ${var}
如下图所示:
定义变量的时候,变量名什么时候需要双引号?它和单引号之间又有什么区别?本节将揭晓答案。
如果变量值(value
)不包含任何空白字符(比如空格),则不需要双引号/单引号。比如:
但是如果value
包含空格,则必须使用双引号/单引号括起来。如下:
我们可以在echo
、printf
命令的双引号中引用变量值。比如:
使用双引号可饮用除字符$、反引号(`)、反斜线(\)外的任意字符或字符串。双引号不会阻止Shell对这3个字符作特殊处理(标示变量名、命令替换、反斜线转义)。
在2.2
节中可以看到,当value
中有空格时候,变量值可以使用双引号或单引号,但是这两者在某些情况下会有所差异。
引用变量时,通常建议用双引号将其名称括起来。这可以防止重新解释引用字符串中的所有特殊字符——除了$
、` (反引号)和 (转义)。 在双引号中保留$作为特殊字符允许引用带引号的变量 ( “$variable” ),也就是说,用变量的值替换变量。
使用双引号来防止分词。 用双引号括起来的参数将其自身显示为一个单词,即使它包含空格分隔符。
#!/bin/sh
var_1="test"
var_2='just a ${var_1}'
echo ${var_2}
var_3="hahaha"
echo '${var_2}\t${var_3}'
如下图所示:
单引号(' '
)的操作类似于双引号(" "
),但不允许引用变量,因为$
的特殊含义被关闭了。在单引号中,除'
以外的每个特殊字符都按字面意思解释。考虑单引号(“完整引用”)比双引号(“部分引用”)更严格的引用方法。
因为即使转义字符(\
)也会在单引号中得到字面解释,所以试图将单引号括在单引号中不会产生预期的结果。
反引号(` ,切换到拼音模式,ESC键下方按键)允许您将shell 命令的输出分配给变量。必须用反引号字符包围整个命令行命令:
// 7.sh
#!/bin/bash
date=`date`
echo "${date}"
变量date
接受date
命令的输出。
注意:在Shell中,还可以使用$(...)
语法代替反引号 (`),这具有可重入的优点。
Shell提供了一种使用read-only
命令将变量标记为只读的方法。当变量被标记为只读后,它的值将不能被修改。
如下所示:
#!/bin/bash
readonly name="lixiaogang"
echo ${name}
# 尝试对变量name的值进行修改,会收到报错提示信息
name="Kawhi Anthony Leonard"
echo ${name}
附:sh
中-x
参数可以调试打印Shell脚本的执行过程,调试必备选项参数。
Shell脚本支持删除一个已定义的变量的值,称为“删除变量(或取消设置)”,该功能由unset
命令完成,其使用方式如下:
unset variable_name
如下所示:
#!/bin/bash
name="lixiaogang"
echo ${name}
unset name
echo ${name}
当使用unset
命令取消name
的值后,再次打印该变量的值时,其结果为空。
unset
不能删除声明为readonly
的变量。
#!/bin/bash
readonly var="123"
echo ${var}
usnet var
var
是一个readonly
的变量,无法进行删除。
如果下一个字符有特殊含义,反斜线(\)可以屏蔽其特殊含义。下述字符包含有特殊意义:
& * + ^ $ ` " | ?
示例代码:
Shell脚本中使用一个已定义的变量,有下面三种方法:
"$var"
${var}
$var
本文详细讲解了Shell脚本中变量相关的知识,从变量的分类,再到变量相关的定义、引用、删除等概念。通过本文的学习,能够完全掌握Shell脚本中的变量知识。