变量
局部变量
局部变量就是指在某个Shell中生效的变量,对其他Shell来说无效,而且会随着当前Shell的消失而消失,局部变量的作用域被限定在声明它们的Shell中,可以使用local内建命令来“显式”的声明局部变量,但仅限于函数内使用。ronie@ronie-virtual-machine:~/Desktop$ a=1 ronie@ronie-virtual-machine:~/Desktop$ echo $a 1 ronie@ronie-virtual-machine:~/Desktop$ local b=2 bash: local: can only be used in a function ronie@ronie-virtual-machine:~/Desktop$
环境变量
环境变量通常又称“全局变量”,以区别于局部变量。在Shell脚本中,变量默认就是全局的,无论在脚本的任何位置声明,但是为了让子Shell继承当前Shell的变量,则可以使用export内建命令将其导出为环境变量。环境变量可用在创建变量的Shell和从该Shell派生的任意子Shell或进程中(使用export内建命令将变量导出为环境变量),因此,环境变量通常又被称作全局变量。环境变量被创建时所处的Shell被称为父Shell,如果在父Shell中再创建一个Shell,则该Shell被称作子Shell。当子Shell产生时,它会继承父Shell的环境变量为自己所用,所以说环境变量可从父Shell传给子Shell。环境变量只能向下传递而不能向上传递。
ronie@ronie-virtual-machine:~/Desktop$ a=1 ronie@ronie-virtual-machine:~/Desktop$ bash # 进入子shell ronie@ronie-virtual-machine:~/Desktop$ echo $a ronie@ronie-virtual-machine:~/Desktop$ exit # 退出子shell exit ronie@ronie-virtual-machine:~/Desktop$ export a=1 ronie@ronie-virtual-machine:~/Desktop$ bash ronie@ronie-virtual-machine:~/Desktop$ echo $a 1 ronie@ronie-virtual-machine:~/Desktop$
预设环境变量
$BASH:Bash Shell的全路径。
ronie@ronie-virtual-machine:~/Desktop$ echo $BASH /usr/bin/bash
$BASH_VERSION:Bash Shell的版本。
ronie@ronie-virtual-machine:~/Desktop$ echo $BASH_VERSION 5.1.16(1)-release
$CDPATH:用于快速进入某个目录。
ronie@ronie-virtual-machine:~/Desktop$ CDPATH='/usr/local' ronie@ronie-virtual-machine:~/Desktop$ cd bin /usr/local/bin ronie@ronie-virtual-machine:/usr/local/bin$
$EUID:记录当前用户的UID。
ronie@ronie-virtual-machine:~/Desktop$ echo $EUID 1000
$FUNCNAME:在用户函数体内部,记录当前函数体的函数名。
ronie@ronie-virtual-machine:~/Desktop$ vim bashLearn.sh #! /bin/bash ronie(){ echo $FUNCNAME; } ronie ronie@ronie-virtual-machine:~/Desktop$ chmod +x bashLearn.sh ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh ronie
$HISTCMD:记录下一条命令在history命令中的编号。
ronie@ronie-virtual-machine:~/Desktop$ history ...... 281 history ronie@ronie-virtual-machine:~/Desktop$ echo $HISTCMD 282 ronie@ronie-virtual-machine:~/Desktop$
$HISTFILE:记录history命令记录文件的位置。
ronie@ronie-virtual-machine:~/Desktop$ echo $HISTFILE /home/ronie/.bash_history ronie@ronie-virtual-machine:~/Desktop$
$HISTFILESIZE:设置HISTFILE文件记录命令的行数。
ronie@ronie-virtual-machine:~/Desktop$ echo $HISTFILESIZE 2000 ronie@ronie-virtual-machine:~/Desktop$
$HISTSIZE:Shell采用了命令缓冲区来记录所有已运行过的命令,在缓冲区满或退出Shell时才将缓冲区的记录写到HISTFILE文件中。缓冲区的大小使用HISTSIZE定义。
ronie@ronie-virtual-machine:~/Desktop$ echo $HISTSIZE 1000 ronie@ronie-virtual-machine:~/Desktop$
$HOSTNAME:展示主机名。
ronie@ronie-virtual-machine:~/Desktop$ echo $HOSTNAME ronie-virtual-machine ronie@ronie-virtual-machine:~/Desktop$
$HOSTTYPE:展示主机的架构
ronie@ronie-virtual-machine:~/Desktop$ echo $HOSTTYPE x86_64 ronie@ronie-virtual-machine:~/Desktop$
$MACHTYPE:主机类型的GNU标识,这种标识有统一的结构。一般来说是:主机架构-公司-系统-gnu
ronie@ronie-virtual-machine:~/Desktop$ echo $MACHTYPE x86_64-pc-linux-gnu ronie@ronie-virtual-machine:~/Desktop$
$LANG:设置当前系统的语言环境
ronie@ronie-virtual-machine:~/Desktop$ echo $LANG en_US.UTF-8 ronie@ronie-virtual-machine:~/Desktop$
$PWD:记录当前目录。
ronie@ronie-virtual-machine:~/Desktop$ echo $PWD /home/ronie/Desktop ronie@ronie-virtual-machine:~/Desktop$
$PATH:代表命令的搜索路径
ronie@ronie-virtual-machine:~/Desktop$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin ronie@ronie-virtual-machine:~/Desktop$
变量使用
- 变量命名:Shell中的变量必须以字母或者下划线开头,后面可以跟数字、字母和下划线,变量长度没有限制。
变量赋值
ronie@ronie-virtual-machine:~/Desktop$ name=ronie # 定义变量 ronie@ronie-virtual-machine:~/Desktop$ echo $name ronie ronie@ronie-virtual-machine:~/Desktop$ name='ronie' # 可以加单引号或双引号 ronie@ronie-virtual-machine:~/Desktop$ echo $name ronie ronie@ronie-virtual-machine:~/Desktop$ name=ronie ren # 变量有空格加引号 Command 'ren' not found, but there are 17 similar ones. ronie@ronie-virtual-machine:~/Desktop$ name='ronie ren' ronie@ronie-virtual-machine:~/Desktop$ echo $name ronie ren ronie@ronie-virtual-machine:~/Desktop$ name= 'ronie ren' # 等号两边不要有空格 ronie ren: command not found ronie@ronie-virtual-machine:~/Desktop$
- 变量取值:
ronie@ronie-virtual-machine:~/Desktop$ echo $name ronie ren ronie@ronie-virtual-machine:~/Desktop$ echo ${name} ronie ren ronie@ronie-virtual-machine:~/Desktop$ echo $namehello ronie@ronie-virtual-machine:~/Desktop$ echo ${name}hello ronie renhello ronie@ronie-virtual-machine:~/Desktop$ echo ${name} hello ronie ren hello ronie@ronie-virtual-machine:~/Desktop$ echo $name hello ronie ren hello ronie@ronie-virtual-machine:~/Desktop$ name2='$name' # 单引号会阻止shell解析特殊字符$ ronie@ronie-virtual-machine:~/Desktop$ echo $name2 $name ronie@ronie-virtual-machine:~/Desktop$ name2="$name" ronie@ronie-virtual-machine:~/Desktop$ echo $name2 ronie ren ronie@ronie-virtual-machine:~/Desktop$ name2=$name ronie@ronie-virtual-machine:~/Desktop$ echo $name2 ronie ren
- 取消变量:将变量从内存中释放
ronie@ronie-virtual-machine:~/Desktop$ unset name2 ronie@ronie-virtual-machine:~/Desktop$ echo $name2 ronie@ronie-virtual-machine:~/Desktop$
特殊变量
位置参数:Shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定。首先是“位置参数”,位置参数的命名简单直接,比如,脚本本身为$0,第一个参数为$1,第二个参数为$2,第三个为$3,以此类推。当位置参数的个数大于9时,需要用${}括起来标识。$#表示脚本参数的个数总和,$@或$*表示脚本的所有参数。
#! /bin/bash echo "script name: " $0; echo "args total: " $#; echo "arg 1: " $1; echo "arg 2: " $2; echo "arg 3: " $3; echo "arg 4: " $4; echo "all args: " $@;
ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh a1 b2 c3 d4 e5 script name: ./bashLearn.sh args total: 5 arg 1: a1 arg 2: b2 arg 3: c3 arg 4: d4 all args: a1 b2 c3 d4 e5
脚本或命令返回值:$?,$?永远是上一个命令的返回值,Linux中规定正常退出的命令和脚本应该以0作为其返回值,任何非0的返回值都表示命令未正确退出或未正常执行。
ronie@ronie-virtual-machine:~/Desktop$ ronie ronie: command not found ronie@ronie-virtual-machine:~/Desktop$ echo $? # 上一个命令的返回值为127 127 ronie@ronie-virtual-machine:~/Desktop$
变量作用域
Shell变量的作用域是在本Shell内,属于本Shell的全局变量,也就是从定义该变量的地方开始到Shell结束,或到主动使用unset删除了该变量的地方为止。在变量的作用域内,该变量都是可见的,在函数内对变量也是可以访问、可修改的。#! /bin/bash v=100 ronie(){ v=200; } echo $v; ronie; echo $v; ~
ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh 100 200 ronie@ronie-virtual-machine:~/Desktop$
用local指定其为只在函数内生效的“局部变量”,这样这些变量将只存在于局部的命名空间内,从而不会对全局变量有影响。
#! /bin/bash v=100 ronie(){ local v=200; } echo $v; ronie; echo $v; ~
ronie@ronie-virtual-machine:~/Desktop$ ./bashLearn.sh 100 100
Comments | NOTHING