目录
极简
array_name=(value1 value2 ... valuen)
array_name[0]=value0
数组元素值:${array_name[index]}
所有数组的元素: ${my_array[*]}"
数组元单元个数: ${#my_array[*]}"
key-value
declare -A array_name #关联数组一定要先定义
array_name["google"]="www.google.com"
array_name["index"]
获取数组的所有键:echo "键为: ${!site[*]}"
简述
Bash Shell 只支持一维数组(不支持多维数组)
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 ... valuen)也可以使用数字下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2读取数组元素值的一般格式是:
${array_name[index]}关联数组
declare -A array_name #关联数组一定要先定义
-A 选项就是用于声明一个关联数组。关联数组的键是唯一的。
以下实例我们创建一个关联数组 site,并创建不同的键值:
实例
declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")
我们也可以先声明一个关联数组,然后再设置键和值:实例
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"访问关联数组元素可以使用指定的键,格式如下:
array_name["index"]
获取数组中的所有元素
使用 @ 或 * 可以获取数组中的所有元素
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"获取数组长度的方法与获取字符串长度的方法相同
echo "数组的元素个数为: ${#my_array[*]}"
echo "数组的元素个数为: ${#my_array[@]}"获取数组的所有键
echo "数组的键为: ${!site[*]}"
echo "数组的键为: ${!site[@]}"
遍历数组
shell 数组遍历的3种方法
-
标准的for循环
-
for … in循环方法
-
While循环法
array=( A B C D 1 2 3 4)
for(( i=0;i<${#array[@]};i++)) #${#array[@]}数组长度do
echo ${array[i]};
done;
for element in ${array[@]} #也可以写成for element in ${array[*]}
do
echo $element
done
echo "2.2 遍历(带数组下标)"
for i in "${!array[@]}";
do
printf "%s\t%s\n" "$i" "${array[$i]}"
done
echo "3.While循环法"
i=0
while [ $i -lt ${#array[@]} ]
#当变量(下标)小于数组长度时进入循环体
do
echo ${array[$i]}
#按下标打印数组元素
let i++
done
遍历
cnt=${#my_array[@]}
for ((i=0;i < ${cnt};i++))
do
echo ${array_name[i]}
done
空数组
vim ./test.sh
#!/bin/bash
#
arry2=(That sa non empty array)
array3=()
array4=('')
#
ARRAY()
{
echo "Element of arry2 is:${array2[@]}."
echo "Element of array3 is:${array3[@]}."
echo "Element of array4 is:${array4[@]}."
}ARRAY
array3[0]="my"
array3[2]="u"ARRAY
array4[5]=9
echo "len of array3 is:${#array3[@]}."
echo "Element of array4 is:${array4[@]}."
echo "len of array4 is:${#array4[@]}."
[root@localhost vmshare]# ./test.sh
Element of arry2 is:.
Element of array3 is:.
Element of array4 is:.
Element of arry2 is:.
Element of array3 is:my u.
Element of array4 is:.
len of array3 is:2.
Element of array4 is: 9.
len of array4 is:2.
数组做参数
#!/bin/bash
function showArr(){
arr=($1)
for i in ${arr[*]};do
echo $i
done
}
regions=("GZ" "SH" "BJ")
showArr "${regions[*]}"
数组添加元素
(摘自:Shell数组添加元素及注意事项_lhttps://www.jb51.net/article/201792.htm)
方法1:
array_name+=(value1 ... valueN)
特点:不需要元素下标连续,可以添加多个元素,添加后元素下标不会重置,不存在元素覆盖的风险。
注意:唯一要注意的就是“+=”前后不能有空格
方法2:
array_name[index]=value
注意:如果 array_name[index]原本有值,会被覆盖
方法3:
array_name[${
#array_name[@]}]=value
#或array_name[${#array_name[*]}]=value
注意:此方法有一个前提,就是数组中的元素下标必须是连续的,否则会存在替换已有元素的风险。例如:
arr=([1]="a" [2]="b")
echo ${arr[@]}
arr[${#arr[@]}]="c"
echo ${arr[@]}
实际上并有添加元素,而是将下标为2的元素值“b”替换为了“c”。
方法4:
array_name=(
"${array_name[@]}"
value1 ... valueN)
这种方式不需要下标连续,可同时添加多个元素。
注意:
1、数组中原有元素的下标会重置,会从0开始变成连续的,如果不希望改变下标则不能使用这种方式。
2、双引号不能省略,否则,当数组array_name中存在包含空格的元素时会按空格将元素拆分成多个。
3、不能将“@”替换为“*”,虽然在输出数组元素时可以相互替换,如果替换为“*”,不加双引号时与“@”的表现一致,加双引号时,会将数组array_name中的所有元素作为一个元素添加到数组中。类似于特殊变量$@和$*的区别。
数组去重复
#!/bin/bash
#定义数组
arr=()
#用+ 的方式给数组添加
arr+=(3 5 8)
arr+=(4 5 3)
echo "去重前:"${arr[@]}
# 去重
arr=($(awk -v RS=' ' '!a[$1]++' <<< ${arr[@]}))
echo "去重后:"${arr[@]}shell 数组去重,去掉重复_https://blog.csdn.net/weixin_35795555/article/details/111312547
Shell数组拼接
array_new=(${array1[@]} ${array2[@]})
array_new=(${array1[*]} ${array2[*]})
(https://haicoder.net/shell/shell-array-contact.html)
判断数组是否包含某个元素
array=( element1 element2 element3 )
var="element1"
echo "${array[@]}" | grep -wq "$var" && echo "Yes" || echo "No"
推荐使用最原始的 安全可靠:
for i in ${array[@]} ;do [ "$i" == "$var" ] && echo "yes" ;done
网上其他方案的缺陷:
1)
[[ ${array[@]/${var}/} != ${array[@]} ]] && echo "Yes" || echo "No"
该方案遇到:
ARCHS=("aarch64" "x86_64" "auto")
[[ ${ARCHS[@]/${arch_specify}/} == ${ARCHS[@]} ]] && echo "Input arch error!should be one of:${ARCHS[@]}"
一旦入参是:aarch
aarch64/aarch=64
就变成:
+ [[ 64 x86_64 auto == aarch64 x86_64 auto ]]
Shell删除数组元素
unset 关键字来删除数组元素
unset array_name[index] #删除第index个
unset array_name #删除整个数组
根据元素删除
# 删除'b'
array=(a b c d a b c d)
array=( ${array[*]/b} ) #将*换成 @, 结果一致
从一个数组中排除另一个数组中的所有内容
# 需要从拟卸载的列表里排除的包,一般为BROS项目组发布其它的组件包
readonly EXCLUDELIST=(a b)
# 需要卸载的包的列表,此数组是为了卸载早期bros版本命名不规范可能留下的安装包
NEED2REMOVE=(a b c d a b c d)
# 从卸载列表中排除组件
function func_exclude_components(){
for((i=0; i<${#EXCLUDELIST[@]}; i++)); do
NEED2REMOVE=(${NEED2REMOVE[@]/${EXCLUDELIST[i]}})
done
}
func_exclude_components
echo ${NEED2REMOVE[@]}
#-------------------------
c d c d
摘自:shell 从数组中删除元素_https://blog.csdn.net/qq_29935433/article/details/122688370
关联数组
(摘自:shell脚本中实现数组变量-阿里云开发者社区 (aliyun.com)
关联数组与普通数组不同之处在于,关联数组的索引不再是默认的整数,而是由管理员自己定义
格式:数组名=([][][索引1]=元数值 [索引2]=元数值)
像存在的数组中增加索引:数组名+=([索引3]=元数值)
例如:userinfo=([user]=jiangxiaolong [age]=20 [sex]=boy)
userinfo+=([sy]=yunwei)
shuzu2=’([0]=“zero” [1]=“one” [2]=“two” [3]=“three” [4]=“four” [5]=“five” [6]=“six”)’
declare -a shuzu3=’([0]=“1” [1]=“2” [2]=“3” [3]=“4” [4]=“5” [5]=“6” [6]=“7” [7]=“linux shell” [20]=“tomcat”)
查看:
[root@localhost ~]# declare -a declare -a shuzu2='([0]="zero" [1]="one" [2]="two" [3]="three" [4]="four" [5]="five" [6]="six")' declare -a shuzu3='([0]="1" [1]="2" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7" [7]="linux shell" [20]="tomcat")'
访问数组元素:
[root@localhost ~]# echo ${array1[0]} 访问数组中的第一个元数 [root@localhost ~]# echo ${array1[@]} 访问数组中的所有元数,等同于echo ${array1[*]} [root@localhost ~]# echo ${#array1[@]} 统计数组中元素的个数 [root@localhost ~]# echo ${!arrar2[@]} 获取数组元数的索引 [root@localhost ~]# echo ${array1[@]:1} 从数组下标1开始,也就是除了索引位0,其余都会显示 [root@localhost ~]# echo ${array1[@]:1:2} 从数组下标1开始,访问两个元素,也就是从索引1开始往后显示2个
可以在CONFIG文件内:
# Installation prefix
CONFIG_PREFIX="/usr/local"
# Target architecture
CONFIG_ARCH=native
# Prefix for cross compilation
CONFIG_CROSS_PREFIX=
# Build with debug logging. Turn off for performance testing and normal usage
CONFIG_DEBUG=n
# Treat warnings as errors (fail the build on any warning).
CONFIG_WERROR=n
# Build with link-time optimization.
CONFIG_LTO=n
# Generate profile guided optimization data.
CONFIG_PGO_CAPTURE=n
# Use profile guided optimization data.
CONFIG_PGO_USE=n
# Build with code coverage instrumentation.
CONFIG_COVERAGE=n
# Build with Address Sanitizer enabled
然后:
sed -r 's/CONFIG_([[:alnum:]_]+)=(.*)/CONFIG[\1]=\2/g' ./CONFIG > ./CONFIG.sh
然后:
declare -A CONFIG #这句一定要有,很重要
source ./CONFIG.sh
echo ${CONFIG[ARCH]}
awk数据列存入数组
user_list=($(ps -ef|grep ora_pmon|grep -v grep| awk '{print $1}'))
cat > test.sh << 'EOF'
index_dir_map=()
index_kernels_map=()
orign=${IFS}
IFS=$'\n'
for line in $(tr -cd "[:print:]\n" < share_map.txt|grep -vE "^#|^$")
do
index=$(echo "$line"|awk '{print $1}')
dir=$(echo "$line"|awk '{print $2}')
kernels=$(echo "$line"|awk '{print $3}')
index_dir_map+=(["${index}"]="${dir}")
index_kernels_map+=(["${index}"]="${kernels}" )
echo "index_dir_map:len=${#index_dir_map[*]}****${!index_dir_map[*]}****${index_dir_map[*]}"
echo "index_kernels_map:len=${#index_kernels_map[*]}****${!index_kernels_map[*]}****${index_kernels_map[*]}"
done
IFS=${orign}
#列出所有键值对
for key in ${!index_dir_map[@]}
do
echo "${key} -> ${index_dir_map[$key]}"
done
#列出所有键值对
echo "index----->kernels"
for key in ${!index_kernels_map[@]}
do
echo "${key} -> ${index_kernels_map[$key]}"
done
EOF
chmod +x test.sh
./test.sh