Suponha que eu tenha definido uma variável como
number=123#456
e quero imprimi-lo sem o “123#” inicial. (Esse tipo de coisa acontece no zsh quando você está trabalhando com números em bases diferentes de 10.) A seção "Expansão de parâmetros" do manual diz:
${name#pattern}
${name##pattern}
Se o padrão corresponder ao início do valor de name , substitua o valor de name pela parte correspondente excluída; caso contrário, basta substituir o valor de name . Na primeira forma, o menor padrão de correspondência é preferido; na segunda forma, o maior padrão de correspondência é preferido.
Isso me sugere que eu deveria ser capaz de dizer
print ${number#123#}
para se livrar do “123#”, mas isso na verdade gera “3#456”. Descobri que posso obter o efeito desejado se escapar do “#” que estou tentando remover:
print ${number#123\#} # prints "456"
Qual era o significado especial que o “#” tinha antes de eu escapar dele?
#
é um operador glob que significa “zero ou mais ocorrências do caractere anterior ou grupo entre parênteses”. É a maneira zsh de escrever o*
operador regex. Portanto ,123#
combina12
no início123#456
ao fazer a correspondência mais curta (${number#123#}
) e corresponde123
ao fazer a correspondência mais longa (${number##123#}
).O
#
operador só está ativo quando aextended_glob
opção está definida. Esta opção não é definida por padrão, mas é comum configurá-la em sua configuração (porque é bastante útil e em grande parte não irritante), e é sempre definida durante a execução das funções de conclusão.