Shell变量分为环境变量、自定义变量、特殊变量。
环境变量
环境变量又分为系统环境变量和用户环境变量,这些变量都写在配置文件中,Shell启动时加载配置。
全局配置文件
/etc/profile
/etc/profile.d/*.sh
/ect/bashrc
个人配置文件
~/.bash_profile
~/.bashrc
增加环境变量
编辑/etc/profile
export MY_NAME=mslh
重新加载配置文件
source /etc/profile
读取环境变量
# echo $MY_NAME
自定义变量
格式:变量名=变量值
注意点:
1. 变量名命名由字符、数字和下划线组成,不能以数字开头,不能使用关键字(系统占用的名称)。
2. 等号两边不能有空格。
3. 在bash环境中,所有变量默认都是字符串类型,无法直接进行数值运算。
4. 变量值中存在空格,需要使用双引号括起来。
局部变量
局部变量一般只能在同一个Shell、脚本、函数中使用。
增加局部变量(修改类似,不存在该变量则新增该变量)
# app_name=miselehe
使用变量,需要使用“$”开头
# echo $app_name miselehe # app_name_2=$app_name # echo $app_name_2 miselehe
删除变量,使用unset命令,并且变量不使用$开头
# unset app_name # echo $app_name
注意:shell中的任何变量$后都可以放到大括号“{}”中。
全局变量
定义全局变量和局部变量基本相同,只是全局变量需要使用export命令声明下。
举例:创建a.sh和b.sh,脚本a中创建局部变量var_a和全局变量var_b并执行脚本b,b中打印两个变量
# vim a.sh #!/bin/bash var_a=局部变量 export var_b=全局变量 # 执行脚本b.sh sh b.sh # vim b.sh #!/bin/bash echo 文件a.sh创建的局部变量'$var_a'=${var_a} echo 文件a.sh创建的全局变量'$var_b'=${var_b}
执行
# sh a.sh 文件a.sh创建的局部变量$var_a= 文件a.sh创建的全局变量$var_b=全局变量
可以看出b.sh可以调用a.sh定义的全局变量。
常量或只读变量
即定义后不能修改变量值的变量。使用readonly命令
# appName=mslh # echo $appName mslh # readonly appName # appName=miselehe -bash: appName: readonly variable # echo $appName mslh
只读常量不能使用unset删除,目前只能通过退出shell并重新登录
# unset appName -bash: unset: appName: cannot unset: readonly variable
脚本中更改只读变量会出错,终止脚本执行
vim /root/shell/readonlyvar.sh
#!/bin/bash # 这里定义一个变量 appName=mslh echo 定义的变量appName=${appName} # 将变量设置为只读变量 readonly appName # 尝试更改只读变量的值 appName=misilehe echo 尝试更改只读变量的值后appName=${appName}
执行
# sh readonlyvar.sh 定义的变量appName=mslh readonlyvar.sh: line 11: appName: readonly variable
特殊变量
$n 获取脚本执行时的参数
$0或${0} 获取当前脚本名称,在shell中表示获取shell的登录环境。
获取参数是从1开始的,使用方式${n}, 0-9可以省略大括号,10以后必须使用大括号
$# 获取参数个数
也可是使用${#}
$* 获取所有参数
$*和$@都是获取所有参数
区别:shell中的变量是可以放在双引号中的,并且双引号中的变量也会被解析
不使用双引号
功能相同,返回都内容都可以理解为字符串数组。
使用双引号
“$*” 获得结果为“$1 $2 $3” (所有变量值作为由空格分隔的一个大字符串)
“$@”获得结果为“$1” “$2” “$3” (可理解为字符串数组)
$? 户获取上一个命令退出状态码或函数的返回值
一般在进程或函数执行完成后,会调用exit方法,后可增加状态码“exit 状态码”,返回0 代表命令执行成功。
$$ 当前Shell进程的ID
在shell中执行脚本时,会新创建一个进程,所以在shell中获取的进程ID和脚本中的进程ID是不一样的。
举例: vim /root/shell/specialVariables.sh
#!/bin/bash # 双引号中的变量会被解析 echo "当前脚本进程号: $$" :<<! echo 命令 参数都为字符串可不使用双引号,可以存在空格 如果是定义变量,存在空格必须使用引号。 ! echo 上一个指令echo输出进程号退出状态码是: $? echo "当前脚本文件名称: $0" # 单引号内的变量不会被解析 echo '当前脚本参数总个数$#='$# echo 当前脚本第三个参数$3 echo 当前脚本第十个参数${10} echo '$*不使用双引号' for var in $* do echo $var done echo '$@不使用双引号' for var in $@ do echo $var done echo '$*'使用双引号 for var in "$*" do echo $var done echo '$@'使用双引号 for var in "$@" do echo $var done
执行
# sh specialVariables.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 当前脚本进程号: 121173 上一个指令echo输出进程号退出状态码是: 0 当前脚本文件名称: specialVariables.sh 当前脚本参数总个数$#=15 当前脚本第三个参数3 当前脚本第十个参数10 $*不使用双引号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $@不使用双引号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $*使用双引号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 $@使用双引号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
以上示例中可以看出 $* 和 $@ 在使用双引号后的不同。