Shell数组
Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:
array_name=(value1 value2 ... valuen)
我们来看一个例子:
SERVERS=("10.98.200.198" "10.98.200.197" "10.96.180.204")
读取进程号赋值到数组中
然后,我们来把数组赋值搞复杂点:
#!/bin/bash
# 给 pid 数组赋值
pid_array=($(pgrep mongo | awk '{printf $1" "}'))
# 遍历 pid 数组
for i in ${!pid_array[*]}; do
echo "$i -> ${pid_array[$i]}"
done
mongo 是进程中的关键字,也可以换成 java 等
pgrep mongo | awk '{printf $1" "}'
会输出一串以空格为分隔符的字符串
上面的 Shell Bash 代码是可以运行的,但是 ShellCheck 会提示 Prefer mapfile or read -a to split command output (or quote to avoid splitting).
详见 Wiki SC2207
修改意见
( "$(mycommand)" )
先来说一种特殊的方法 ———— 用双引号包裹 $()
,即 ("$(...)")
,仅适合只有一个元素的数组
也就是说,当 pgrep mongo | awk '{printf $1" "}'
结果是 26826
,可以使用 √;
但是,当 pgrep mongo | awk '{printf $1" "}'
结果是 26826 26873 26918 26967 28514
,使用 "$(...)"
不正确 X;
IFS=" " read -r -a array <<< "$(mycommand)"
针对上述情况,输出的一行内有多个关键字(并以空格分隔),推荐以下方法:
#!/bin/bash
pid_array=()
IFS=" " read -ra pid_array <<< "$(pgrep mongo | awk '{printf $1" "}')"
# 遍历 pid 数组
for i in ${!pid_array[*]}; do
echo "$i -> ${pid_array[$i]}"
done
read 参数:
-a :将内容读入到数组中
-r :在参数输入中,我们可以使用\
表示没有输入完,换行继续输入,如果我们需要行最后的\
作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望\n
这类特殊字符生效,也应采用-r选项。