Pertanyaan Bagaimana cara memeriksa apakah ada variabel lingkungan dan mendapatkan nilainya? [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya sedang menulis skrip shell. Dalam skrip shell ini, saya memiliki variabel yang mengambil nilai default, atau nilai variabel lingkungan. Namun, variabel lingkungan tidak harus ada.

Misalnya, anggap, sebelum menjalankan skrip, saya melakukan operasi berikut:

export DEPLOY_ENV=dev

Bagaimana cara memberitahu skrip untuk mencari variabel lingkungan ini, dan menyimpan nilainya dalam variabel di dalam skrip. Selain itu, bagaimana cara memberitahu skrip bahwa jika variabel lingkungan ini tidak ada, simpan variabel default?


51
2017-09-02 15:55


asal


Jawaban:


[ -z "${DEPLOY_ENV}" ] periksa apakah DEPLOY_ENV memiliki panjang yang sama dengan nol. Jadi Anda bisa menjalankan:

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}"

104
2017-09-02 16:02



Anda hanya bisa menggunakan ekspansi parameter:

$ {parameter: -word}

Jika parameter tidak diset atau null, perluasan kata diganti. Jika tidak, nilai dari parameter diganti.

Jadi coba ini:

var=${DEPLOY_ENV:-default_value}

Ada juga itu $ {parameter-word} form, yang menggantikan nilai default hanya ketika parameter tidak disetel (tetapi tidak bila nol).

Untuk menunjukkan perbedaan antara keduanya:

$ 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' ''

39
2017-09-02 16:01



Jika Anda tidak peduli tentang perbedaan antara variabel unset atau variabel dengan nilai kosong, Anda dapat menggunakan ekspansi parameter nilai default:

foo=${DEPLOY_ENV:-default}

Jika kamu melakukan peduli tentang perbedaannya, jatuhkan usus besar

foo=${DEPLOY_ENV-default}

Anda juga bisa menggunakan -v operator untuk menguji secara eksplisit jika parameter ditetapkan.

if [[ ! -v DEPLOY_ENV ]]; then
    echo "DEPLOY_ENV is not set"
elif [[ -z "$DEPLOY_ENV" ]]; then
    echo "DEPLOY_ENV is set to the empty string"
else
    echo "DEPLOY_ENV has the value: $DEPLOY_ENV"
fi

11
2017-09-02 16:09



Tidak ada perbedaan antara variabel lingkungan dan variabel dalam skrip. Variabel lingkungan hanya ditentukan sebelumnya, di luar skrip, sebelum skrip dipanggil. Dari sudut pandang skrip, sebuah variabel adalah variabel.

Anda dapat memeriksa apakah suatu variabel didefinisikan:

if [ -z "$a" ]
then
    echo "not defined"
else 
    echo "defined"
fi

dan kemudian menetapkan nilai default untuk variabel yang tidak terdefinisi atau melakukan sesuatu yang lain.

Itu -z periksa string tanpa panjang (yaitu kosong). Lihat man bash dan cari bagian EKSPRESI KONDISI.

Anda juga bisa menggunakan set -u di awal skrip Anda untuk membuatnya gagal setelah menemukan variabel yang tidak terdefinisi, jika Anda ingin menghindari variabel yang tidak terdefinisi melanggar hal-hal dengan cara yang kreatif.


5
2017-09-02 16:02



NEW_VAR=""
if [[ ${ENV_VAR} && ${ENV_VAR-x} ]]; then
  NEW_VAR=${ENV_VAR}
else
  NEW_VAR="new value"
fi

1
2017-09-02 23:54



Semua jawaban berhasil. Namun, saya harus menambahkan variabel yang saya perlukan untuk mendapatkan file sudoers sebagai berikut:

sudo visudo
Defaults env_keep += "<var1>, <var2>, ..., <varn>"

0
2017-09-05 11:38