Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 - Fatal编程技术网

如何在bash中创建类似集合的数组?

如何在bash中创建类似集合的数组?,bash,Bash,假设我有以下文件列表: /aaa/bbb/file1.txt /aaa/ccc/file2.txt /aaa/bbb/file3.txt /aaa/bbb/file4.txt /aaa/ccc/file5.txt 我想要一组数组中所有唯一的dirname。生成的数组如下所示: dirs=( "/aaa/bbb" "/aaa/ccc" ) 我想我可以做类似的事情,但感觉非常冗长(请原谅语法错误,我手边没有shell): 使用关联数组: declare -A dirs for f in "${

假设我有以下文件列表:

/aaa/bbb/file1.txt
/aaa/ccc/file2.txt
/aaa/bbb/file3.txt
/aaa/bbb/file4.txt
/aaa/ccc/file5.txt
我想要一组数组中所有唯一的dirname。生成的数组如下所示:

dirs=( "/aaa/bbb" "/aaa/ccc" )
我想我可以做类似的事情,但感觉非常冗长(请原谅语法错误,我手边没有shell):


使用关联数组:

declare -A dirs

for f in "${filelist[@]}"; do
    dir=$(exec dirname "$f") ## Or dir=${f%/*}
    dirs[$dir]=$dir
done

printf '%s\n' "${dirs[@]}"
或者,如果输入来自文件:

readarray -t files < filelist
for f in "${files[@]}"; do
    dir=$(exec dirname "$f") ## Or dir=${f%/*}
    dirs[$dir]=$dir
done
readarray-t files
  • 让我们使用
    exec
    将不必要的分叉保持在子shell上

您不需要将值设置为
$dir
,只需按以下键:
dirs[$dir]=1
。然后,您可以使用
“${!dirs[@]}”
获取键列表,并使用
if[“${dirs[FOO]:-}”
测试
“FOO”
是否在集合中。@KeithThompson是的,我考虑过了。然而,我仍然选择添加值,并使用
“${dirs[@]}”
。在第二个示例中,您可以将该参数扩展应用于数组本身:“${files[@]/*}”中的文件的
(另外,为了降低复杂性,您将
f
file
)@KeithThompson混淆。当你想做其他事情时,比如
“${x[@]//something}”
@kojiro,在键上处理值会更容易。请看下面的内容,比较basename/dirname和变量替换
readarray -t files < filelist
for f in "${files[@]}"; do
    dir=$(exec dirname "$f") ## Or dir=${f%/*}
    dirs[$dir]=$dir
done