SHELL-数组
数组
数组声明
- 数组元素通过空格符分割
- 数组下标(索引)从0开始
# 方式1
arr=(
value1
value2
value3
)
# 方式2
arr=(value1 value2 value3)
# 方式3
arr[0]=value1
arr[1]=value2
arr[2]=value3
# 方式4
arr=([0]=value1 [1]=value2 [2]=value3)
# 方式5
str="value1 value2 value3"
arr=($str)
数组长度
${#数组名[*]}
或${#数组名[@]}
names=(one two three)
echo ${#names[*]}
echo ${#names[@]}
访问数组元素
数组通过下标访问元素
格式:${数组名[下标]}
,下标从0开始至${#names[@]}-1
names=(one two three)
echo names[0]
数组元素长度
names=(one two three)
# 方法1: ${#数组名[index]}
echo ${#names[0]}
# 方法2:expr length ${数组名[index]}
expr length ${names[0]}
# 方法3:wc -L
echo ${names[0]} |wc -L
# 方法4:
echo -n ${names[0]}|wc -c
# 方法5:
expr ${names[0]} : ".*"
# 方法6:
echo ${names[0]} |awk -F "" '{print NF}'
# 方法7:
echo ${names[0]} |awk '{print length($0)}'
数组遍历
names=(one two three)
# 按索引遍历
for ((i=0; i<${#names[@]}; i++)); do
echo ${names[$i]}
done
# 按元素遍历
for i in ${names[@]}; do
echo ${i}
done
切片
数组切片
格式:${array[@]:起始位置:长度},中间以":"隔开
names=(one two three four)
# 默认取第1个元素
echo ${names}
echo ${names[0]}
# 取全部元素
echo ${names[@]}
# 取索引为1至后面的所有元素
echo ${names[@]:1}
# 从索引为0开始,共取2个元素
echo ${names[@]:0:2}
echo ${names[@]::2}
# 从倒数第2个开始,共取N个元素
echo ${names[@]:(-2):1} # two
echo ${names[@]:(-2):2} # two three
数组元素切片
格式:${数组名[index]:起始位置:长度},中间以":"隔开
names=(one two three four)
echo ${names[2]:0}
echo ${names[2]:1:3} # hre
数组替换
- ${array[@]/x/y} : 最小匹配替换,每个元素只替换一次
- ${array[@]//x/y} : 最大匹配替换,每个元素可替换多次
- ${array[@]/x/} : 最小匹配删除,只删除一个符合规定的元素
- ${array[@]//x/} : 最大匹配删除,可删除多个符合规定的元素
- ${array[@]/#x/y} : 从左往右匹配替换,只替换每个元素最左边的字符
- ${array[@]/%x/y} : 从右往左匹配替换,只替换每个元素最右边的字符
names=(one two three four)
echo ${names[@]/e/E} # onE two thrEe four
echo ${names[@]//e/E} # onE two thrEE four
echo ${names[@]/e/} # on two thre four
echo ${names[@]//e/} # on two thr four
echo ${names[@]/#o/O} # One two three four
echo ${names[@]/%o/O} # one twO three four
数组删除
#
: 每个元素,从左向右进行最短匹配##
: 每个元素,从左向右进行最长匹配- % : 每个元素,从右向左进行最短匹配
- %% : 每个元素,从右向左进行最长匹配
list=(book food)
echo ${list[@]#b*o} # ok food
echo ${list[@]##b*o} # k food
echo ${list[@]%o*d} # book fo
echo ${list[@]%%o*d} # book f