遍历数组
当然,可以直接遍历数组进行匹配,例如:
初始化数组的另一种方法是,用其他命令输出的结果来填充到数组中,例如把 ls 命令输出的文件列表填充到数组中:
ARR=(`ls /opt/`)
for FILE in ${ARR[@]};
do
echo $FILE;
done
「2」遍历数组方法为:
for NUM in ${ARR[*]}
do
echo $NUM
done
O(n2)的普通搜索
#普通的搜索方式,时间复杂度O(N2)
for e in ${element[*]}
do
for s in ${search[*]}
do
if [ $e = $s ]; then
echo "找到$e"
break
fi
done
done
O(1)的关联数组搜索
#关联数组方式
declare -A newsearch
for s in ${search[*]}
do
newsearch[$s]=1
done
#KEY值唯一性,时间复杂度O(1)
for e in ${element[*]}
do
if [ ${newsearch[$e]} -eq 1 ]; then
echo "找到$e"
fi
done
语法匹配
(存在瑕疵,更具自己项目使用情况来避免bug)
操作关联数组的语法
关联数组的操作语法和数组的操作语法完全一致,如下列出常见的操作。
语法 | 描述 |
${!array[*]} | 取关联数组所有键 |
${!array[@]} | 取关联数组所有键 |
${array[*]} | 取关联数组所有值 |
${array[@]} | 取关联数组所有值 |
${#array[*]} | 关联数组的长度 |
${#array[@]} | 关联数组的长度 |
语法格式: [[ "${array[@]}" =~ "字符串" ]]
#!/bin/sh
##数组
array=(
address
base
cart
company
store
)
# $1 如果存在,输出 $1 exists,$1 如果不存在,输出 $1 not exists
if [ "$1" != "" ];then
if [[ "${array[@]}" =~ "${1}" ]]; then
echo "$1 exists"
elif [[ ! "${array[@]}" =~ "${1}" ]]; then
echo "$1 not exists"
fi
else
echo "请传入一个参数"
fi
问题:包含关系也能通过(add匹配address通过)
1扩展:
这种方式不仅可以判断字符串是否存在数组中,也快判断字符串是否存在一个文本中。
## 判断字符串是否存在文本中
#!/bin/sh
names="I like you. Do you like me"
if [[ "${names[@]}" =~ "me" ]]; then
echo '字符串存在'
fi
2扩展:
判断一个指定的字符串是否在该数组中:
grep:
- -w 或 --word-regexp : 只显示全字符合的列。
- -q 或 --quiet或--silent : 不显示任何信息。
if echo "${ARR[@]}" | grep -wq "item_1" &>/dev/null; then
echo "Found"
fi