变量:储存单个元素的内存空间
数组:储存多个元素的连续的内存空间,相当于多个变量的集合
数组名和索引:
索引:编号从0开始,属于数值索引
注意:索引可支持自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持
bash的数组支持稀疏格式(索引不连续)
声明数组:
declare -a 数组名 数字数组
declare -A 数组名 自定义数组,关联数组
注意:两者不可相互转换
数组赋值
1)一次只赋值一个元素
数组名[索引]="值"
name[0]="man"
name[1]="won"
2)一次赋值全部元素
数组名=("值1" "值2" "值3")
name=("man" "won" "wang")
filename=(`ls /home/wang/bin`)
3)只赋值特定元素
name=([0]=man [2]=wang)
4)交互式数组值对赋值
read -a 数组名
5)在原有数组中新增一个元素
数组名[${#数组名[*]}]=新元素
name[$#name[*]]=zhang
显示所有数组:declare -a
引用数组
引用数组元素:
${数组名[索引]}
注意:省略[索引]表示引用索引0的元素
引用数组所有元素:
${数组名[*]}
${数组名[@]}
数组的长度(数组中元素的个数):
${#数组名[*]}
${#数组名[@]}
删除数组中的某元素:
unset 数组名[索引]
删除整个数组:
unset 数组名
字符串(var)切片 offset、length的取值在0到${#var}-1之间,bash4.2之后支持负数
${#var}:显示字符串长度
${var:offset}:跳过offset个,显示剩下部分
${var:offset:number}:跳过offset个,显示之后的number个
${var: -length}:显示倒数length个
${var:offset:-length}:跳过offset个和倒数length个,显示中间
${var: -length:-offset}:先取出倒数length个,结果再减去倒数offset个
基于模式取字符串
${var#*关键字}:从左开始,显示第1个关键字后面的内容
${var##*关键字}:从左开始,显示最后一个关键字后面的内容
file="var/log/mess"
${file#*/}:log/mess
${file##*/}:mess
${var%关键字*}:从右开始,显示第1个关键字后面的内容
${var%%关键字*}:从右开始,显示最后一个关键字后面的内容
file="var/log/mess"
${file%/*}:var/log
${file%%/*}:var
查找替代
${var/关键字/替代}:替代第一次匹配到的关键字
${var//关键字/替代}:替代所有匹配到的关键字
${var/#关键字/替代}:替代行首的关键字
${var/%关键字/替代}:替代行尾的关键字
查找删除
${var/关键字}:删除第一个关键字
${var//关键字}:删除所有关键字
${var/#关键字}:删除行首的关键字
${var/%关键字}:删除行尾的关键字
字符大小写转换
${var^^}:转换成大写
${var,,}:转换成小写
Shell变量一般是无类型的,但是bash Shell提供了decalre和type两个命令用户指定变量的类型,两个命令是等价的
declare -r 声明只读变量
-i 定义为整形数
-a 定义为数组
-A 定义为关联数组
-f 显示已定义的所有函数
-F 仅显示已定义的函数名
-x 声明全局变量和函数
-l 声明变量为小写字母
-u 声明变量为大写字母
eval 先扫描命令行进行置换,然后再执行置换后的命令;适用于那些一次扫描无法实现其功能的变量
n=10
eval echo {0..$n}
间接变量:第一个变量调用第二个变量的值
bash Shell提供了两种格式实现间接变量引用
eval tempvar=\$$variable1
或tempvar=${!variable1}
创建临时文件
mktemp tmpXXX 创建临时文件,最少XXX
mktemp -d 创建临时目录
-p 指明临时文件所存放目录位置
mktemp /tmp/testXXX
tmpdir=`mktemp -d /mnt/testdirXXX`
安装复制文件
install 源文件 目标
install -d /home/test 创建文件夹
install -m 修改权限,默认755
-o 修改所有者
-g 修改所属组
install -m 700 -o wang -g admins /etc/fstab /boot/fstab1
install -m 770 -d /data/filedir
例子:
生成10个随机数保存于数组中,并找出最大值和最小值
declare -i min max
declare -a nums
for((i=0;i<10;i++));do
nums[$i]=$RANDOM
[ $i -eq 0 ] && min=${nums[$i]} && max=${nums[$i]} && continue
[ ${nums[$i]} -gt $max ] && max=${nums[$i]}
[ ${nums[$i]} -lt $max ] && mix=${nums[$i]}
done
echo "All numbers are ${nums[*]}"
echo Max is $max
echo Min is $min