一问弄懂Shell变量四大分类

寻技术 Linux / 其他编程 2023年07月11日 99

上一篇我们讲述了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编程的基础,灵活恰当的使用变量可以简化脚本复杂度,提高脚本运行效率和可读性。

关闭

用微信“扫一扫”