Arrays 用\|作为分隔符连接bash脚本中的数组

Arrays 用\|作为分隔符连接bash脚本中的数组,arrays,bash,join,ifs,Arrays,Bash,Join,Ifs,我的bash脚本中有一个带有PID的数组。我想用\|作为分隔符加入这些,以便能够使用grep搜索与数组中任何PID匹配的任何内容。我基本上是在尝试更改IFS,如下所示,但我遇到的问题是,不是期望的输出: GREP_ARG='29126\|27435' 我明白了 GREP_ARG='29126\27435'. 这是我正在使用的代码 function join { local IFS="$1"; shift; echo "$*"; } GREP_ARG=$(join '\|' "${

我的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
我曾尝试以各种方式更改输入,但没有任何效果。国际单项体育联合会的做法不可能吗?

你可以这样做

GREP_ARG=$(printf "\|%s" "${PID_ARRAY[@]}")
GREP_ARG=${GREP_ARG: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
另一个不需要子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
安全地执行这些参数,否则更好的方法是使用递归管道函数,但这已经与主题不同。不过,您可以参考。

需要一些解释。@TomZych语法函数在中已经解释得很好了。添加更多细节会非常有帮助,是的,但这仍然是可选的。如果他试着自己去理解,这对Op也会很有帮助。
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[@]}"