上一篇我们讲述了Shell的基本概念和运行方式,对Shell有了整体了解。如果说Shell是一栋大厦,那么变量便是一块块砖,是基础元素。Shell变量比可编译语言的变量更为复杂,种类更多,灵活性非常大,因此需要全面细致的把握。
Shell变量
什么是变量
变量是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量在几乎所有的程序设计语言中都有定义,并且其涵义也大同小异。
从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。 在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。 由于变量的值是在计算机的内存中,所以当计算机被重新启动后,变量的值将会丢失。因此,对于需要长久保存的数据,应该写入到磁盘中,避免存储在变量中。
shell变量定义
shell变量是一种用来存放数据的编程元素,它可以帮助我们简化很多工作 。shell变量的值可以是数字、字符串、文件名、命令的输出等。shell变量可以在shell脚本中使用,也可以在命令行中使用,可以被赋值、修改、删除、导出等。
shell变量赋值是使用等号(=)将变量的名称和变量的值连接起来,例如:name=Tom。注意,等号两边不能有空格,否则会出错。shell变量的赋值可以在命令行中进行,也可以在shell脚本中进行。shell变量的赋值可以覆盖之前的赋值,例如:name=Tom; name=Jerry。
shell变量使用时在变量的名称前加上美元符号$
,例如:echo $name
。这样就可以打印出变量的值。shell变量的使用可以在命令行中进行,也可以在shell脚本中进行。shell变量的使用可以和其他命令或字符串组合,例如:echo “My name is $name”。
shell变量分类
Shell变量可以分为以下几种类型:
- 环境变量(Environment Variable):环境变量是在Shell启动时由操作系统设置的,它们对于所有的Shell和Shell执行的程序都是可见的。一些常见的环境变量包括PATH、HOME、USER等。
- 本地变量(Local Variable):本地变量是由Shell程序定义的,仅在当前Shell会话中可见,对于其他的Shell和Shell执行的程序是不可见的。本地变量可以通过=符号来定义和赋值,例如myvar="hello"。
- 位置参数变量(Positional Parameter Variable):位置参数变量是用来存储Shell脚本的命令行参数的,它们包括
$1
、$2
、$3
等。例如,如果我们运行一个Shell脚本并且传递了两个参数,那么这两个参数会被分别赋值给$1
和$2
。 - 特殊变量(Special Variable):特殊变量是由Shell程序预定义的,用于存储一些特定的值或状态。例如,
$?
用于存储上一个命令的返回值,$$
用于存储当前Shell进程的PID,$IFS
用于存储当前Shell的字段分隔符等。
环境变量
常见变量
在Linux Shell中,有许多预定义的环境变量。以下是一些常见的环境变量及其用途:
-
PATH
:用于定义可执行文件的搜索路径。当我们输入一个命令时,Shell会在PATH变量指定的路径中搜索该命令的可执行文件。例如:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
-
HOME
:用于定义当前用户的主目录路径。该变量通常用于Shell脚本中,以便访问用户的主目录下的文件和目录。例如:
$ echo $HOME /home/myuser
-
USER
:用于定义当前登录用户的用户名。该变量通常用于Shell脚本中,以便获取当前脚本的执行者。例如:
$ echo $USER myuser
-
PS1
:用于定义Shell提示符的格式。该变量通常用于自定义Shell提示符的外观和行为。例如:
$ export PS1="[\e[32m]\u@\h:[\e[34m]\w[\e[0m]\$ "
定义一个带有颜色的Shell提示符,其中u
代表用户名,h
代表主机名,w
代表当前工作目录。
-
LANG
:用于定义当前系统的默认语言。该变量通常用于控制程序的本地化和国际化。例如:
$ echo $LANG en_US.UTF-8
-
PWD
:当前工作目录。例如:
$ echo $PWD /home/myuser
变量引用
在Shell脚本中,我们可以使用$符号来引用环境变量。例如:
#!/bin/bash echo "My home directory is $HOME" echo "My username is $USER" echo "My PATH is $PATH" echo "The value of MYVAR is $MYVAR"
执行后输出当前用户的主目录、用户名、PATH变量和MYVAR变量的值。
变量赋值
使用export命令可以将环境变量设置为全局变量,这样它们就可以在当前Shell会话中的所有进程中使用。例如:
$ export MYVAR="hello"
定义一个名为MYVAR的环境变量,并将其值设为hello。
同时,环境变量是可以重新赋值的,我们可以使用export命令将一个本地变量赋值给一个环境变量,或者直接在当前Shell会话中使用export命令重新赋值一个已经存在的环境变量。
例如,假设我们有一个名为MYVAR的环境变量,其当前值为hello。我们可以使用以下命令将一个本地变量myvar赋值给MYVAR环境变量:
$ myvar="world" $ export MYVAR=$myvar
把本地变量myvar的值world赋值给环境变量MYVAR,此时MYVAR的值为world。
同样地,我们也可以直接在当前Shell会话中使用export命令重新赋值一个已经存在的环境变量:
$ export MYVAR="world"
重新将MYVAR的值设置为world。
需要注意的是,一旦我们重新赋值了一个环境变量,该变量的新值将在当前Shell会话中生效,同时也会影响到当前Shell会话中的所有子进程和后续的Shell会话。因此,如果我们需要在一个Shell会话中重新赋值一个环境变量,需要谨慎考虑其可能会对系统中其他程序的运行产生的影响。
本地变量
变量定义
本地变量可以使用=符号进行定义和赋值。例如:
$ myvar="hello"
定义一个名为myvar的本地变量,并将其值设为hello。我们可以使用echo命令来输出该变量的值:
$ echo $myvar hello
本地变量只在当前Shell会话中可见,对于其他的Shell和Shell执行的程序是不可见的。
例如,如果我们在一个Shell会话中定义了一个本地变量:
$ myvar="hello"
那么在另一个Shell会话中,该变量是不存在的:
$ echo $myvar
变量引用
在Shell脚本中,我们可以使用$
符号来引用本地变量。例如:
#!/bin/bash myvar="hello" echo "The value of myvar is $myvar"
输出The value of myvar is hello
。
变量赋值
本地变量可以被重新赋值,例如:
$ myvar="hello" $ echo $myvar hello $ myvar="world" $ echo $myvar world $ unset myvar $ echo $myvar
定义一个名为myvar的本地变量,并将其值设为hello,然后将其重新赋值为world,最后使用unset命令删除该变量。
变量删除
shell变量的删除的方法是使用unset命令,例如:unset name,这样就可以删除变量的名称和变量的值。shell变量的删除可以在命令行中进行,也可以在shell脚本中进行,删除可以释放内存空间,避免变量名冲突。
unset命令语法:unset [选项] [name ...]
选项 | 含义 |
---|---|
-f | 仅删除函数 |
-v | 仅删除变量(不包括只读变量) |
-n | 删除具有引用属性的变量名(如果该选项存在) |
如果不加选项参数,那么既可以删除变量,也可以删除函数。
需要注意的是,unset命令不能删除只读变量。
位置参数变量
变量定义
在Shell编程中,位置参数变量用于获取脚本或函数的输入参数。当我们执行一个Shell脚本或函数时,我们可以将参数传递给该脚本或函数,并在其中使用位置参数变量来获取这些参数的值。
常见位置参数变量:
-
$0
:当前脚本或函数的名称。 -
$1
、$2
、$3
、...:当前脚本或函数的第一个、第二个、第三个参数,以此类推。 -
$#
:当前脚本或函数的参数个数。 -
$*
:当前脚本或函数的所有参数,作为一个字符串。 -
$@
:当前脚本或函数的所有参数,作为一个数组。
变量引用
下面是一个使用位置参数变量的示例脚本:
#!/bin/bash echo "The name of this script is: $0" echo "The first parameter is: $1" echo "The second parameter is: $2" echo "The third parameter is: $3" echo "The total number of parameters is: $#" echo "All the parameters are: $*" echo "All the parameters are: $@"
当我们执行该脚本并传递三个参数时,输出将如下所示:
$ ./script.sh hello world 123 The name of this script is: ./script.sh The first parameter is: hello The second parameter is: world The third parameter is: 123 The total number of parameters is: 3 All the parameters are: hello world 123 All the parameters are: hello world 123
我们可以看到,使用位置参数变量可以轻松地获取脚本或函数的输入参数,并对其进行处理和操作。位置参数变量适用于编写需要处理大量输入参数的脚本。
特殊变量
变量定义
在Shell编程中,有很多特殊变量可以用来获取各种系统信息和脚本信息,使用特殊变量能够简化代码复杂度,减少使用复杂代码来完成固定任务的情况,提升运行效率。
常见的特殊变量:
-
$$
:当前脚本或进程的进程ID。 -
$?
:上一个命令或脚本的退出状态码。 -
$!
:上一个后台进程的进程ID。 -
$USER
:当前用户的用户名。 -
$HOME
:当前用户的主目录路径。 -
$PATH
:当前系统的执行路径。 -
$PWD
:当前工作目录路径。 -
$SHELL
:当前使用的Shell程序路径。 -
$RANDOM
:一个0到32767之间的随机数。 -
$LINENO
:当前脚本的行号。 -
$IFS
:当前脚本的字段分隔符。 -
$PS1
:Shell提示符的格式。 -
$PS2
:Shell续行提示符的格式。
变量引用
下面是一个使用特殊变量的示例脚本:
#!/bin/bash echo "The process ID of this script is: $$" echo "The exit status of the last command is: $?" echo "The process ID of the last background job is: $!" echo "The current user is: $USER" echo "The home directory of the current user is: $HOME" echo "The current PATH is: $PATH" echo "The current working directory is: $PWD" echo "The current shell is: $SHELL" echo "A random number between 0 and 32767: $RANDOM" echo "The current line number is: $LINENO" echo "The current field separator is: $IFS"
当我们执行该脚本时,输出将如下所示:
The process ID of this script is: 1234
The exit status of the last command is: 0
The process ID of the last background job is:
The current user is: username
The home directory of the current user is: /home/username
The current PATH is: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
The current working directory is: /home/username
The current shell is: /bin/bash
A random number between 0 and 32767: 2373
The current line number is: 7
The current field separator is:
通过示例可以看到,使用特殊变量可以轻松地获取各种系统信息,并在脚本中使用它们来进行处理和操作。在实际编程中,特殊变量能够有效简化代码,提高执行效率,特别是在需要获取系统信息或处理系统事件的脚本中。
总结
Shell变量分为环境变量、本地变量、位置参数变量和特殊变量,实际使用中,四者有一定的重叠性。Shell变量是用好Shell编程的基础,灵活恰当的使用变量可以简化脚本复杂度,提高脚本运行效率和可读性。