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 salahku mendapat 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
bash
shell
shell-script
test
whitespace
Kumar1
sumber
sumber
[
. Selain itu, lihatlahelif
pernyataannya; itu akan membantu Anda membersihkan segalanya. Juga, titik koma setelah pernyataan if tidak diperlukan, tetapi juga tidak salah, hanya aneh.if [ ... ]; then
), jadi itu tidak biasa.Jawaban:
[
bukan metacharacter atau operator kontrol (bahkan bukan kata yang dilindungi undang-undang; sama untuk]
) sehingga diperlukan spasi di sekitarnya. Jika tidak shell "melihat" perintah[01=01]
bukan perintah[
dengan parameter yang terpisah01
,=
,01
, dan]
. Setiap operator dan operan perlu menjadi argumen terpisah untuk[
perintah, sehingga spasi juga diperlukan di sekitar operator.[$month="01"]
adalah pola wildcard yang cocok dengan salah satu karakter di$month
atau"01
. Jika tidak cocok dengan apa pun, dibiarkan sendiri.Jika ada titik koma setelah kurung tutup, Anda tidak perlu spasi sebelum itu, karena titik koma selalu menjadi bagian dari token yang terpisah.
Hal yang sama berlaku untuk sintaks braket ganda bash (dan ksh dan zsh).
Lebih dari satu syarat
Ada dua cara untuk menggabungkan kondisi:
dalam
[
dengan
[
perintah terpisah dikombinasikan dengan&&
atau||
Pengelompokan dengan tanda kurung mungkin lebih mudah di dalam
[
.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[
/]
:sumber
[
ketika-a
/-o
tidak digunakan selalu dapat diandalkan dengan kerang yang sesuai dengan POSIX. Tidak ada apapun keuntungan dalam menggunakan-a/-o
lebih&&/||
. Saya pasti akan mencegah penggunaannya. Perhatikan bahwa[[
ini bukan POSIX.Cara lain untuk menulisnya:
sumber
case
pernyataan. Jika Anda memiliki lebih dari satuelif
, Anda mungkin harus menggunakancase
.Jadi, inilah jawaban Anda:
Jadi, Anda harus meletakkan "spasi" antara braket persegi dan variabel / nilai.
sumber
==
bukannya standar=
.[
test
adalah=
.[
jika untuk tes, itu tidak melakukan tugas apa pun sehingga tidak perlu ambigu. Beberapa[
implementasi mendukung==
sebagai perpanjangan atas standar, tetapi tidak semua. The Bourne shell ini,ash
's,posh
' s[
s atau/bin/[
dari beberapa sistem misalnya tidak.==
ditambahkan olehksh
, saya kira untuk konsistensi dengan operator yang sama dalam(( ... ))
konstruk baru (yang memiliki = dan ==, tetapi tidak ada standar)