【Shell技巧】以空格分隔的字符串解析成数组 Prefer mapfile or read -a to split command output (or quote to avoid splitting).
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选项。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix