GNU/Linux >> Belajar Linux >  >> Linux

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

Saya menggunakan skrip di bawah ini untuk mundur dua hari ketika skrip berjalan mulai dua hari dalam setahun dan juga memeriksa hari pertama dan kedua setiap bulan dan mundur dua hari.

if [$month="01"] && [$day="01"];
then
    date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
         date="$last_month/$yes_day/$last_year"
      fulldate="$last_month/$yes_day/$last_year"
else
   if [ $day = "01" ];
then
    date="$last_month/$yes_day/$year"
            fulldate="$year$last_month$yes_day"
else
        if [ $day = "02" ];
then
    date="$last_month/$yes_day/$year"
        fulldate="$year$last_month$yes_day"
else
    date="$month/$yes_day/$year"
        fulldate="$year$month$yes_day"
                fi
               fi
              fi
fi

Tapi sayangnya saya mendapatkan pesan kesalahan di bawah ini

Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found

Jawaban yang Diterima:

[ bukan metakarakter atau operator kontrol (bahkan bukan kata yang dicadangkan; sama untuk ] ) sehingga perlu spasi putih di sekitarnya. Jika tidak, shell “melihat” perintah [01=01] alih-alih perintah [ dengan parameter terpisah 01 , = , 01 , dan ] . Setiap operator dan operan harus menjadi argumen terpisah untuk [ perintah, jadi spasi juga diperlukan di sekitar operator.

if [ "$month" = "01" ]

[$month="01"] adalah pola wildcard yang cocok dengan salah satu karakter di $month atau "01 . Jika tidak cocok, dibiarkan saja.

Jika ada titik koma setelah tanda kurung tutup, Anda tidak perlu spasi di depannya, karena titik koma selalu merupakan bagian dari token yang terpisah.

if [ "$month" = "01" ]; then

Hal yang sama berlaku untuk sintaks braket ganda bash (dan ksh dan zsh).

Lebih dari satu syarat

Ada dua cara untuk menggabungkan kondisi:

  1. dalam [

  2. dengan [ yang terpisah perintah yang digabungkan dengan && atau ||

Pengelompokan dengan tanda kurung mungkin lebih mudah dalam [ .

if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or

if [ "$month" = "01" ] && [ "$day" = "01" ]

Yang pertama harus dihindari karena tidak dapat diandalkan (coba misalnya dengan month='!' ). Masalah dengan konten variabel aneh dapat dihindari dengan menggunakan string aman (jika ada) terlebih dahulu; atau dengan menggunakan [[ /]] bukannya [ /] :

if [ "01" = "$month" -a "01" = "$day" ]

Linux
  1. Tomcat mulai tanpa kesalahan tetapi tidak mendengarkan pada 8080

  2. Skrip shell berfungsi dengan baik tanpa garis shebang? Mengapa?

  3. Kiat agar buruh pelabuhan bekerja tanpa harus menjalankan `sudo docker -d` di Ubuntu 15.04

  1. Jalankan ls tanpa mendapatkan path lengkap

  2. Mengapa saya mendapatkan Izin Ditolak saat menjalankan ssh-add?

  3. Bagaimana saya bisa mengeluarkan perintah ke file, tanpa mendapatkan file kosong karena kesalahan?

  1. Mengapa Ekspansi Variabel Tanpa $ Bekerja Dalam Ekspresi?

  2. Periksa file konfigurasi Linux untuk kesalahan sintaks

  3. Mengapa fungsi utama tanpa pernyataan pengembalian mengembalikan nilai 12?