这篇博客记录了自己平时遇到的一些Bash脚本中相关的实现方法, 做一个摘录和总结. 写它的目的绝对不是鼓励各位使用shell脚本(相当不鼓励), 只是为了表明shell脚本可以做许多操作.

bash二维数组

Bash本身是不支持二维数组的, 这个方法只是一个替代.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
test_version_arrays=(
'pkg_ver=(python2 redis==2.10.5 rq==0.6)'
'pkg_ver=(python2 redis==2.10.5 rq==0.9)'
'pkg_ver=(python2 redis==2.10.5 rq==0.13)'
'pkg_ver=(python2 redis==3.2.1 rq==0.13)'

'pkg_ver=(python3 redis==3.2.1 rq==0.13)'
'pkg_ver=(python3 redis==3.2.1 rq==1.0)'
)

for elt in "${test_version_arrays[@]}"
do
# 求出每个数组的
eval $elt;
for pkg in "${pkg_ver[@]:1}"
do
echo $pkg
done
done

for循环打印下标

Copy from: https://stackoverflow.com/a/6723516/5563477

1
2
3
4
foo=('s1' 's2' 's3')
for i in "${!foo[@]}"; do
printf "%s\t%s\n" "$i" "${foo[$i]}"
done

根据md5值对字符串去重

如果我们要将许多字符串去重并保存, 最先想到的方法应该是先将这些字符串去重, 再保存, 这里, 我们换一种思路, 先将文件保存, 再对这些文件去重.

1
2
3
4
5
6
7
8
9
10
11
12
13
arr=('str1' 'str1' 'str1' 'str1' 'str2' 'str3')

mkdir -pv tmp

for i in "${!arr[@]}"; do
echo "${arr[$i]}" > tmp/$i.txt
done

# 对所有文件md5sum求摘要, 排序, 找出相邻的一样的hash
md5sum tmp/* | \
sort | \
awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' |\
xargs rm -v

使用sed以及sort针对数组中的某一部分进行排序

1
2
3
4
5
6
arr=('version-1' 'version-2' 'version-3' 'version-39' 'version-13')

# 先使用sed, 将version-<num>中的num提取出来, 转换为<num>@version-<num>的形式, 再使用sort对@前面的值排序
data=($(for a in "${arr[@]}"; do echo "$a" | sed 's/.*version-\([0-9]*\)/\1@&/'; done | sort -t @ -k 1 -nr))

echo ${data[@]}