if grep -q SomeString"$File";thenSomeActions# SomeString was foundfi
Anda tidak perlu di [[ ]]sini. Jalankan saja perintah secara langsung. Tambahkan -qopsi ketika Anda tidak perlu menampilkan string ketika ditemukan.
The grepperintah mengembalikan 0 atau 1 dalam kode keluar tergantung pada hasil pencarian. 0 jika ada sesuatu yang ditemukan; 1 sebaliknya.
$ echo hello | grep hi ; echo $?1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?0
Anda dapat menentukan perintah sebagai syarat if. Jika perintah mengembalikan 0 pada kode keluarnya, itu berarti bahwa kondisinya benar; jika tidak salah.
$ if/bin/true;then echo that is true;fi
that is true
$ if/bin/false;then echo that is true;fi
$
Seperti yang Anda lihat, Anda menjalankan program di sini secara langsung. Tidak ada tambahan []atau [[]].
pertimbangkan untuk menggunakan -m 1guna meningkatkan kinerja pemindaian. Mengembalikan pada kejadian pertama.
AlikElzin-kilaka
1
jika SomeStringberisi karakter khusus regex (seperti .) Anda mungkin mendapatkan hasil yang tidak terduga. Lebih aman untuk selalu menggunakan fgrep(atau grep -F) (kecuali jika Anda benar-benar membutuhkan regex, dalam hal ini egrep(atau grep -E) mungkin merupakan pilihan terbaik)
Walter Tross
Contoh ifcontoh tidak benar, karena hanya memeriksa apakah kode keluar itu bukan-0. Jika terjadi kesalahan, seperti file tidak dapat dibaca, kode keluar juga bukan-0. Jadi Anda harus melakukan sesuatu seperti ec=$?, dan memeriksa apakah itu 0(ditemukan), lalu jika itu 1(tidak ditemukan), dan kemudian jika itu sesuatu yang lain (gagal).
ddekany
40
Selain jawaban lain, yang memberi tahu Anda bagaimana melakukan apa yang Anda inginkan, saya mencoba menjelaskan apa yang salah (yang Anda inginkan.
Di Bash, ifharus diikuti dengan perintah. Jika kode keluar dari perintah ini sama dengan 0, maka thenbagian dieksekusi, atau elsebagian jika ada yang dieksekusi.
Anda dapat melakukannya dengan perintah apa pun seperti yang dijelaskan dalam jawaban lain: if /bin/true; then ...; fi
[[adalah perintah bash internal yang didedikasikan untuk beberapa tes, seperti keberadaan file, perbandingan variabel. Demikian pula [adalah perintah eksternal (biasanya terletak di /usr/bin/[) yang melakukan tes kira-kira sama tetapi perlu ]sebagai argumen akhir, yang mengapa ]harus diisi dengan ruang di sebelah kiri, yang tidak demikian halnya dengan ]].
Di sini Anda tidak perlu [[juga [.
Hal lain adalah cara Anda mengutip sesuatu. Dalam bash, hanya ada satu kasus di mana pasangan kutipan bersarang, yaitu "$(command "argument")". Tetapi di dalam 'grep 'SomeString' $File'kamu hanya ada satu kata, karena 'grep 'ini adalah unit yang dikutip, yang digabungkan dengan SomeStringdan kemudian digabungkan dengan ' $File'. Variabel $Filebahkan tidak diganti dengan nilainya karena penggunaan tanda kutip tunggal. Cara yang tepat untuk melakukannya adalah grep 'SomeString' "$File".
##To check for a particular string in a file
cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directoryFile=YOUR_FILENAME
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File";##note the space after the string you are searching forthen
echo "Hooray!!It's available"else
echo "Oops!!Not available"fi
Mengubah direktori biasanya bukan ide yang baik (dan sama sekali tidak perlu di sini, cukup kualifikasi nama file dengan direktori target). Dan kemudian apa yang Anda miliki persis sama dengan jawaban yang diterima, hanya dengan perincian yang lebih sedikit.
if grep -q something file; then echo yes; else echo no; fi. Tidak ada alasan untuk mengacaukannya $?sama sekali.
Charles Duffy
6
Jika Anda ingin memeriksa apakah string cocok dengan seluruh baris dan jika itu adalah string tetap, Anda dapat melakukannya dengan cara ini
grep -Fxq[String][filePath]
contoh
searchString="Hello World"
file="./test.log"if grep -Fxq"$searchString" $file
then
echo "String found in $file"else
echo "String not found in $file"fi
Dari file man:
-F,--fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of
which is to be matched.(-F is specified by POSIX.)-x,--line-regexp
Select only those matches that exactly match the whole line.(-x is specified by
POSIX.)-q,--quiet,--silent
Quiet;do not write anything to standard output.Exit immediately with zero
status if any match is
found, even if an error was detected.Also see the -s or --no-messages
option.(-q is specified by
POSIX.)
Saya ragu-ragu menghindari downvoting ini, tetapi Stack Overflow seharusnya tidak mengabadikan semacam logika pretzel. grepmengembalikan status keluar karena alasan yang sangat bagus; menangkap keluaran ke string berpotensi menyimpan sejumlah besar teks dalam buffer hanya agar Anda dapat mengatakan itu tidak kosong.
tripleee
-1
Saya melakukan ini, tampaknya berfungsi dengan baik
if grep $SearchTerm $FileToSearch;then
echo "$SearchTerm found OK"else
echo "$SearchTerm not found"fi
... tidak hanya itu dimaksudkan untuk menjadi $?, tetapi tidak perlu sama sekali - Anda bisa melakukannyaif grep -q ...
Charles Duffy
1
Selain itu, foo && truthy_action || falsey_actionbukan operator ternary nyata - jika truthy_actiongagal, maka falsey_actionakan dijalankan sebagai tambahan .
Charles Duffy
Lebih umum, tujuan dari ifyaitu untuk menjalankan perintah dan memeriksa kode keluar nya. Anda harus sangat jarang perlu memeriksa $?secara eksplisit.
command
: stackoverflow.com/questions/12375722/…Jawaban:
Anda tidak perlu di
[[ ]]
sini. Jalankan saja perintah secara langsung. Tambahkan-q
opsi ketika Anda tidak perlu menampilkan string ketika ditemukan.The
grep
perintah mengembalikan 0 atau 1 dalam kode keluar tergantung pada hasil pencarian. 0 jika ada sesuatu yang ditemukan; 1 sebaliknya.Anda dapat menentukan perintah sebagai syarat
if
. Jika perintah mengembalikan 0 pada kode keluarnya, itu berarti bahwa kondisinya benar; jika tidak salah.Seperti yang Anda lihat, Anda menjalankan program di sini secara langsung. Tidak ada tambahan
[]
atau[[]]
.sumber
grep
dan opsi yang tersedia di asnwer stackoverflow.com/a/4749368/1702557-Fxq
parameter seperti di stackoverflow.com/a/4749368/544721-m 1
guna meningkatkan kinerja pemindaian. Mengembalikan pada kejadian pertama.SomeString
berisi karakter khusus regex (seperti.
) Anda mungkin mendapatkan hasil yang tidak terduga. Lebih aman untuk selalu menggunakanfgrep
(ataugrep -F
) (kecuali jika Anda benar-benar membutuhkan regex, dalam hal iniegrep
(ataugrep -E
) mungkin merupakan pilihan terbaik)if
contoh tidak benar, karena hanya memeriksa apakah kode keluar itu bukan-0. Jika terjadi kesalahan, seperti file tidak dapat dibaca, kode keluar juga bukan-0. Jadi Anda harus melakukan sesuatu sepertiec=$?
, dan memeriksa apakah itu0
(ditemukan), lalu jika itu1
(tidak ditemukan), dan kemudian jika itu sesuatu yang lain (gagal).Selain jawaban lain, yang memberi tahu Anda bagaimana melakukan apa yang Anda inginkan, saya mencoba menjelaskan apa yang salah (yang Anda inginkan.
Di Bash,
if
harus diikuti dengan perintah. Jika kode keluar dari perintah ini sama dengan 0, makathen
bagian dieksekusi, atauelse
bagian jika ada yang dieksekusi.Anda dapat melakukannya dengan perintah apa pun seperti yang dijelaskan dalam jawaban lain:
if /bin/true; then ...; fi
[[
adalah perintah bash internal yang didedikasikan untuk beberapa tes, seperti keberadaan file, perbandingan variabel. Demikian pula[
adalah perintah eksternal (biasanya terletak di/usr/bin/[
) yang melakukan tes kira-kira sama tetapi perlu]
sebagai argumen akhir, yang mengapa]
harus diisi dengan ruang di sebelah kiri, yang tidak demikian halnya dengan]]
.Di sini Anda tidak perlu
[[
juga[
.Hal lain adalah cara Anda mengutip sesuatu. Dalam bash, hanya ada satu kasus di mana pasangan kutipan bersarang, yaitu
"$(command "argument")"
. Tetapi di dalam'grep 'SomeString' $File'
kamu hanya ada satu kata, karena'grep '
ini adalah unit yang dikutip, yang digabungkan denganSomeString
dan kemudian digabungkan dengan' $File'
. Variabel$File
bahkan tidak diganti dengan nilainya karena penggunaan tanda kutip tunggal. Cara yang tepat untuk melakukannya adalahgrep 'SomeString' "$File"
.sumber
Jika Anda ingin memeriksa apakah file tidak mengandung string tertentu, Anda dapat melakukannya sebagai berikut.
sumber
sumber
Versi terpendek (benar):
dapat juga ditulis sebagai
tetapi Anda tidak perlu mengujinya secara eksplisit dalam kasus ini, jadi sama dengan:
sumber
if grep -q something file; then echo yes; else echo no; fi
. Tidak ada alasan untuk mengacaukannya$?
sama sekali.Jika Anda ingin memeriksa apakah string cocok dengan seluruh baris dan jika itu adalah string tetap, Anda dapat melakukannya dengan cara ini
contoh
Dari file man:
sumber
Status keluar adalah
0
(benar) jika pola ditemukan; jika tidak blankstring.sumber
Contoh
sumber
Coba ini:
sumber
grep
mengembalikan status keluar karena alasan yang sangat bagus; menangkap keluaran ke string berpotensi menyimpan sejumlah besar teks dalam buffer hanya agar Anda dapat mengatakan itu tidak kosong.Saya melakukan ini, tampaknya berfungsi dengan baik
sumber
grep
.sumber
$?
, tetapi tidak perlu sama sekali - Anda bisa melakukannyaif grep -q ...
foo && truthy_action || falsey_action
bukan operator ternary nyata - jikatruthy_action
gagal, makafalsey_action
akan dijalankan sebagai tambahan .if
yaitu untuk menjalankan perintah dan memeriksa kode keluar nya. Anda harus sangat jarang perlu memeriksa$?
secara eksplisit.