Ini adalah pertama kalinya bash scripting saya jadi saya mungkin membuat kesalahan mudah.
Pada dasarnya, saya mencoba menulis skrip yang mendapatkan grup pengguna, dan jika mereka berada dalam grup tertentu, itu akan mencatatnya. Jelas akan ada lebih banyak fungsi, tetapi tidak ada gunanya membangun bahwa ketika saya bahkan tidak bisa membuat regex berfungsi!
Sejauh ini, saya punya ini:
#!/bin/bash
regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
# example output
groups="username : username usergroup"
echo "$groups" >> /home/jrdn/log
if [[ "$groups" =~ $regex ]]; then
echo "Match!" >> /home/jrdn/log
else
echo "No match" >> /home/jrdn/log
fi
Setiap tempat saya sudah mencoba regex itu, itu berhasil. Tetapi dalam skrip bash, hanya akan menghasilkan $groups
, diikuti oleh No match
. Jadi bisakah seseorang memberi tahu saya apa yang salah dengannya?
^([a-zA-Z0-9\-_]+)
kemudian tambahkan titik dua dan seterusnya ... Anda harus segera mengetahuinya, di mana masalahnya.Jawaban:
Dari
man 7 regex
:Mencoba regexp dengan egrep memberikan kesalahan:
Ini adalah versi yang lebih sederhana, yang juga memberikan kesalahan:
Karena
\
tidak spesial, itu adalah kisaran, seperti yang[a-z]
akan terjadi. Anda harus meletakkannya-
di akhir, seperti[_-]
atau:Ini harus bekerja terlepas dari versi libc Anda (baik dalam egrep atau bash).
sunting: Ini sebenarnya tergantung pada pengaturan lokal Anda juga. Halaman manual memang memperingatkan tentang ini:
Sebagai contoh:
Tentu saja, meskipun tidak salah, itu tidak melakukan apa yang Anda inginkan:
Ini berbagai, yang dalam ASCII, termasuk
\
,[
,^
, dan_
.sumber
egrep
tidak memberikan kesalahan, cukup cocokkan dengan benar.LC_COLLATE="en_US.UTF-8"
:?-
...Aturan umum dengan regexps (dan bug apa pun dalam potongan kode yang lebih besar): kurangi dan bangun kembali langkah demi langkah atau gunakan membagi dua - apa pun yang lebih baik untuk Anda.
Dalam hal ini pelakunya ternyata adalah garis bawah - melarikan diri dengan backslash membuatnya berhasil.
sumber