Bagaimana dua kurma dapat dibandingkan dalam sebuah shell?
Berikut adalah contoh bagaimana saya ingin menggunakan ini, meskipun tidak berfungsi apa adanya:
todate=2013-07-18
cond=2013-07-15
if [ $todate -ge $cond ];
then
break
fi
Bagaimana saya bisa mencapai hasil yang diinginkan?
shell-script
shell
date
Abdul
sumber
sumber
Jawaban:
Jawaban yang benar masih hilang:
Perhatikan bahwa ini memerlukan tanggal GNU.
date
Sintaks yang setara untuk BSDdate
(seperti ditemukan di OSX secara default) adalahdate -j -f "%F" 2014-08-19 +"%s"
sumber
timeout=$(`date +%Y%m%d%H%M%S` + 500)
) jelas salah.date -d 2013-07-18 +%s%N
Anda tidak memiliki format tanggal untuk perbandingan:
Anda juga kehilangan struktur pengulangan, bagaimana Anda berencana untuk mendapatkan lebih banyak tanggal?
sumber
date
dikirimkan bersama macOS.date -d
tidak standar dan tidak bekerja pada UNIX yang khas. Pada BSD bahkan mencoba untuk mengatur nilai kenelDST
.Dapat menggunakan perbandingan string standar untuk membandingkan urutan kronologis [string dalam format tahun, bulan, hari].
Untungnya, ketika [string yang menggunakan format YYYY-MM-DD] diurutkan * dalam urutan abjad, mereka juga diurutkan * dalam urutan kronologis.
(* - diurutkan atau dibandingkan)
Tidak ada yang dibutuhkan dalam kasus ini. yay!
sumber
if [ $(sed -e s/-//g <<< $todate) -ge $(sed -e s/-//g <<< $cond) ];
... Format tanggal ini dirancang untuk diurutkan menggunakan pengurutan angka alpha standar, atau untuk-
dilucuti dan diurutkan secara numerik.Ini bukan masalah struktur pengulangan tetapi tipe data.
Tanggal tersebut (
todate
dancond
) adalah string, bukan angka, sehingga Anda tidak dapat menggunakan operator "-ge" daritest
. (Ingat bahwa tanda kurung siku sama dengan perintahtest
.)Apa yang dapat Anda lakukan adalah menggunakan notasi yang berbeda untuk tanggal Anda sehingga bilangan bulat. Sebagai contoh:
akan menghasilkan bilangan bulat seperti 20130715 untuk 15 Juli 2013. Kemudian Anda dapat membandingkan tanggal Anda dengan "-ge" dan operator yang setara.
Pembaruan: jika tanggal Anda diberikan (mis. Anda membacanya dari file dalam format 2013-07-13) maka Anda dapat dengan mudah memprosesnya dengan tr.
sumber
Operator
-ge
hanya bekerja dengan bilangan bulat, yang tanggal Anda tidak.Jika skrip Anda adalah skrip bash atau ksh atau zsh, Anda dapat menggunakan
<
operator sebagai gantinya. Operator ini tidak tersedia dalam dash atau shell lain yang tidak jauh melampaui standar POSIX.Dalam shell apa pun, Anda dapat mengonversi string menjadi angka sambil menghormati urutan tanggal hanya dengan menghapus tanda hubung.
Atau, Anda bisa menggunakan tradisional dan menggunakan
expr
utilitas.Karena menjalankan subproses dalam satu loop bisa lambat, Anda mungkin lebih suka melakukan transformasi menggunakan konstruksi pemrosesan string shell.
Tentu saja, jika Anda dapat mengambil tanggal tanpa tanda hubung di tempat pertama, Anda akan dapat membandingkannya
-ge
.sumber
Saya mengubah Strings menjadi cap waktu unix (detik sejak 1.1.1970 0: 0: 0). Ini dapat dibandingkan dengan mudah
sumber
date
yang dikirimkan bersama macOS.Ada juga metode ini dari artikel berjudul: Perhitungan tanggal dan waktu sederhana dalam BASH dari unix.com.
Fungsi-fungsi ini adalah kutipan dari skrip di utas itu!
Pemakaian
sumber
date
yang dikirimkan bersama macOS.date
menjadigdate
.bash jawaban spesifik
Karena saya suka mengurangi garpu dan bash mengizinkan banyak trik, ada tujuan saya:
Baik sekarang:
Ini akan mengisi kembali kedua variabel
$todate
dan$cond
, menggunakan hanya satu garpu, dengan ouptutdate -f -
yang mengambil stdio untuk membaca satu tanggal per baris.Akhirnya, Anda bisa memutus perulangan dengan
Atau sebagai fungsi :
Menggunakan built-in bash
printf
yang dapat membuat waktu tanggal dengan detik dari zaman (lihatman bash
;-)Script ini hanya menggunakan satu garpu.
Alternatif dengan garpu terbatas dan fungsi pembaca tanggal
Ini akan membuat subproses khusus (hanya satu garpu):
Ketika input dan output terbuka, entri fifo dapat dihapus.
Fungsi:
Nota Untuk mencegah garpu yang tidak berguna seperti
todate=$(myDate 2013-07-18)
, variabel harus diatur oleh fungsi sendiri. Dan untuk mengizinkan sintaks gratis (dengan atau tanpa tanda kutip untuk datestring), nama variabel harus menjadi argumen terakhir .Kemudian perbandingan tanggal:
dapat membuat:
jika di luar loop.
Atau gunakan fungsi bash shell-connector:
atau
(Wich tidak persis sama:
.sh
mengandung skrip tes lengkap jika tidak bersumber)sumber
date -f -
dapat mengurangi kebutuhan sumber daya.tanggal adalah string, bukan bilangan bulat; Anda tidak dapat membandingkannya dengan operator aritmatika standar.
satu pendekatan yang dapat Anda gunakan, jika separator dijamin
-
:Ini bekerja sejauh
bash 2.05b.0(1)-release
.sumber
Anda juga dapat menggunakan fungsi bawaan mysql untuk membandingkan tanggal. Ini memberikan hasil dalam 'hari'.
Cukup masukkan nilai
$DBUSER
dan$DBPASSWORD
variabel sesuai dengan milik Anda.sumber
FWIW: pada Mac, sepertinya memberi makan hanya tanggal seperti "2017-05-05" menjadi tanggal akan menambahkan waktu saat ini ke tanggal dan Anda akan mendapatkan nilai yang berbeda setiap kali Anda mengubahnya menjadi waktu zaman. untuk mendapatkan waktu zaman yang lebih konsisten untuk tanggal tetap, sertakan nilai dummy untuk jam, menit, dan detik:
Ini mungkin keanehan terbatas pada versi tanggal yang dikirimkan bersama macOS .... diuji pada macOS 10.12.6.
sumber
Echoing @Gilles answer ("Operator -ge hanya bekerja dengan bilangan bulat"), berikut adalah contohnya.
datetime
konversi integer menjadiepoch
, per jawaban @ mike-q di https://stackoverflow.com/questions/10990949/convert-date-time-string-to-epoch-in-bash :"$curr_date"
lebih besar dari (lebih baru dari)"$old_date"
, tetapi ungkapan ini salah mengevaluasi sebagaiFalse
:... ditampilkan secara eksplisit, di sini:
Perbandingan bilangan bulat:
sumber
Alasan mengapa perbandingan ini tidak bekerja dengan baik dengan string tanggal ditulis dgn tanda penghubung adalah shell mengasumsikan angka dengan 0 terkemuka adalah oktal, dalam hal ini bulan "07". Ada berbagai solusi yang diusulkan tetapi cara tercepat dan termudah adalah menghapus tanda hubung. Bash memiliki fitur substitusi string yang membuat ini cepat dan mudah maka perbandingan dapat dilakukan sebagai ekspresi aritmatika:
sumber