Is there an easy way to set nullglob for one glob

前端 未结 5 1083
谎友^
谎友^ 2021-02-03 23:22

In bash, if you do this:

mkdir /tmp/empty
array=(/tmp/empty/*)

you find that array now has one element, \"/tmp/empty/*\"

5条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2021-02-04 00:01

    With mapfile in Bash 4, you can load an array from a subshell with something like: mapfile array < <(shopt -s nullglob; for f in ./*; do echo "$f"; done). Full example:

    $ shopt nullglob
    nullglob        off
    $ find
    .
    ./bar baz
    ./qux quux
    $ mapfile array < <(shopt -s nullglob; for f in ./*; do echo "$f"; done)
    $ shopt nullglob
    nullglob        off
    $ echo ${#array[@]}
    2
    $ echo ${array[0]}
    bar baz
    $ echo ${array[1]}
    qux quux
    $ rm *
    $ mapfile array < <(shopt -s nullglob; for f in ./*; do echo "$f"; done)
    $ echo ${#array[@]}
    0
    
    • Be sure to glob with ./* instead of a bare * when using echo to print the file name
    • Doesn't work with newline characters in the filename :( as pointed out by derobert

    If you need to handle newlines in the filename, you will have to do the much more verbose:

    array=()
    while read -r -d $'\0'; do
        array+=("$REPLY")
    done < <(shopt -s nullglob; for f in ./*; do printf "$f\0"; done)
    

    But by this point, it may be simpler to follow the advice of one of the other answers.

提交回复
热议问题