Gostaria de ter parâmetros padrão, ou seja, meu exemplo mínimo reproduzível é:
#!/usr/bin/zsh
a=${1:a}
printf 'a: "%s"\n' "${a}"
b=${2:./build}
printf 'b: "%s"\n' "${b}"
Eu esperaria ver, ao executar ./demo.zsh
sem argumentos:
a: "a"
b: "./build"
Em vez disso eu recebo
a: ""
./demo.zsh:4: bad floating point constant
- por que
${1:a}
parece assumir$1
que está definido e não é zero, mas o$a
expandido é uma string vazia? - de onde vem a análise incorreta de ponto flutuante? Se eu substituir
./build
porbuild
, ele reclama sobreb
ser um modificador desconhecido.
Se eu corro ./demo.zsh asdf bar
, eu ganho
a: "/tmp/fasf"
./demo.zsh:4: bad floating point constant
o que, francamente, é ainda mais confuso; /tmp/
de onde vem (é o cwd).
${1:a}
Esta sintaxe é incorreta para fornecer valores padrão. Ela tenta usar a como um modificador, o que não é o que você pretendia.As mensagens de erro
bad floating point constant
sãounknown modifier
devidas ao zsh tentando interpretara
e./build
como modificadores ou sintaxe especial, o que não são.Reproduzi o script com
Bash
, e ele deve funcionar da mesma maneira emZsh
.Saída 1:
Saída 2:
A sintaxe
${1:a}
não é a maneira correta de fornecer um valor padrão para um parâmetro posicional.Você deve usar
${1:-default}
para fornecer um valor padrão se o parâmetro não estiver definido ou for nulo.${1:-a}
Isso significa que se$1
não estiver definido ou for nulo, use a como valor padrão.${2:-./build}
Isso significa que se$2
não estiver definido ou for nulo, use./build
como valor padrão.Isto se baseia em um comentário de Stéphane .
No shell Zsh,
${1:a}
é o mesmo que$1:a
o que está$1
com o:a
modificador aplicado a ele. O:a
modificador está documentado emzshexpn(1)
:Portanto,
${1:a}
seria uma string vazia se$1
estiver vazio ou não definido. Seria um nome de caminho começando com/tmp/fasf
se$1
for alguma string não vazia e seu diretório atual fosse/tmp/fasf
.:.
não é um modificador válido no mesmo sentido que:a
é, mas a expansão${1:n}
seria válida para um inteiron
e retornaria o final da string em$1
, começando no deslocamenton
. Esta é uma herança doksh93
shell. Isso significa que, como.
não é um modificador válido, o shell tenta interpretá-lo como uma expressão aritmética para fins de computação de uma substring. É por isso que você obtém um erro para${2:./build}
, a string./build
não pode ser usada como um deslocamento.No final, o que você queria usar era um dos padrões
${1-a}
ou${1:-a}
expansões para fornecer um valor padrão caso$1
ele não esteja definido ou esteja vazio.