Haftanın gününe göre If-Else sorgusunu nasıl kullanabilirim?


10

Sorun: Bugün Perşembe olup olmadığını kontrol etmem ve bu durumun sonucuna göre farklı eylemler gerçekleştirmem gerekiyor. İki farklı yaklaşım denedim:

Gün İsmini Alma:

DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"]; 
then   
   echo YES
else
    echo NO
fi

Gün Sayısı:

DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK

if ["$DAYOFWEEK" == 4]; 
then
   echo YES
else
   echo NO
fi

Her iki durumda da, EVET olması gerekmesine rağmen çıktı NO'dur. Yanlış olan ne?


1
Bir yan not: ile aynı çizgide ;olsaydı, bunlar gerekli olurdu . Bu durumda gereksizdirler. thenif
manatwork

Yanıtlar:


12

Sorun eksik boşluk.

Aşağıdaki kod, [yerleşik komutu ==için takma ad olarak kabul edilen kabuklarda çalışır =:

if [ "$DAYOFWEEK" == 4 ];  then    echo YES; else    echo NO; fi

Ama akılda (bkz bulundurun help testiçinde bash):

  • ==resmi olarak bahsedilmez, =dize karşılaştırması için kullanmalısınız
  • -eqondalık aritmetik testler için tasarlanmıştır (burada bir fark yaratmaz, date +%uancak date +%dörneğin karşılaştırma söz konusu olduğunda 04ve 4bunlar sayısal olarak aynı ancak lexik olarak farklıdır).

Tercih ederim:

 if [ "${DAYOFWEEK}" -eq 4 ];  then    echo YES; else    echo NO; fi

Genellikle gün sayısı yaklaşımını tercih etmelisiniz , çünkü mevcut yerel ayara daha az bağımlıdır . Benim sistemimde çıktı date +"%a"bugün Do.


3

caseBu tür şeyleri yapmanın daha iyi bir yolu olan göz ardı etmeyin :

Ayrıca, çıktısının date +%ayerel ayara bağlı olduğuna dikkat edin , bu nedenle İngilizce adlarını bekliyorsanız, örneğin bir Fransız veya Koreli kullanıcı tarafından çağrıldığında komut dosyanız çalışmayı durduracaktır.

case $(LC_ALL=C date +%a) in
   (Mon) echo first day of the week;;
   (Thu) do-something;;
   (Sat|Sun) echo week-end;;
   (*) echo any other day;; # last ;; not necessary but doesn't harm
esac

Yukarıda, $(...)bunun alıntılanması gerekmeyen nadir durumlardan biri olduğunu unutmayın (tırnak işaretleri zarar vermeyecektir. İçindekilerle aynı var="$(...)").


0

Aynı fikirde, seçilen bir saat önce bir cron "devre dışı bırakmak" için aşağıdaki kod parçasını kullanıyorum
Tabii ki, crontab kendisini değiştirmek istiyorum ... eğer gerekli haklar verildi eğer :)

İşte geceleri olmadıkça bash betiğini iptal eden basit bir test.

# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if  /usr/bin/test `date '+%H'` -gt 2 -a `date '+%H'` -lt 7; then
  echo LETS_START_PROCESSING;
else
  exit;
fi

#Put job here

Neden /usr/bin/testkabuğun yerleşik [komutu yerine kullanılır ?
Stéphane Chazelas

@ Stéphane Chazelas 3,4,5,6 kullanmadım çünkü crontab'a erişimim yok. ( bu benim yazımın ikinci satırı :) Sunucularımız Claranet tarafından yönetiliyor ve biz zaten çalışan bir cron (şaka değil) almak için bir hafta bilet-ping-pong kaybettik. Bu yüzden elimizden geldiğince biletleri karıştırmaktan ve yeniden açmaktan kaçınırız :) Bu nedenle, günlük yerine saatlik bir cron görevi istedik ve tüm testlerimiz bitene kadar, göreve dokunmamak çok daha kolay olacak ve denetimlerimizi yürütülen komut dosyasına ekleyin.
Balmipour

Ah tamam, özür dilerim, cronçalıştırılabilir dosyayı kullanıcının crontab'ının aksine değiştirme hakkınız olmadığını düşündüm .
Stéphane Chazelas

Test sözdizimi Hakkında Stéphane Chazelas @, ben önce başka sunucuda senaryomu çalıştı çünkü [] veya [[]], ben nereye göre tercih olabilir Crontab'i kullanın. Crons'la çok fazla sürprizden sonra, mümkün olduğunca crontabs'ta mutlak yol kullanma alışkanlığım var. Biri testleri çirkin yaptığını söyleyebilir ve doğru olacak ... ama kabuk testinin her zaman çirkin olduğunu ve yine de doğru olacağını söyleyebilirim ^^ Benim için önemli olan, çoğunlukla bir basit kopyala / yapıştır ve bazı açıklamalar ekleyin.
Balmipour

1
-aBölümünde kullanımdan kaldırıldığını unutmayın test. Standart olarak şunları kullanırsınız: hour=$(date +%H); if [ "$hour" -gt 2 ] && [ "$hour" -lt 7 ](veya hour=`date +%H`Bourne kabuğuyla uyumlu olmanız gerekiyorsa, bu Solaris 10 ve daha eski ve belki de günümüzde nadir bulunan SCO birlikleri)
Stéphane Chazelas

0

Komut dosyasını haftanın günlerinde durdurmak için yalnızca günün satırını silin:

DAYOFWEEK=$(date +"%u")
echo "$DAYOFWEEK";
if [ "$DAYOFWEEK" == 1 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 2 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 3 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 4 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 5 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 6 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 7 ]; then exit; else echo; fi

Unix SE'ye hoş geldiniz! İlk hattınızı doğru anladığımdan emin değilim. Daha if [ "$DAYOFWEEK" -lt 7 ]iyi olmaz mıydı ?
peterh - Monica'yı

-1

Öncelikle DAYOFWEEK = "$ (tarih +% u)" ödevini vermelisiniz

Ve [ve] köşeli parantezlerin her iki tarafında boşluklar olmalıdır.

Çizginin sonundaki yarı-kolon gereksizdir.


1
Alıntıya gerek yoktur.
H.-Dirk Schmitt

@ H.-DirkSchmitt'in yorumunu genişletmek için: alıntıya gerek duyulmamasının nedeni çıktının boşluk içermemesidir.
Mart'ta CVn

@ MichaelKjörling: Hayır - asla gerekli değildir ;-) Örneği deneyin:a=$(echo 1 2 3); echo $a;
H.-Dirk Schmitt

@ H.-DirkSchmitt a=$(echo "1 2 3"); echo $abasamaklar arasında birden çok boşluk var ( StackExchange , maalesef basit bir kopyala ve yapıştır yapmama izin vermiyor).
Mart'ta CVn

@ MichaelKjörling - bkz. Yani soru ve "1 2 3" örneğinde hiçbir fark yaratmaz.
H.-Dirk Schmitt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.