Bash Strict Mode é definido da seguinte forma:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
http://redsymbol.net/articles/unofficial-bash-strict-mode/
Considere a seguinte análise de parâmetros posicionais em um script Bash:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
usage() {
echo ""
echo "usage:"
echo "$0 [options]"
echo " -r | --redirect-uri: redirect uri"
echo " -a | --app-role: app role id"
echo " -h | --help: help"
echo ""
}
redirect_uri=""
app_role=""
while [ "$1" != "" ]; do
case $1 in
-r | --redirect-uri)
shift
redirect_uri="$1"
;;
-a | --app-role)
shift
app_role="$1"
;;
-h | --help)
usage
exit 0
;;
*)
usage
exit 1
;;
esac
shift
done
...
Isso não funciona com o seguinte erro, por exemplo:
$ ./app.sh -r https://example.net:8080/auth/callback -a 53b37b21-2c6e-4731-a5e5-15b98052c686
./app.sh: line 18: $1: unbound variable
Acho que o motivo é a verificação final na while
condição, após shift
, onde $1
é indefinido.
Como posso encerrar a análise de parâmetros na while
instrução sem causar a falha do script ao usar o Bash Strict Mode?
Você recebe o
unbound variable
erro porque está tentando acessar$1
quando não está definido, o que não acontecerá após a última iteração dowhile
loop. Portanto, o comando problemático é o teste que você usa comwhile
:Em vez disso, use algo como
ou
A expansão do parâmetro
${parameter+word}
será expandida paraword
separameter
for uma variável existente (independentemente de ter um valor não vazio ou não). A palavraset
foi escolhida arbitrariamente, mas de uma forma que sugere para que serve.Você também pode testar em
$#
, que contém o número de parâmetros posicionais:ou
Estes são testes aritméticos que são verdadeiros sempre que houver parâmetros posicionais que ainda precisam ser processados e retirados da lista.
Qualquer uma dessas variações evita colidir com as restrições impostas pela
nounset
opção shell (set -u
).