Cocokkan dengan grep saat polanya berisi tanda hubung “-”

11

Saya menulis perintah berikut untuk mencocokkan $ a dengan $ b, tetapi ketika nilainya termasuk "-", maka saya mendapatkan kesalahan. Bagaimana saya bisa menghindarinya?

# a="-Xmx5324m"
# b="-Xmx5324m"
#
#
#  echo "$a"  | grep -Fxc "$b"
grep: conflicting matchers specified
yael
sumber
3
Pertimbangkan mengubah perintah Anda grep -Fxc -- "$b" <<< "$a"untuk menghindari pipa yang tidak perlu
h3rrmiller
8
Omong-omong, apakah Anda benar-benar menginginkan kecocokan regex, atau apakah Anda hanya ingin menguji apakah suatu string sama dengan (atau merupakan substring dari) string lain? Dalam hal ini, shell built-in [[ ... ]]atau caseakan menjadi pilihan yang lebih baik, karena Anda menghindari kedua kekhasan echodan proses anak.
Uwe
apakah string sama dengan ini adalah tes saya
yael
Alternatif lain yang tidak boleh Anda gunakan yang tidak ada yang terdaftar: adalah mungkin untuk melarikan diri tanda hubung di dalam string yang dikutip sehingga dipahami grepsebagai karakter literal daripada awal opsi, yaitu echo test-test | grep "\-test"akan cocok daripada mengeluh tentang -tbendera yang tidak dikenal .
Aaron

Jawaban:

20

Tempatkan --sebelum pola Anda:

echo "$a"  | grep -Fxc -- "$b"

-- menentukan opsi opsi akhir untuk banyak perintah / built-in shell, setelah argumen yang tersisa diperlakukan sebagai argumen posisi.

sebasth
sumber
13

Selain jawaban hebat @ sebasth , Anda bisa memberi tahu POLA itu dengan grep's -e opsi untuk menggunakan POLA sebagai pola (di sini menggunakan <<< zshoperator di sini-string alih-alih echo; lihat juga printf '%s\n' "$a"untuk portabilitas).

grep -Fxc -e "$b" <<<"$a"

Atau semua selain opsi lain.

grep -Fxce "$b" <<<"$a"

Karena tujuan Anda adalah perbandingan kesetaraan string byte-ke-byte, gunakan [perintah sebagai gantinya.

if [ "$a" = "$b" ]

Atau jika $amengandung $b, menggunakan [[...]]konstruk ksh:

if [[ $a == *"$b"* ]]

Atau lebih mudah dibawa dalam semua cangkang mirip Bourne:

case $a in
  *"$b"*) ...
esac
αғsнιη
sumber
==bukan standar untuk [perintah; itu bashism . Gunakan =sebagai gantinya.
Wildcard