如何在bash中创建类似于set的数组?

时间:2014-08-12 18:19:35

标签: bash

假设我有以下文件列表:

/aaa/bbb/file1.txt
/aaa/ccc/file2.txt
/aaa/bbb/file3.txt
/aaa/bbb/file4.txt
/aaa/ccc/file5.txt

我希望在阵列中拥有一组所有唯一的dirnames。结果数组看起来像这样:

dirs=( "/aaa/bbb" "/aaa/ccc" )

我想我可以做这样的事情,但感觉真的很冗长(原谅语法错误,我没有贝壳方便):

dirs=()
for f in filelist do
    dir=$(dirname $f)
    i=0
    while [$i -lt ${#dirs[@]} ]; do
        if [ dirs[$i] == $dir ]
            break
        fi
        i=$[i + 1]
    done
    if [ $i -eq ${dirs[@]} ]
        dirs+=($dir)
    fi
 done

1 个答案:

答案 0 :(得分:2)

使用关联数组:

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
  • 让我们在exec
  • 的最小子shell上保留不必要的叉子