使用\ |加入bash脚本中的数组作为分隔符

时间:2014-07-09 10:07:18

标签: arrays bash join ifs

我没有使用bash脚本很长时间,所以请原谅我这是一个微不足道的问题。

我的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方法不可能吗?

3 个答案:

答案 0 :(得分:1)

你可以做到

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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