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

  • 相关阅读:
    table拖动列宽
    解决 wm_concat函数 长度不够问题
    「Luogu」[JSOI2007]字符加密 解题报告
    Markdown数学符号
    「P5004」专心OI
    「CF242E」XOR on Segment 解题报告
    「CF86D」Powerful array 解题报告
    「USACO08JAN」电话线Telephone Lines 解题报告
    「Luogu P2015」二叉苹果树 解题报告
    「Luogu P3866」[TJOI2009]战争游戏 解题报告
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/16375783.html
Copyright © 2020-2023  润新知