我没有使用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方法不可能吗?
答案 0 :(得分:1)
你可以做到
GREP_ARG=$(printf "\|%s" "${PID_ARRAY[@]}")
GREP_ARG=${GREP_ARG:2}
答案 1 :(得分:1)
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。