Pertanyaan Bagaimana cara memeriksa apakah suatu variabel diatur dalam Bash?


Bagaimana saya tahu jika suatu variabel diatur dalam Bash?

Sebagai contoh, bagaimana cara memeriksa apakah pengguna memberikan parameter pertama ke fungsi?

function a {
    # if $1 is set ?
}

1067
2017-08-30 14:54


asal


Jawaban:


(Biasanya) Cara yang benar

if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

dimana ${var+x} adalah ekspansi parameter yang mengevaluasi apa-apa jika var tidak disetel, dan menggantikan string x jika tidak.

Kutipan Gangguan

Kutipan dapat dihilangkan (sehingga kita dapat mengatakannya ${var+x} dari pada "${var+x}") karena jaminan sintaks & penggunaan ini hanya akan diperluas ke sesuatu yang tidak memerlukan tanda kutip (karena meluas ke x (yang tidak mengandung jeda kata sehingga tidak membutuhkan tanda kutip), atau tidak ada (yang menghasilkan [ -z ], yang dengan mudah mengevaluasi ke nilai yang sama (benar) itu [ -z "" ] lakukan juga)).

Namun, sementara kutipan dapat dengan aman dihilangkan, dan itu tidak segera jelas bagi semua (itu bahkan tidak jelas penulis pertama dari penjelasan kutipan ini yang juga merupakan coder Bash utama), kadang-kadang lebih baik menulis solusi dengan tanda kutip sebagai [ -z "${var+x}" ], dengan biaya kemungkinan yang sangat kecil dari O (1) penalti kecepatan. Penulis pertama juga menambahkan ini sebagai komentar di sebelah kode menggunakan solusi ini memberikan URL untuk jawaban ini, yang sekarang juga termasuk penjelasan mengapa kutipan dapat dengan aman dihilangkan.

(Sering) dengan cara yang salah

if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi

Ini sering salah karena tidak membedakan antara variabel yang tidak diset dan variabel yang diatur ke string kosong. Artinya, jika var='', maka solusi di atas akan menampilkan "var kosong".

Perbedaan antara unset dan "set ke string kosong" sangat penting dalam situasi di mana pengguna harus menentukan ekstensi, atau daftar tambahan properti, dan yang tidak menetapkannya default ke nilai yang tidak kosong, sedangkan menentukan string kosong harus membuat skrip menggunakan ekstensi kosong atau daftar properti tambahan.

Perbedaannya mungkin tidak penting dalam setiap skenario. Dalam kasus itu [ -z "$var" ] akan baik-baik saja.


1596
2017-12-13 17:04



Untuk memeriksa variabel string non-null / non-nol, yaitu jika disetel, gunakan

if [ -n "$1" ]

Ini kebalikannya -z. Saya menemukan diri saya menggunakan -n lebih dari -z.


650
2017-08-30 15:17



Berikut ini cara menguji apakah parameter itu tidak disetel, atau kosong ("Null") atau diatur dengan nilai:

+--------------------+----------------------+-----------------+-----------------+
|                    |       parameter      |     parameter   |    parameter    |
|                    |   Set and Not Null   |   Set But Null  |      Unset      |
+--------------------+----------------------+-----------------+-----------------+
| ${parameter:-word} | substitute parameter | substitute word | substitute word |
| ${parameter-word}  | substitute parameter | substitute null | substitute word |
| ${parameter:=word} | substitute parameter | assign word     | assign word     |
| ${parameter=word}  | substitute parameter | substitute null | assign word     |
| ${parameter:?word} | substitute parameter | error, exit     | error, exit     |
| ${parameter?word}  | substitute parameter | substitute null | error, exit     |
| ${parameter:+word} | substitute word      | substitute null | substitute null |
| ${parameter+word}  | substitute word      | substitute word | substitute null |
+--------------------+----------------------+-----------------+-----------------+

Sumber: POSIX: Ekspansi Parameter:

Dalam semua kasus yang ditunjukkan dengan "pengganti", ekspresi diganti dengan nilai yang ditunjukkan. Dalam semua kasus yang ditunjukkan dengan "assign", parameter diberikan nilai itu, yang juga menggantikan ekspresi.


389
2018-05-25 20:20



Ada banyak cara untuk melakukan ini dengan mengikuti salah satunya:

if [ -z "$1" ]

Ini berhasil jika $ 1 bernilai nol atau tidak disetel


168
2017-08-30 15:00



Meskipun sebagian besar teknik yang disebutkan di sini benar, bash 4.2 mendukung tes yang sebenarnya untuk kehadiran variabel (bash manusia), daripada menguji nilai variabel.

[[ -v foo ]]; echo $?
# 1

foo=bar
[[ -v foo ]]; echo $?
# 0

foo=""
[[ -v foo ]]; echo $?
# 0

145
2017-07-09 02:28



Untuk melihat apakah suatu variabel tidak kosong, saya gunakan

if [[ $var ]]; then ...       # `$var' expands to a nonempty string

Tes sebaliknya jika variabel tidak disetel atau kosong:

if [[ ! $var ]]; then ...     # `$var' expands to the empty string (set or not)

Untuk melihat apakah suatu variabel diatur (kosong atau tidak kosong), saya gunakan

if [[ ${var+x} ]]; then ...   # `var' exists (empty or nonempty)
if [[ ${1+x} ]]; then ...     # Parameter 1 exists (empty or nonempty)

Tes sebaliknya jika variabel tidak disetel:

if [[ ! ${var+x} ]]; then ... # `var' is not set at all
if [[ ! ${1+x} ]]; then ...   # We were called with no arguments

54
2018-05-08 08:32



Saya selalu menemukan tabel POSIX di jawaban lainnya lambat untuk grok, jadi inilah pendapat saya tentang itu:

   +----------------------+------------+-----------------------+-----------------------+
   |   if VARIABLE is:    |    set     |         empty         |        unset          |
   +----------------------+------------+-----------------------+-----------------------+
 - |  ${VARIABLE-default} | $VARIABLE  |          ""           |       "default"       |
 = |  ${VARIABLE=default} | $VARIABLE  |          ""           | $(VARIABLE="default") |
 ? |  ${VARIABLE?default} | $VARIABLE  |          ""           |       exit 127        |
 + |  ${VARIABLE+default} | "default"  |       "default"       |          ""           |
   +----------------------+------------+-----------------------+-----------------------+
:- | ${VARIABLE:-default} | $VARIABLE  |       "default"       |       "default"       |
:= | ${VARIABLE:=default} | $VARIABLE  | $(VARIABLE="default") | $(VARIABLE="default") |
:? | ${VARIABLE:?default} | $VARIABLE  |       exit 127        |       exit 127        |
:+ | ${VARIABLE:+default} | "default"  |          ""           |          ""           |
   +----------------------+------------+-----------------------+-----------------------+

Perhatikan bahwa setiap kelompok (dengan dan tanpa tanda titik dua sebelumnya) memiliki yang sama set dan tidak disetel kasus, jadi satu-satunya hal yang berbeda adalah bagaimana kosong kasus ditangani.

Dengan kolon sebelumnya, kosong dan tidak disetel kasusnya identik, jadi saya akan menggunakannya jika mungkin (yaitu penggunaan :=, tidak hanya =, karena case kosong tidak konsisten).

Judul:

  • set cara VARIABLE tidak kosong (VARIABLE="something")
  • kosong cara VARIABLE kosong / null (VARIABLE="")
  • tidak disetel cara VARIABLE tidak ada (unset VARIABLE)

Nilai:

  • $VARIABLE berarti hasilnya adalah nilai asli dari variabel.
  • "default" berarti hasilnya adalah string pengganti yang disediakan.
  • "" berarti hasilnya nol (string kosong).
  • exit 127 berarti skrip berhenti mengeksekusi dengan kode keluar 127.
  • $(VARIABLE="default") berarti hasilnya adalah nilai asli dari variabel dan string pengganti yang disediakan ditugaskan ke variabel untuk penggunaan di masa mendatang.

30
2018-06-17 15:19



Pada versi modern Bash (4.2 atau yang lebih baru, saya pikir; saya tidak tahu pasti), saya akan mencoba ini:

if [ ! -v SOMEVARIABLE ] #note the lack of a $ sigil
then
    echo "Variable is unset"
elif [ -z "$SOMEVARIABLE" ]
then
    echo "Variable is set to an empty string"
else
    echo "Variable is set to some string"
fi

29
2017-08-26 16:24



if [ "$1" != "" ]; then
  echo \$1 is set
else
  echo \$1 is not set
fi

Meskipun untuk argumen biasanya terbaik untuk menguji $ #, yang merupakan jumlah argumen, menurut saya.

if [ $# -gt 0 ]; then
  echo \$1 is set
else
  echo \$1 is not set
fi

18
2017-08-30 15:00



Baca bagian "Ekspansi Parameter" pada bash halaman manual. Ekspansi parameter tidak memberikan pengujian umum untuk variabel yang ditetapkan, tetapi ada beberapa hal yang dapat Anda lakukan untuk parameter jika tidak disetel.

Sebagai contoh:

function a {
    first_arg=${1-foo}
    # rest of the function
}

akan diatur first_arg sama dengan $1 jika ditugaskan, selain itu menggunakan nilai "foo". Jika a benar-benar harus mengambil satu parameter, dan tidak ada default yang baik, Anda dapat keluar dengan pesan kesalahan ketika tidak ada parameter yang diberikan:

function a {
    : ${1?a must take a single argument}
    # rest of the function
}

(Perhatikan penggunaan : sebagai perintah null, yang hanya memperluas nilai-nilai argumennya. Kami tidak ingin melakukan apa pun dengan $1 dalam contoh ini, keluar saja jika tidak diatur)


14
2018-01-31 22:05