Arrays 用\|作为分隔符连接bash脚本中的数组
我的bash脚本中有一个带有PID的数组。我想用\|作为分隔符加入这些,以便能够使用grep搜索与数组中任何PID匹配的任何内容。我基本上是在尝试更改IFS,如下所示,但我遇到的问题是,不是期望的输出: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 '\|' "${
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[@]}"