上一篇我们讲述了Shell的基本概念和运行方式,对Shell有了整体了解。如果说Shell是一栋大厦,那么变量便是一块块砖,是基础元素。Shell变量比可编译语言的变量更为复杂,种类更多,灵活性非常大,因此需要全面细致的把握。
变量是程序设计语言中的一个可以变化的量,当然,可以变化的是变量的值。变量在几乎所有的程序设计语言中都有定义,并且其涵义也大同小异。
从本质上讲,变量就是在程序中保存用户数据的一块内存空间,而变量名就是这块内存空间的地址。 在程序的执行过程中,保存数据的内存空间的内容可能会不断地发生变化,但是,代表内存地址的变量名却保持不变。 由于变量的值是在计算机的内存中,所以当计算机被重新启动后,变量的值将会丢失。因此,对于需要长久保存的数据,应该写入到磁盘中,避免存储在变量中。
shell变量是一种用来存放数据的编程元素,它可以帮助我们简化很多工作 。shell变量的值可以是数字、字符串、文件名、命令的输出等。shell变量可以在shell脚本中使用,也可以在命令行中使用,可以被赋值、修改、删除、导出等。
shell变量赋值是使用等号(=)将变量的名称和变量的值连接起来,例如:name=Tom。注意,等号两边不能有空格,否则会出错。shell变量的赋值可以在命令行中进行,也可以在shell脚本中进行。shell变量的赋值可以覆盖之前的赋值,例如:name=Tom; name=Jerry。
shell变量使用时在变量的名称前加上美元符号,例如:。这样就可以打印出变量的值。shell变量的使用可以在命令行中进行,也可以在shell脚本中进行。shell变量的使用可以和其他命令或字符串组合,例如:echo “My name is $name”。
Shell变量可以分为以下几种类型:
环境变量(Environment Variable):环境变量是在Shell启动时由操作系统设置的,它们对于所有的Shell和Shell执行的程序都是可见的。一些常见的环境变量包括PATH、HOME、USER等。本地变量(Local Variable):本地变量是由Shell程序定义的,仅在当前Shell会话中可见,对于其他的Shell和Shell执行的程序是不可见的。本地变量可以通过=符号来定义和赋值,例如myvar=”hello”。位置参数变量(Positional Parameter Variable):位置参数变量是用来存储Shell脚本的命令行参数的,它们包括、、等。例如,如果我们运行一个Shell脚本并且传递了两个参数,那么这两个参数会被分别赋值给和。特殊变量(Special Variable):特殊变量是由Shell程序预定义的,用于存储一些特定的值或状态。例如, 用于存储上一个命令的返回值,用于存储当前Shell进程的PID,用于存储当前Shell的字段分隔符等。
在Linux Shell中,有许多预定义的环境变量。以下是一些常见的环境变量及其用途:
:用于定义可执行文件的搜索路径。当我们输入一个命令时,Shell会在PATH变量指定的路径中搜索该命令的可执行文件。例如:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
:用于定义当前用户的主目录路径。该变量通常用于Shell脚本中,以便访问用户的主目录下的文件和目录。例如:
/home/myuser
:用于定义当前登录用户的用户名。该变量通常用于Shell脚本中,以便获取当前脚本的执行者。例如:
myuser
:用于定义Shell提示符的格式。该变量通常用于自定义Shell提示符的外观和行为。例如:
定义一个带有颜色的Shell提示符,其中代表用户名,代表主机名,代表当前工作目录。
:用于定义当前系统的默认语言。该变量通常用于控制程序的本地化和国际化。例如:
en_US.UTF-8
:当前工作目录。例如:
/home/myuser
在Shell脚本中,我们可以使用$符号来引用环境变量。例如:
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会话中的所有进程中使用。例如:
定义一个名为MYVAR的环境变量,并将其值设为hello。
同时,环境变量是可以重新赋值的,我们可以使用export命令将一个本地变量赋值给一个环境变量,或者直接在当前Shell会话中使用export命令重新赋值一个已经存在的环境变量。
例如,假设我们有一个名为MYVAR的环境变量,其当前值为hello。我们可以使用以下命令将一个本地变量myvar赋值给MYVAR环境变量:
$ export MYVAR=$myvar
把本地变量myvar的值world赋值给环境变量MYVAR,此时MYVAR的值为world。
同样地,我们也可以直接在当前Shell会话中使用export命令重新赋值一个已经存在的环境变量:
重新将MYVAR的值设置为world。
需要注意的是,一旦我们重新赋值了一个环境变量,该变量的新值将在当前Shell会话中生效,同时也会影响到当前Shell会话中的所有子进程和后续的Shell会话。因此,如果我们需要在一个Shell会话中重新赋值一个环境变量,需要谨慎考虑其可能会对系统中其他程序的运行产生的影响。
本地变量可以使用=符号进行定义和赋值。例如:
定义一个名为myvar的本地变量,并将其值设为hello。我们可以使用echo命令来输出该变量的值:
hello
本地变量只在当前Shell会话中可见,对于其他的Shell和Shell执行的程序是不可见的。
例如,如果我们在一个Shell会话中定义了一个本地变量:
那么在另一个Shell会话中,该变量是不存在的:
在Shell脚本中,我们可以使用符号来引用本地变量。例如:
myvar=”hello”
echo “The value of myvar is $myvar”
输出。
本地变量可以被重新赋值,例如:
$ 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脚本或函数时,我们可以将参数传递给该脚本或函数,并在其中使用位置参数变量来获取这些参数的值。
常见位置参数变量:
:当前脚本或函数的名称。、、、…:当前脚本或函数的第一个、第二个、第三个参数,以此类推。:当前脚本或函数的参数个数。:当前脚本或函数的所有参数,作为一个字符串。:当前脚本或函数的所有参数,作为一个数组。
下面是一个使用位置参数变量的示例脚本:
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: $@”
当我们执行该脚本并传递三个参数时,输出将如下所示:
The name of this script is: https://www.jb51.net/article/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。:当前用户的用户名。:当前用户的主目录路径。:当前系统的执行路径。:当前工作目录路径。:当前使用的Shell程序路径。:一个0到32767之间的随机数。:当前脚本的行号。:当前脚本的字段分隔符。:Shell提示符的格式。:Shell续行提示符的格式。
下面是一个使用特殊变量的示例脚本:
?
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编程的基础,灵活恰当的使用变量可以简化脚本复杂度,提高脚本运行效率和可读性。
到此这篇关于一问弄懂Shell变量四大分类的文章就介绍到这了,更多相关shell变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!