Saya ingin echo
perintah dieksekusi ketika cat /etc/passwd | grep "sysa"
itu tidak benar.
Apa yang saya lakukan salah?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
bash
if-statement
syntax
boolean-expression
Sandra Schlichting
sumber
sumber
!
tidak ada di dalam kurung? yaitu[ ! EXPR ]
Jawaban:
mencoba
grep
kembalitrue
jika ia menemukan target pencarian, danfalse
jika tidak.Jadi BUKAN
false
==true
.if
evaluasi dalam shell dirancang untuk menjadi sangat fleksibel, dan seringkali tidak memerlukan rantai perintah (seperti yang telah Anda tulis).Juga, melihat kode Anda apa adanya, penggunaan Anda atas
$( ... )
bentuk substitusi cmd harus dipuji, tetapi pikirkan tentang apa yang keluar dari proses. Cobaecho $(cat /etc/passwd | grep "sysa")
lihat apa yang saya maksud. Anda dapat mengambil lebih jauh dengan menggunakan opsi-c
(menghitung) untuk menangkap dan kemudian melakukanif ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
yang bekerja tetapi sekolah yang agak lama.TETAPI, Anda bisa menggunakan fitur shell terbaru (evaluasi aritmatika) seperti
yang juga memberi Anda manfaat menggunakan operator perbandingan berbasis c-lang,
==,<,>,>=,<=,%
dan mungkin beberapa lainnya.Dalam hal ini, per komentar oleh Orwellophile, evaluasi aritmatika dapat dikecilkan lebih jauh, seperti
ATAU
Akhirnya, ada penghargaan yang disebut
Useless Use of Cat (UUOC)
. :-) Beberapa orang akan melompat-lompat dan menangis gothca! Saya hanya akan mengatakan bahwagrep
dapat mengambil nama file pada cmd-line-nya, jadi mengapa meminta proses tambahan dan konstruksi pipa ketika Anda tidak perlu? ;-)Saya harap ini membantu.
sumber
grep "^$user:" /etc/passwd
akan menjadi cara yang lebih benar untuk mencari / etc / passwd secara kebetulan - digrep -v
mana -v membalikkan pencarian jika Anda ingin untuk menghindari kekacauan ||(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
Saya pikir itu bisa disederhanakan menjadi:
atau dalam satu baris perintah
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
sumber
1>&2
pada akhir Andaecho
untuk mencetakstderr
?!: not found
'grep
seperti ini.-q
menekan output.$(...)
memegang nilai , bukan status keluar, itulah sebabnya pendekatan ini salah. Namun, dalam kasus khusus ini, itu memang berhasil karenasysa
akan dicetak yang membuat pernyataan pengujian menjadi kenyataan. Namun,if ! [ $(true) ]; then echo false; fi
akan selalu mencetakfalse
karenatrue
perintah tidak menulis apa pun ke stdout (meskipun kode keluarnya 0). Itu sebabnya perlu diulangif ! grep ...; then
.Alternatifnya adalah
cat /etc/passwd | grep "sysa" || echo error
. Edit: Seperti Alex menunjukkan, kucing tidak berguna di sini :grep "sysa" /etc/passwd || echo error
.Menemukan jawaban lain agak membingungkan, semoga ini membantu seseorang.
sumber
Pada sistem Unix yang mendukungnya (bukan macOS sepertinya):
Ini memiliki keuntungan bahwa ia akan meminta layanan direktori apa pun yang mungkin digunakan (YP / NIS atau LDAP dll.) Dan file basis data kata sandi lokal.
Masalahnya
grep -q "$username" /etc/passwd
adalah bahwa hal itu akan memberikan false positive ketika tidak ada pengguna seperti itu, tetapi sesuatu yang lain cocok dengan polanya. Ini bisa terjadi jika ada kecocokan sebagian atau tepat di tempat lain dalam file.Misalnya, dalam
passwd
file saya , ada garis yang mengatakanIni akan memicu kecocokan yang valid pada hal-hal seperti
cara
danenoc
lain - lain, meskipun tidak ada pengguna seperti itu di sistem saya.Agar
grep
solusi menjadi benar, Anda perlu mengurai/etc/passwd
file dengan benar:... atau tes serupa lainnya terhadap yang pertama dari
:
bidang -disunting.sumber
bash
dalam kasus itu.Inilah jawaban sebagai contoh:
Untuk memastikan data logger online, sebuah
cron
skrip berjalan setiap 15 menit yang terlihat seperti ini:... dan seterusnya untuk setiap data logger yang dapat Anda lihat di montase di http://www.SDsolarBlog.com/montage
FYI, menggunakan
&>/dev/null
pengalihan semua output dari perintah, termasuk kesalahan, ke/dev/null
(Bersyarat hanya membutuhkan
exit status
satuping
perintah)Juga FYI, perhatikan bahwa karena
cron
pekerjaan berjalan karenaroot
tidak perlu digunakansudo ping
dalamcron
skrip.sumber