Eu costumava usar expansão sem aspas $variable
quando variable
armazenava sinalizadores de compilador, mas aprendi recentemente que metacaracteres glob como *
e ?
contidos variable
ainda são expandidos, por exemplo
$ f='*'
$ echo $f
foo.bash
Existe uma maneira portátil de apenas executar a divisão de campo sem globbing além do set -f
.
A maneira mais explícita que posso encontrar para fazer isso no bash é definir uma read_words
função como essa, que preenche um nome de matriz com o conteúdo de uma string passada como argumento e depois usa ${arr[@]}
para expandir a string.
#!/bin/bash
count() {
printf '%s\n' "$#"
}
read_words() {
IFS=$' \t\n' read -a "$1" <<< "$2"
return 0
}
read_words arr 'a b *'
count "${arr[@]}"
set -f
é a maneira mais conveniente de obter divisão de campo sem globbing.Em
bash
, você pode testar se uma opção de shell já está definida com o-o
teste. Você pode, portanto, fazer isso:Isso detectaria o estado da
noglob
opção do shell (o nome longo paraset -f
). Se não estiver definido, é definido e umRETURN
trap é instalado. A armadilha irá desmarcar anoglob
opção de shell quando o script for concluído, se o script for originado . Se o script não for originado, a armadilha não fará nada.Nota interessante: um script de origem é muito parecido com uma função shell.
No Bash, você torna as
set
opções (conteúdo de$-
) locais para uma função comlocal -
. Ou você pode executar a parte que exigeset -f
um subshell, que deve ser portátil.ou