Masalah: Saya perlu memeriksa apakah hari ini hari Kamis dan melakukan tindakan yang berbeda berdasarkan hasil dari kondisi ini. Saya mencoba dua pendekatan berbeda:
Mendapatkan Nama Hari:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
Mendapatkan Jumlah Hari:
DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == 4];
then
echo YES
else
echo NO
fi
Dalam kedua kasus, outputnya adalah TIDAK, walaupun harus YA. Apa yang salah?
shell
shell-script
date
test
Swagatika
sumber
sumber
;
akan diperlukan jika Anda memilikithen
di baris yang sama denganif
. Dalam hal ini mereka berlebihan.Jawaban:
Masalahnya adalah kosong yang hilang.
Kode berikut akan bekerja di shell yang
[
perintah bawaannya menerima==
sebagai alias untuk=
:Namun perlu diingat (lihat
help test
dibash
):==
tidak disebutkan secara resmi, Anda harus menggunakan=
untuk membandingkan string-eq
dimaksudkan untuk tes aritmatika desimal (tidak akan membuat perbedaan di sini untukdate +%u
tetapi akandate +%d
misalnya ketika datang untuk membandingkan04
dan4
yang secara numerik sama tetapi berbeda secara leksikal).Saya akan lebih memilih:
Secara umum Anda harus memilih pendekatan angka hari , karena memiliki lebih sedikit ketergantungan ke lokal saat ini . Pada sistem saya, outputnya
date +"%a"
hari iniDo
.sumber
Jangan mengabaikan
case
yang seringkali merupakan cara yang lebih baik untuk melakukan hal-hal seperti ini:Berhati-hatilah juga bahwa keluaran dari
date +%a
bergantung pada lokal, jadi jika Anda mengharapkan nama-nama bahasa Inggris, skrip Anda akan berhenti berfungsi ketika dipanggil oleh pengguna Prancis atau Korea misalnya.Perhatikan bahwa di atas adalah salah satu kasus yang jarang terjadi di mana itu
$(...)
tidak perlu dikutip (meskipun kutipan tidak akan merugikan. Sama seperti divar="$(...)"
).sumber
Dalam ide yang sama, saya menggunakan kode berikut untuk "menonaktifkan" cron sebelum jam yang dipilih.
Tentu saja, saya lebih suka memodifikasi crontab itu sendiri ... jika saya diberikan hak yang diperlukan untuk :)
Berikut ini adalah tes sederhana yang membatalkan skrip bash kecuali kami di malam hari.
sumber
/usr/bin/test
alih-alih[
perintah bawaan shell ?cron
executable dibandingkan dengan crontab pengguna.-a
sudah usang ditest
. Secara standar, Anda akan menggunakan:hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ]
(atauhour=`date +%H`
jika Anda harus kompatibel dengan cangkang Bourne, yaitu Solaris 10 dan lebih tua dan mungkin beberapa penyatuan SCO yang langka saat ini)Untuk menghentikan skrip di hari minggu, hapus saja baris hari:
sumber
if [ "$DAYOFWEEK" -lt 7 ]
baik?Pertama, Anda harus mengutip tugas DAYOFWEEK = "$ (tanggal +% u)"
Dan Anda perlu memiliki ruang di setiap sisi tanda kurung [dan].
Semi-kolon di ujung garis mubazir.
sumber
a=$(echo 1 2 3); echo $a;
a=$(echo "1 2 3"); echo $a
dengan beberapa spasi di antara digit (StackExchange tidak akan membiarkan saya membuatnya menjadi copy-and-paste sederhana, sayangnya).