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
posted @ 2020-08-10 20:18  KuBee  阅读(166)  评论(0编辑  收藏  举报