【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选项。

posted @   极客子羽  阅读(2644)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示