shell中的变量
定义
变量的几个理解性定义
-
变量是值可以变化的,不可变化的叫常量,是一种特殊的变量。
-
变量是用于存储数据值的名称。
-
变量定义时变量名只能由大小写,数字,下划线这3种类型的字符组成,首字符不能是数字,大写习惯用来表示常量。
-
变量名不能与内置的关键字相同,比如if,for等。
-
变量的调用通过$var_name实现,var_name就是定义的变量名称。
-
删除变量使用unset var_name实现
-
环境变量为由操作系统或用户设置的特殊变量,用于配置 Shell 的行为和影响其执行环境
-
变量值中如有双引号,可以使用转义符\放在双引号前面实现。
变量类型
一般shell中变量类型不做特殊声明,如有需求,也可以明确限制
变量定义限制
格式为declare [-aAfFgilrtux] [-p] [name[=value] ...]
-a:声明数组
-A:声明关联数组
-i:声明整型变量
-r:声明只读变量
-u/-l :将变量值转换为大写/小写
-x:将变量导出为环境变量
#!/bin/bash
# 定义一个只能存放整数的变量a,值设置为10
declare -i a
a=10
# 定义一个关联数组
declare -A a
# 为关联数组赋值
a['key1']=value1
特殊的declare -x说明
declare -x表示将该变量直接共享给当前shell的子进程
示例如下:
[root@k8s01 study-shell]# cat var-01.sh
#!/bin/bash
declare -x martin=abc
echo "parent display martin value is ${martin}"
bash -c "./var-02.sh"
./var-02.sh
[root@k8s01 study-shell]# cat var-02.sh
#!/bin/bash
echo "${martin:-defalt value 123}"
[root@k8s01 study-shell]# bash var-01.sh
parent display martin value is abc
abc
abc
[root@k8s01 study-shell]# bash var-02.sh
defalt value 123
[root@k8s01 study-shell]#
解释:如上在01中定义了一个共享变量martin,如果执行01,由于01中定义并共享了martin这个变量,所以执行02的时候可以打印出来变量值,但是如果直接执行02,则显示02中定义的默认值
默认值设置
当脚本中需要获取一个变量值,如果变量不存在,则会报错,为避免此种情况,可以在调用时设置默认值,当存在时取变量的值,不存在时取默认值。
使用方法如下
${var:-value}
解释
var为变量名称
:-为固定格式
value为默认值
样例
a='abc'
echo ${a:-111} # 由于a变量存在,所以返回a的值abc
unset a
echo ${b:-111} # 由于a变量被取消,即不存在,所以返回默认值111
特殊变量
系统默认有一些特殊变量的调用方法
$? 代表上一个命令或者函数的执行结果
$# 代表上一个命令或者函数的参数个数
$* 代表执行脚本传入参数的列表
$@ 表示获取执行脚本传入的所有参数
$$ 表示进程的id;Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
其中$@与$*正常情况下一样,当在脚本中将$*加上双引号作为“$*”引用时,此时将输入的所有参数当做一个整体字符串对待。比如输入参数有a b c三个参数,则“$*”表示“a b c”一个字符串。
$1 代表脚本的第一个参数,依此类推
$0 代表当前shell的文件名