Jeg skriver et shell-skript. I dette shell-skriptet har jeg en variabel som enten tar en standardverdi eller verdien til en miljøvariabel. Miljøvariabelen trenger imidlertid ikke å være til stede.
Anta for eksempel at jeg utfører følgende operasjon før jeg kjører skriptet:
export DEPLOY_ENV=dev
Hvordan ber jeg skriptet om å søke etter denne miljøvariabelen og lagre verdien i en variabel inne i skriptet. Videre, hvordan forteller jeg skriptet at hvis denne miljøvariabelen ikke eksisterer, lagre en standardvariabel?
[ -z "${DEPLOY_ENV}" ]
sjekker om DEPLOY_ENV
har lengde lik null. Så du kan kjøre:
if [[ -z "${DEPLOY_ENV}" ]]; then
MY_SCRIPT_VARIABLE="Some default value because DEPLOY_ENV is undefined"
else
MY_SCRIPT_VARIABLE="${DEPLOY_ENV}"
fi
# or using a short-hand version
[[ -z "${DEPLOY_ENV}" ]] && MyVar='default' || MyVar="${DEPLOY_ENV}"
# or even shorter use
MyVar="${DEPLOY_ENV:-default_value}"
Du kan bare bruke parameterutvidelse:
${parameter:-ord}
Hvis parameter ikke er angitt eller er null, erstattes utvidelsen av ord. Ellers erstattes verdien av parameter.
Så prøv dette:
var=${DEPLOY_ENV:-default_value}
Det finnes også formen ${parameter-ord}, som bare erstatter standardverdien når parameter ikke er angitt (men ikke når den er null).
For å demonstrere forskjellen mellom de to:
$ unset DEPLOY_ENV
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'"
'default_value' 'default_value'
$ DEPLOY_ENV=
$ echo "'${DEPLOY_ENV:-default_value}' '${DEPLOY_ENV-default_value}'"
'default_value' ''
Det er ingen forskjell mellom miljøvariabler og variabler i et skript. Miljøvariabler er bare definert tidligere, utenfor skriptet, før skriptet kalles. Fra skriptets synspunkt er en variabel en variabel.
Du kan sjekke om en variabel er definert:
if [ -z "$a" ]
then
echo "not defined"
else
echo "defined"
fi
og deretter angi en standardverdi for udefinerte variabler eller gjøre noe annet.
-z
sjekker for en null-lengde (dvs. tom) streng. Se man bash
og se etter avsnittet CONDITIONAL EXPRESSIONS.
Du kan også bruke set -u
i begynnelsen av skriptet ditt for å få det til å mislykkes når det støter på en udefinert variabel, hvis du vil unngå å ha en udefinert variabel som ødelegger ting på kreative måter.