Logis DAN dalam skrip bash


10

Saya memiliki ifdalam skrip bash saya yang harus memeriksa apakah BAIK dari 2 file ada, jika tidak ada itu harus cocok.

Kode yang saya miliki:

if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

Tetapi ini sepertinya tidak berhasil karena suatu alasan.

Saya 110% yakin bahwa 2 file ini tidak ada. Saya tidak mendapatkan kesalahan, hanya saja tidak masuk if.

Saya baru mengenal bash scripting jadi saya tidak yakin apa yang salah.


Saya kira jawaban yang diposting sebenarnya tidak menjawab pertanyaan itu. Apa yang terjadi ketika Anda mencoba tes secara individual? Lakukan [[ ! -f /etc/.../... ]]; echo $?untuk masing-masing.
jw013

Peringatan : [[ -f xxx ]]mengembalikan true jika xxx ada dan merupakan file biasa (atau symlink ke file biasa). Ini akan mengembalikan false jika tidak ada, atau jika tidak dapat mengetahui apakah itu ada atau tidak atau jika ada tetapi bukan file biasa (direktori, pipa, perangkat, soket ...) atau jika itu adalah symlink ke file yang tidak ada atau tidak tahu apakah itu ada atau tidak atau bukan file biasa ... [[ -e $file ]] || [[ -L $file ]]lebih dekat dengan tes keberadaan. ls -d -- "$file" > /dev/null 2>&1bahkan lebih dekat. Dan sebagai aturan, tes semacam ini mengarah pada kondisi balapan. Mungkin ada cara lain.
Stéphane Chazelas

Jawaban:


12

Jika Anda ingin baik maka Anda ingin OR, tidak AND.

if [[ ! -f /etc/benchmarking/code ]] || [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
  • Ini akan cocok jika salah satu atau kedua file hilang.
  • Kode Anda hanya akan dicetak matchjika keduanya tidak ada.

Tapi , Anda berkata:

Saya 110% yakin bahwa 2 file ini tidak ada. Saya tidak mendapatkan kesalahan, hanya saja tidak memasukkan if.

Jadi pernyataan Anda bertentangan dengan dirinya sendiri. Setidaknya satu dari file-file harus ada, jika Anda menjalankan bahwa kode.

Jika Anda ingin melihat bagaimana ifpernyataan Anda mengevaluasi, jalankan dengan -x.

#!/bin/bash -x
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi

Maka Anda akan melihat eksekusi.

$ ./test.sh
+ [[ ! -f /etc/benchmarking/code ]]
+ [[ ! -f /etc/benchmarking/code.class ]]
+ echo match
match
$ 

Saya ingin menggema "cocok" jika tidak ada file, jika ada ada itu tidak cocok. Saya akan mencobanya dengan -x
Peppercat101

Dalam hal ini kode asli Anda harus baik-baik saja. Dan memang itu bekerja untuk saya.
bahamat

3

Bukankah seharusnya seperti ini? A adalah file atau B adalah file, lalu blabla.

if [[ -f /etc/benchmarking/code ]] || [[ -f /etc/benchmarking/code.class ]]; 
then  
  echo "match"
fi

3

Ini juga dapat bekerja untuk apa yang Anda coba lakukan. Kurung tunggal tidak umum digunakan hari ini dengan bash, tetapi ini masih merupakan pilihan. Menggunakan '-o' secara efektif merupakan operasi "ATAU", dan "!" meniadakan kondisinya.

var=/etc/benchmarking/code
[ ! -f ${var} -o -f {var}.class ] && echo "match"

Jangan pernah menggunakan [di bash. Selain itu, saya gagal melihat bagaimana ini menjawab pertanyaan.
jw013

[ ! -f ${var} -a ! -f {var}.class ] && echo "match"harus. Pencariannya adalah: jika mereka (keduanya) tidak ada, itu seharusnya echo match.
hschou

0

Kode Anda memenuhi persyaratan Anda: itu akan dicetak matchasalkan tidak dapat menemukan salah satu file.

Karena itu alasannya matchtidak dicetak di tempat lain. Anda harus mengonfirmasi bahwa blok kode sedang dicapai, yang dapat Anda lakukan dengan mengelilinginya dengan beberapa pesan debug. Misalnya, seperti ini:

echo '@ About to enter if...fi block'
if [[ ! -f /etc/benchmarking/code ]] && [[ ! -f /etc/benchmarking/code.class ]]; then
 echo "match"
fi
echo '@ Finished if...fi block'

Preferensi saya yang biasa adalah untuk men-debug pesan untuk pergi ke stderr untuk menghindari gangguan aliran data ke stdout , tetapi saya telah menghindari itu di sini karena Anda mengatakan Anda seorang pemula. Berikut adalah satu contoh yang menunjukkan bagaimana Anda bisa menulis ke stdout :

echo '@ About to enter if...fi block' >&2
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.