Saya mencoba membuat skrip Bash sederhana untuk memeriksa apakah situs webnya rusak dan untuk beberapa alasan operator "dan" tidak berfungsi:
#!/usr/bin/env bash
WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="[email protected]"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"
if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi
Operator "-a" juga tidak berfungsi:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Bisakah Anda juga memberi saran kapan harus menggunakan:
- kurung kotak tunggal dan ganda
- kurung
?
bash
if-statement
HTF
sumber
sumber
-a
bermuka dua. Saat digunakan dengantest
perintah gaya shell Bourne , alias[
, artinyaand
. Ketika digunakan sebagai ekspresi kondisional maka ia sedang menguji untuk melihat apakah ada file. Ya itu membingungkan, sebaiknya dihindari.Jawaban:
Apa yang Anda miliki harus berfungsi, kecuali
${STATUS}
kosong. Mungkin akan lebih baik untuk dilakukan:atau
Sulit dikatakan, karena Anda belum menunjukkan kepada kami apa yang salah dengan skrip Anda.
Pendapat pribadi: tidak pernah digunakan
[[
. Ini menekan pesan kesalahan penting dan tidak mudah dibawa ke shell yang berbeda.sumber
STATUS
kosong, kode dari @HTF akan gagal-ne: unary operator expected
. Dalam kasus Anda, itu akan gagalinteger expression expected
, bukan?$STATUS
mungkin kosong dan menyarankan solusi (mengutipnya). Solusi Anda masih gagal dengan yang kosongSTATUS
, itu yang saya maksud.${STATUS:-0"
. Akan mengedit.STATUS=; [ $STATUS -ne 13 ] 2>/dev/null && echo foo
tidak menampilkanfoo
, meskipun seharusnya (kosong berbeda dari 13). Apa yang pertama kali Anda sarankan,${STATUS:-0}
terlihat jauh lebih baik.${STATUS:-0}
akan gagal jikaSTATUS=foo
, tetapi! [ "$STATUS" -eq 200 ] 2> /dev/null && echo foo
berfungsi. IMO, lebih baik untuk menghindari-eq
dan menggunakannya!=
.Coba ini:
sumber
Coba ini:
atau
sumber
Mengutip:
Untuk penjelasan yang lebih terperinci:
[
dan]
bukan kata-kata yang dipesan Bash. Kataif
kunci memperkenalkan persyaratan untuk dievaluasi oleh suatu pekerjaan (kondisi tersebut benar jika nilai pengembalian pekerjaan itu0
salah atau sebaliknya).Untuk tes sepele, ada
test
program (man test
).Seperti beberapa menemukan garis seperti
if test -f filename; then foo bar; fi
, dll. Menjengkelkan, pada sebagian besar sistem Anda menemukan program yang disebut[
yang sebenarnya hanya merupakan tautan ketest
program. Ketikatest
dipanggil sebagai[
, Anda harus menambahkan]
argumen posisi terakhir.Jadi
if test -f filename
pada dasarnya sama (dalam hal proses menelurkan) sebagaiif [ -f filename ]
. Dalam kedua kasustest
program akan dimulai, dan kedua proses harus berperilaku identik.Inilah kesalahan Anda:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
akan menguraikanif
beberapa pekerjaan, pekerjaan menjadi segalanya kecuali pekerjaanif
itu sendiri. Pekerjaan itu hanya perintah sederhana (Bash berbicara untuk sesuatu yang menghasilkan satu proses tunggal), yang berarti kata pertama ([
) adalah perintah dan sisanya argumen posisinya. Ada argumen tersisa setelah yang pertama]
.Juga tidak,
[[
memang kata kunci Bash, tetapi dalam kasus ini hanya diuraikan sebagai argumen perintah normal, karena itu bukan di depan perintah.sumber