shell编程
变量的作用域
环境变量=全局变量
自定义变量=局部变量
1、全局变量:针对所有模块生效
2、文件中定义的变量,本模块文件中有效。
3、 函数内local命令定义的变量,仅函数内有效。
备注:文件中若想使用其他文件中的变量,需进行导入,命令:
.文件名 或 source 文件名
位置变量
命令行参数允许在运行脚本时向命令行传递参数
$0-$9,当超过$9后,必须在变量数字周围加花括号,对应关系如下
#./addem a b c d e f g h i g k .....
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11}...
$# 位置变量参数个数,从$1开始计算
$@ 参数列表,将所有位置参数当做同一字符串的多个独立单词,允许遍历。
$* 参数列表,将所有位置参数当做一个单词保存
${!#} 最后一个参数值
$$ 当前进程的进程号
tips:$@和$*在遍历时一定要使用引号引起来(因为变量内容中内含空格),如果不加引号,遍历时,无区别。
# ./hi.sh 1 "2 3" 4
遍历时不加引号,for循环遍历结果:
1
2
3
4
遍历时加引号,for循环遍历结果:
“$*”方式结果:
1 2 3 4
"$@"方式结果:
1
2 3
4
数组
数组是可以存储多个值的变量,shell支持一维数组
数字数组:索引值为数字,相当于python的列表
关联数组:索引值任意,相当于python的字典
数字数组
创建数字数组
方法1:数组名=(元素1 元素2 元素3...) #索引默认从0开始
方法2:数组名=([索引1]=元素值1 [索引2]=元素值2...)
推荐使用方法1
访问数组元素 {}方式
访问所有数组元素
${数组名[*]} #所有元素作为1个元素保存,不允许遍历
${数组名[@]} #所有元素作为独立的元素保存,允许遍历
访问单个数组元素
${数组名[索引值]}
切片方式访问数组元素
#mytest=(one two three)
1.整个数组切片
${数组名[@]:start[:offset]}
#echo ${mytest[@]:1:2} #索引1开始取
two three
2.单个元素内部切片
${数组名[索引值]:start[:offset]}
echo ${mytest[0]:0:2}
on
tips:
访问数组元素时,必须加{},否则得到的是第一个元素值(echo $数组名)
普通变量可看作只有一个元素的数组
hi='hello world'
echo ${hi[0]}
hello world
修改/增加元素
数组名[索引值]=value
数组元素个数
${#数组名[@]}
单个数组元素的长度
${#数组名[索引值]}
访问数组最后1个元素
${数组名[$(expr ${#数组名[@]} - 1)]} #红色部分得到最后一个元素的索引值
数组尾部增加一个元素new
方法1:数组名=("${数组名[@]}" "new")
方法2:数组名[${#数组名[@]}]="new"
数组也支持变量内容替换、删除等操作
eg:
#mytest=(one1 two2 one1 three3)
#echo ${mytest[@]##o*e} #删除元素开头位置符合o*e的元素内容(最长匹配)
1 two2 1 three3
关联数组
capital["Illinois"]="Springfield"
capital["Indiana"]="Indianapolis"
退出状态码
$? 上一命令执行的退出状态码,上一命令执行成功,返回0,不成功返回1-255,可使用echo $?取到
状态码 描述
0 命令成功结束
1 通用未知错误
2 误用shell命令
126 命令不可执行
127 没找到命令
128 无效退出参数
128+x linux信号x的严重错误
130 命令通过ctrl+C终止
255 退出状态码越界