测试是否启用了通配符

测试是否启用了通配符

我知道我可以使用set +f和启用/禁用通配符set -f

但我如何测试它当前是否启用?

我可以创建一个具有唯一名称的文件,并测试是否存在具有与其匹配的模式的文件。不过,我希望有一个更清洁的解决方案。

答案1

如果您这样做set -f,或者以其他方式禁用通配:,$-将包含f

$ echo $-
himBHs
$ set -f
$ echo $-
fhimBHs
$ bash -fc 'echo $-'
fhBc

所以:

[[ $- = *f* ]]

或者:

case $- in
 *f*)  ... ;;
esac

答案2

至少bash,我不知道这是否是特定于 shell 的,您可以使用test -o <optname>.对应的选项名称-fnoglob这样你可以做这样的事情:

$ set -f
$ test -o noglob; echo $?
$ set +f
$ test -o noglob; echo $?

或者,在脚本中,

if [ -o noglob ]; then
    echo globbing disabled
else
    echo globbing enabled
fi

答案3

该变量$-包含当前标志。

所以你可以做

case "$-" in
   (*'f'*) echo "file globbing is disabled" ;;
   (*)     echo "file globbing is enabled" ;;
esac

答案4

有几种方法。

  • 最便携的测试正在扩展$-

    set -f; [ -z "${-##*f*}" ] && echo noglob set
    
  • 在 bash 和一些 shell 中:

    [ -o noglob ] && echo noglob
    
  • 对几个 shell 的测试是:

    set -o | grep noglob
    
  • 仅适用于 bash 的是:

    $ shopt -op noglob
    shopt -o noglob               # +o if globbing is active.
    
  • 而且,如果您需要静默测试:

    if shopt -oq noglob; then echo noglob set; fi
    
  • 您还可以通过 globbing 的作用来测试(非常便携):

    set -- .*; if [ "$#" -gt 1 ]; then echo glob active; fi
    

相关内容