GNU/Linux >> Belajar Linux >  >> Linux

Apakah Tes Bash Sangat Pemilih Tentang Spasi?

Sebagai programmer Java, saya menemukan bash ifthen membangun cukup membingungkan, terutama mengenai spasi. Adakah yang bisa menjelaskan mengapa yang pertama berhasil, tetapi tidak yang kedua atau ketiga?

#works
if [ -n $1 ]; then echo "parameterized"; fi

#output: ./links: Zeile 1: [-n: Kommando nicht gefunden.
if [-n $1 ]; then echo "parameterized"; fi

#output: ./links: Zeile 1: [: Fehlende `]'
if [ -n $1]; then echo "parameterized"; fi

Jawaban yang Diterima:

Inkonsistensi sebagian besar disebabkan oleh alasan historis.

Penggunaan tanda kurung sebagai perintah bersyarat muncul setelah penggunaan tanda kurung dalam pola wildcard. Jadi pada saat [ -n foo ] datang ke tempat kejadian, [foo] sudah berarti “file yang namanya f atau o ”. Sementara beberapa penggunaan operator tanda kurung dalam praktiknya akan bertentangan dengan penggunaan tanda kurung yang realistis di wildcard, penulis memilih untuk tidak mengambil risiko merusak skrip yang ada dengan mengubah sintaks. Pilihan desain ini juga membuat implementasi lebih mudah:awalnya [ diimplementasikan sebagai perintah eksternal, yang tidak dapat dilakukan jika spasi setelah [ telah opsional. (Sistem modern masih memiliki [ sebagai perintah eksternal tetapi hampir semua shell modern juga memilikinya.)

Untuk alasan yang sama, kode "berfungsi" Anda sebenarnya salah di sebagian besar situasi. $1 tidak berarti "nilai parameter 1":itu berarti "ambil nilai parameter 1, pisahkan menjadi kata-kata terpisah di spasi putih (atau berapa pun nilai IFS adalah), dan menafsirkan setiap kata sebagai pola glob”. Cara penulisan “nilai parameter 1” memerlukan tanda kutip ganda:"$1" . Lihat Kapan kutipan ganda diperlukan? untuk seluk beluk. Anda tidak perlu memahami ini; yang perlu Anda ingat adalah:selalu beri tanda kutip ganda di sekitar substitusi variabel "$foo" dan substitusi perintah "$(foo)" . Jadi:

if [ -n "$1" ]; then …

Di bash, ksh dan zsh, tetapi tidak di sh biasa, Anda juga dapat menggunakan tanda kurung ganda. Tanda kurung tunggal [ … ] diuraikan seperti perintah biasa (dan memang [ adalah perintah biasa, meskipun biasanya bawaan). Tanda kurung ganda adalah konstruksi sintaksis yang terpisah dan Anda dapat menghilangkan tanda kutip ganda hampir sepanjang waktu.

if [[ -n $1 ]]; then …

Namun, ada pengecualian:[[ "$foo" = "$bar" ]] untuk menguji apakah kedua variabel memiliki nilai yang sama memerlukan tanda kutip ganda di sekitar $bar , jika tidak $bar ditafsirkan sebagai pola wildcard. Sekali lagi, daripada mengingat detailnya, Anda sebaiknya menggunakan tanda kutip ganda setiap saat.

Terkait:Dimulai dengan argumen bash:-lt dan -gt?
Linux
  1. Apa yang perlu diketahui sysadmin tentang menggunakan Bash

  2. Kurung Dalam Kondisi Jika:Mengapa Saya Mendapatkan Kesalahan Sintaks Tanpa Spasi?

  3. Apa itu Pemisah Kata Readline?

  1. String Hilang Setelah Menggabungkan Dua Atau Lebih String Variabel Di Bash?

  2. Manakah Parameter/variabel Khusus Shell (bash)?

  3. Apa Perbedaan Mendasar Antara Kerang *nix Mainstream??

  1. Hapus spasi putih di setiap awal baris file, menggunakan bash

  2. Uji apakah string memiliki karakter non spasi di Bash

  3. Jalankan perintah bash pada pipa jenkins