Saya memiliki skrip pengisian yang disederhanakan pada Mac OS X 10.12:
#!/usr/bin/env bash
echo "=> BASH_VERSION = $BASH_VERSION"
function testForLoopMac {
local file
for file
do
echo File=$file
done | egrep "$file"
}
function testForLoopMacBis {
local file
for file
do
echo File=$file
done | egrep "$file|OK"
}
testForLoopMac $@
testForLoopMacBis $@
Tetapi hasil ketika saya menjalankan adalah:
$ testForLoopMac.sh example.pdf
=> BASH_VERSION = 3.2.57(1)-release
File=example.pdf
egrep: empty (sub)expression
Pada Debian / Ubuntu Linux, hasilnya adalah:
$ testForLoopMac.sh example.md
=> BASH_VERSION = 4.3.30(1)-release
File=example.md
File=example.md
Sunting: Dengan bash4 di Mac OSX 10.12:
Saya mengubah shebang ke #!/usr/bin/env bash4
dan hasilnya sama:
$ testForLoopMac.sh example.md
=> BASH_VERSION = 4.4.12(1)-release
File=example.md
egrep: empty (sub)expression
Sunting: Terima kasih kepada kalian, saya mengerti perbedaan perilaku di Linux atau BSD egrep
karena pada saat egrep
pelaksanaan variabel dapat kosong.
Saya akan menggunakan karena itu, regExp berikut:
egrep "File=|OK"
Terima kasih lagi :)
BASH_VERSION
keduanya dari macOS dan dari Linux?Jawaban:
Shell memperluas subekspresi
$file
di sisi kanan pipa sebelum variabel memiliki nilai apa pun. Jadi di kedua fungsiegrep
sebenarnya disebut dengan string kosong di tempat$file
. Fungsi pertama tidak menimbulkan kesalahan karena pola kosong adalah parameter yang valid untukegrep
MacOS dan Linux. Dalam fucntion kedua perbedaan ikut bermain karena subekspresi kosong menyebabkanBSD egrep
(yang digunakan pada macOS) untuk melempar kesalahan.Contoh:
sebagai contoh lain dengan
$file
tidak memiliki nilaiJadi, sebagai solusi dalam penggunaan fungsi Anda:
Saya tidak tahu mengapa Anda menggunakan
egrep
ketika Anda mencari string tetap.sumber
bash
tidak olehegrep
, jadi saya sedikit berjuang untuk memahami kalimat pertama Anda.BSD grep
danGNU grep
.GNU grep
tidak mengeluh tentang subekspresi kosong untuk satu hal.