0

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

4

3 回答 3

2

你可以做

GREP_ARG=$(printf "\|%s" "${PID_ARRAY[@]}")
GREP_ARG=${GREP_ARG:2}
于 2014-07-09T10:15:48.647 回答
1

IFS在 BASH 中只支持单个字符。

您可以使用此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
于 2014-07-09T10:35:44.423 回答
0
function join {
    echo -n "$2"
    [[ $# -gt 2 ]] && printf "$1%s" "${@:3}"
}

另一个不需要子外壳的版本:

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[@]}"

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

于 2014-07-09T10:46:32.800 回答