Bir dosyanın bash içinde belirli bir dize içerip içermediğini kontrol etmek istiyorum. Bu komut dosyasını kullandım, ancak çalışmıyor:
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
Kodumda yanlış olan ne?
Bir dosyanın bash içinde belirli bir dize içerip içermediğini kontrol etmek istiyorum. Bu komut dosyasını kullandım, ancak çalışmıyor:
if [[ 'grep 'SomeString' $File' ]];then
# Some Actions
fi
Kodumda yanlış olan ne?
Yanıtlar:
if grep -q SomeString "$File"; then
Some Actions # SomeString was found
fi
[[ ]]
Burada ihtiyacın yok. Sadece komutu doğrudan çalıştırın. -q
Bulunduğunda görüntülenen dizeye ihtiyacınız olmadığında seçenek ekleyin .
grep
Komut arama sonucuna göre çıkış kodu 0 veya 1 değerini döndürür. Bir şey bulunursa; 1 aksi takdirde.
$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0
Komutlarını bir koşulu olarak belirtebilirsiniz if
. Komut çıkış kodunda 0 döndürürse, koşulun doğru olduğu anlamına gelir; aksi halde yanlış.
$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$
Gördüğünüz gibi burada programları doğrudan çalıştırıyorsunuz. Ek []
veya yok [[]]
.
grep
Asnwer için daha fazla bilgi ve mevcut seçenekler stackoverflow.com/a/4749368/1702557
-Fxq
parametreleri stackoverflow.com/a/4749368/544721
-m 1
tarama performansını artırmak için kullanmayı düşünün . İlk olayı döndürür.
SomeString
normal ifadedeki özel karakterler içeren (gibi .
) beklenmeyen sonuçlar alabilirsiniz. Her zaman fgrep
(veya grep -F
) kullanmak daha güvenlidir (gerçekten bir regex'e ihtiyacınız yoksa, bu durumda egrep
(veya grep -E
) muhtemelen en iyi seçimdir)
if
Yalnızca çıkış kodunun 0 dışında olup olmadığını kontrol ettiğinden örnek örnek yanlıştır. Dosya okunamıyor gibi herhangi bir hata oluşursa, çıkış kodu da 0 değildir. Yani böyle bir şey yapmalı ec=$?
ve bunun 0
(bulunup bulunmadığını), sonra 1
(bulunamadığını) ve sonra başka bir şey olup olmadığını (başarısız) kontrol etmelisiniz .
İstediğiniz şeyi nasıl yapacağınızı söyleyen diğer cevaplara ek olarak, neyin yanlış olduğunu açıklamaya çalışıyorum (bu da istediğiniz şeydir.
Bash'de, if
bir komutla takip edilir. Bu komutun çıkış kodu 0'a eşitse, then
parça yürütülür, else
varsa yürütülür.
Bunu diğer cevaplarda açıklandığı gibi herhangi bir komutla yapabilirsiniz: if /bin/true; then ...; fi
[[
dosya varlığı, değişken karşılaştırmaları gibi bazı testlere ayrılmış dahili bir bash komutudur. Benzer şekilde [
, /usr/bin/[
kabaca aynı testleri gerçekleştiren ancak ]
son bir argüman olarak ihtiyaç duyan harici bir komut (tipik olarak bulunur ) , bu yüzden ]
solda bir boşlukla doldurulmalıdır, ki durum böyle değildir ]]
.
Burada gerek [[
ne de [
.
Başka bir şey, şeyleri alıntılama şeklidir. Bash'da, çift tırnakların yuvalandığı tek bir durum vardır "$(command "argument")"
. Ama 'grep 'SomeString' $File'
sadece bir kelimeniz var, çünkü 'grep '
birleştirilmiş bir birimdir, birleşik bir birimdir SomeString
ve sonra tekrar birleştirilir ' $File'
. $File
Tek tırnak kullanımı nedeniyle değişkenin değeri bile değiştirilmez. Bunu yapmanın doğru yolu grep 'SomeString' "$File"
.
Eğer dosya yok olmadığını kontrol etmek istiyorsanız durumda değil belirli bir dize içeren, bunu aşağıdaki gibi yapabilirsiniz.
if ! grep -q SomeString "$File"; then
Some Actions # SomeString was not found
fi
##To check for a particular string in a file
cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory
File=YOUR_FILENAME
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for
then
echo "Hooray!!It's available"
else
echo "Oops!!Not available"
fi
En kısa (doğru) sürüm:
grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"
olarak da yazılabilir
grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"
ancak bu durumda açıkça test etmenize gerek yoktur, bu nedenle:
grep -q "something" file && echo "yes" || echo "no"
if grep -q something file; then echo yes; else echo no; fi
. Hiç uğraşmak için bir sebep yok $?
.
Dizenin tüm satırla eşleşmesini istiyorsanız ve sabit bir dize ise, bu şekilde yapabilirsiniz
grep -Fxq [String] [filePath]
misal
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
Man dosyasından:
-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.)
grep -q [PATTERN] [FILE] && echo $?
0
Desen bulunursa çıkış durumu (true) olur; aksi takdirde körleme.
if grep -q [string] [filename]
then
[whatever action]
fi
Misal
if grep -q 'my cat is in a tree' /tmp/cat.txt
then
mkdir cat
fi
Bunu dene:
if [[ $(grep "SomeString" $File) ]] ; then
echo "Found"
else
echo "Not Found"
fi
grep
çok iyi bir nedenle çıkış durumunu döndürür; çıktıyı bir dizgiye yakalamak, arabellekte büyük miktarda metin depolayacaktır, böylece boş olmadığını söyleyebilirsiniz.
Bunu yaptım, iyi çalışıyor gibi görünüyor
if grep $SearchTerm $FileToSearch; then
echo "$SearchTerm found OK"
else
echo "$SearchTerm not found"
fi
grep
.
grep -q "something" file
[[ !? -eq 0 ]] && echo "yes" || echo "no"
$?
, aynı zamanda buna da gerek yokif grep -q ...
foo && truthy_action || falsey_action
gerçek bir üçlü operatör değildir - truthy_action
başarısız olursa, ek olarakfalsey_action
çalıştırılır .
if
bir komutu çalıştırmak ve çıkış kodunu kontrol etmektir. Çok nadiren $?
açıkça incelemelisiniz .