【问题标题】:Join array in bash script with \| as separator使用 \| 在 bash 脚本中加入数组作为分隔符
【发布时间】:2014-07-09 10:07:17
【问题描述】:

我的 bash 脚本中有一个带有 PID 的数组。我想加入这些 \|作为分隔符,以便能够使用 grep 搜索与数组中任何 PID 匹配的任何内容。我基本上是在尝试更改 IFS,如下所示,但我遇到的问题是,而不是所需的输出:

GREP_ARG='29126\|27435'

我明白了

GREP_ARG='29126\27435'. 

这是我正在使用的代码

function join {
    local IFS="$1"; shift; echo "$*";
}

GREP_ARG=$(join '\|' "${PID_ARRAY[@]}")

grep -A1 $GREP_ARG file

我尝试以各种方式更改输入,但没有任何效果。 IFS 方法不可能吗?

【问题讨论】:

    标签: arrays bash join ifs


    【解决方案1】:

    你可以的

    GREP_ARG=$(printf "\|%s" "${PID_ARRAY[@]}")
    GREP_ARG=${GREP_ARG:2}
    

    【讨论】:

      【解决方案2】:

      BASH 中的IFS 仅支持单个字符。

      您可以使用这个join 函数来获取任意长度的分隔符:

      function join {
         d="$1"
         shift
         arr=("$@")
         last=${arr[${#arr[@]}-1]}
         unset arr[${#arr[@]}-1]
         printf -v str "%s$d" "${arr[@]}"
         printf "%s%s" "$str" "$last"
      }
      

      然后称它为:

      join '\|' 29126 27435 56789; echo
      29126\|27435\|56789
      

      【讨论】:

        【解决方案3】:
        function join {
            echo -n "$2"
            [[ $# -gt 2 ]] && printf "$1%s" "${@:3}"
        }
        

        另一个不需要子shell的版本:

        function join {
            VAR=$1 SEP=$2
            local __A=$3 __B
            printf -v __B "${SEP}%s" "${@:4}"
            printf -v "$VAR" '%s' "$__A$__B"
        }
        
        join GREP_ARG '\|' "${PID_ARRAY[@]}"
        

        我发现你会对那些 GREP_ARG 执行eval。除非您真的知道如何使用 eval 安全地执行这些参数,否则更好的方法是使用递归管道函数,但这已经是与主题不同的上下文。但是,您可以参考similar topic

        【讨论】:

        • 可以做一点解释。
        • @TomZych 语法函数已经在Bash Manual 中进行了很好的解释。添加更多细节会很有帮助,是的,但这仍然是可选的。如果他尝试自己理解它,这对 Op 也很有帮助。
        猜你喜欢
        • 2020-05-08
        • 1970-01-01
        • 2013-08-05
        • 1970-01-01
        • 2016-09-26
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 2014-05-31
        相关资源
        最近更新 更多