Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash删除参数字符串列表中的重复项$@_Bash_Duplicates - Fatal编程技术网

Bash删除参数字符串列表中的重复项$@

Bash删除参数字符串列表中的重复项$@,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

在bashshell脚本中,我收到了$@中的参数列表,它们是:abcdace 根据论点的不同,我需要对案例结构做一些具体的事情。 但我只想做一个b c d e

我应该只使用bash而不使用任何其他语言…例如,我可以使用awk

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"