shell数组操作

数组定义

#数值数组
arr_number=(1 2 3 4 5);

#字符串数组
arr_string=("abc" "edf" "ghi");
arr_string=('abc' 'edf' 'ghi');
arr_string=(abc edf ghi);

#返回值转换为数组
arr_return=$(ls /)  #ls命令返回值转数组
arr_return=(`cat $file`)  #cat读取文件返回值转数组

#更改分割符,通过变列环境变量IFS,注意临时变更需要及时恢复
OLD_IFS=$IFS   # 备份之前的分隔符环境变量
IFS=";"        # 指定分隔符为 ;
STR_LIST=(abc;edf;ghi)    # 将字符串以 ; 分割成数组
IFS=$OLD_IFS   # 恢复分隔符环境变量

数组操作

#取得数组的长度
arr_length=${#arr_number[*]}
arr_length=${#arr_number[@]}

#取得数组的有效索引值:${!数组名[@或*]}
echo ${!arr_number[@]}      # 0 1 2 3 4

#元素访问
#下标访问
echo ${arr_number[0]}       # 1
echo ${arr_string[1]}       #edf
#访问全部
echo ${arr_number[*]}       # 1 2 3 4 5
echo ${arr_number[@]}       # 1 2 3 4 5

#元素修改
arr_number[1]=98            #注意此处赋值语句没有$
echo ${arr_number[*]}       # 1 98 3 4 5

#元素添加
arr_number[9]=98                #索引号超出数组长度即可
arr_number[${#arr_number[*]}]=98 #添加至末尾,索引号连续
echo ${arr_number[*]}           # 1 2 3 4 5 98
array=("${arr_number[@]}" 98)   #此方法只能赋值给新变量
echo ${array}                   # 1 2 3 4 5 98

#元素删除
unset arr_number[1]        #删除下标为1(第二个)元素
unset arr_number           #删除整个数组

#分片访问:${数组名[@或*]:开始下标:长度}
echo ${arr_number[@]:1:4}       # 2 3 4 5

#模式替换:${数组名[@或*]/模式/新值}
echo ${arr_number[@]/2/98}      # 1 98 3 4 5
echo ${arr_string[@]/e*/98}     # abc 98 ghi

#遍历方法一:值
for v in ${arr_number[@]}; do
 echo $v;
done
#遍历方法二:下标
for i in ${#arr_number[@]}; do
 echo $i ${arr_number[$i]};
done

#连接两个数组(注意双引号的使用避免字符串中存在空格引起的问题)
array=("${arr_number[@]}" "${arr_string[@]}")
echo ${array[@]}               # 1 2 3 4 5 abc edf ghi

#复制一个数组(原理同上)
array=("${arr_number[@]}")

数组操作检索与判断

#数组中是否包含某个字符串
#方法一,通过遍列数组,使用 元素=~字符串判断
for item in ${item_arry[@]};
do
    if [ "${item}" =~ "abc" ]; then
        echo "abc is in array."
    fi
done
#方法二,echo ${array[*]}|grep -wq 字符串 判断
echo "${array[@]}" | grep -wq "abc" &&  echo "yes" || echo "no"

#数组中是否包含某个元素
#方法一,通过遍列数组,一一去比较
for item in ${item_arry[@]};
do
    if [ "${item}" == "abc" ]; then
        echo "abc is in array."
    fi
done
#方法二,通过元素替换操作,比较前后是不相等来判断
[[ ${array[@]/abc/} != ${array[@]} ]] && echo "Yes" || echo "No"

#找出数组中的重复元素
echo "${array[*]}"|tr ' ' '\n'|sort|uniq -d

#找出两个数组中重复的元素(并集)
echo "${array1[*] $array2[*]"|tr ' ' '\n'|sort|uniq -d

#找出两个数组中非重复的元素(差集)
echo "${array1[*] $array2[*]"|tr ' ' '\n'|sort|uniq -u

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值