Bash删除参数字符串列表中的重复项$@
在bashshell脚本中,我收到了$@中的参数列表,它们是:abcdace 根据论点的不同,我需要对案例结构做一些具体的事情。 但我只想做一个b c d e 我应该只使用bash而不使用任何其他语言…例如,我可以使用awkBash删除参数字符串列表中的重复项$@,bash,duplicates,Bash,Duplicates,在bashshell脚本中,我收到了$@中的参数列表,它们是:abcdace 根据论点的不同,我需要对案例结构做一些具体的事情。 但我只想做一个b c d e 我应该只使用bash而不使用任何其他语言…例如,我可以使用awk for argument in "$@" do case $argument in a) ..... 我尝试过很多事情,但都没有成功 非常感谢的任何帮助使用关联数组跟踪您已经看到的参数。注意,这需要bash4.0或更高版本;苹果发布的3.2.x
for argument in "$@"
do
case $argument in
a)
.....
我尝试过很多事情,但都没有成功
非常感谢的任何帮助使用关联数组跟踪您已经看到的参数。注意,这需要bash4.0或更高版本;苹果发布的3.2.x版本太旧了,因为它只支持数字索引数组(
declare-a
,但不支持declare-a
)
您可以打印,然后排序唯一,然后打印引用的列表并重新计算为参数。使用GNU工具:
set -- a b c d a c e
tmp=$(printf "%s\0" "$@" | sort -uz | xargs -0 printf "%q ")
eval set -- "$tmp"
顺便说一句,最好是展示一件你尝试过的具体事情,而不是仅仅说“很多事情”。(可能会显示一个,并简要描述其他几个——了解您尝试的内容会为我们提供很多上下文,以便构建更好的答案)。如果
xargs
调用/usr/bin/printf
,则不能保证它支持%q
;这是特定于bash和ksh中的shell内置printf的(除非它是最近添加的coreutils,而且我一直没有跟上,但即使这样,它还是以GNU为中心的)……说得很清楚,我不认为这总体上是一种不好的方法;如果你做了arr=();而IFS=read-r-d“”项;do arr+=(“$item”);done<(同样作为一项规则,我总是推荐eval“set--$tmp”
而不是eval set--“$tmp”
,只是为了让代码的读者更清楚eval
是如何工作的,即使它们在当前情况下功能相同)。如果您不关心参数的显示顺序,您可以使用set--“${!seen[@]}”
从seen
的键设置argv,而不是使用单独的阵列dedupled
。
set -- a b c d a c e
tmp=$(printf "%s\0" "$@" | sort -uz | xargs -0 printf "%q ")
eval set -- "$tmp"