Odpowiedzi:
if grep -q SomeString "$File"; then
Some Actions # SomeString was found
fi
Nie potrzebujesz [[ ]]
tutaj. Po prostu uruchom polecenie bezpośrednio. Dodaj -q
opcję, gdy nie trzeba wyświetlać ciągu, gdy został znaleziony.
grep
Komenda zwraca 0 lub 1 w kodzie wyjścia w zależności od wyniku wyszukiwania. 0 jeśli coś zostało znalezione; 1 inaczej.
$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0
Możesz określić polecenia jako warunek if
. Jeśli polecenie zwraca 0 w kodzie wyjścia, oznacza to, że warunek jest spełniony; inaczej fałszywe.
$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$
Jak widać, uruchamiasz tutaj programy bezpośrednio. Bez dodatkowych []
lub [[]]
.
grep
dostępnych opcji w asnwer stackoverflow.com/a/4749368/1702557
-Fxq
parametry jak w stackoverflow.com/a/4749368/544721
-m 1
w celu poprawy wydajności skanowania. Zwraca przy pierwszym wystąpieniu.
SomeString
zawiera wyrażenia regularne (np. .
), możesz uzyskać nieoczekiwane wyniki. Bezpieczniej jest zawsze używać fgrep
(lub grep -F
) (chyba że naprawdę potrzebujesz wyrażenia regularnego, w którym to przypadku egrep
(lub grep -E
) jest prawdopodobnie najlepszym wyborem)
if
przykład jest niepoprawny, ponieważ sprawdza tylko, czy kod wyjścia nie jest zerem. Jeśli wystąpi jakikolwiek błąd, np. Nie można odczytać pliku, kod wyjścia również nie jest równy 0. Więc musisz zrobić coś takiego ec=$?
i sprawdzić, czy to 0
(znaleziono), a następnie, czy to 1
(nie znaleziono), a następnie, czy jest to coś innego (błąd).
Oprócz innych odpowiedzi, które mówiły ci, jak robić to, co chciałeś, próbuję wyjaśnić, co było nie tak (co chciałeś.
W Bash if
należy wykonać polecenie. Jeśli kod wyjścia tego polecenia jest równy 0, wówczas then
część jest wykonywana, w przeciwnym else
razie część jest wykonywana.
Możesz to zrobić za pomocą dowolnego polecenia, jak wyjaśniono w innych odpowiedziach: if /bin/true; then ...; fi
[[
to wewnętrzna komenda bash dedykowana do niektórych testów, takich jak istnienie pliku, porównania zmiennych. Podobnie [
jest z zewnętrznym poleceniem (zwykle znajduje się w /usr/bin/[
), które wykonuje z grubsza te same testy, ale potrzebuje ]
ostatecznego argumentu, dlatego ]
należy uzupełnić spacją po lewej stronie, co nie jest prawdą ]]
.
Tutaj nie musisz [[
ani [
.
Kolejną rzeczą jest sposób, w jaki cytujesz rzeczy. W bash jest tylko jeden przypadek, w którym pary cudzysłowów się zagnieżdżają "$(command "argument")"
. Ale w 'grep 'SomeString' $File'
tobie masz tylko jedno słowo, ponieważ 'grep '
jest to cytowana jednostka, która jest łączona z, SomeString
a następnie ponownie łączona z ' $File'
. Zmienna $File
nie jest nawet zastępowana jej wartością ze względu na użycie pojedynczych cudzysłowów. Właściwy sposób to zrobić grep 'SomeString' "$File"
.
Jeśli chcesz sprawdzić, czy plik nie zawiera określonego ciągu, możesz to zrobić w następujący sposób.
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
Najkrótsza (poprawna) wersja:
grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"
można również zapisać jako
grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"
ale w tym przypadku nie trzeba tego jawnie testować, więc to samo z:
grep -q "something" file && echo "yes" || echo "no"
if grep -q something file; then echo yes; else echo no; fi
. $?
W ogóle nie ma powodu do bałaganu .
Jeśli chcesz sprawdzić, czy ciąg pasuje do całej linii, a jeśli jest to ciąg stały, możesz to zrobić w ten sposób
grep -Fxq [String] [filePath]
przykład
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
Z pliku 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.)
grep -q [PATTERN] [FILE] && echo $?
Status wyjścia ma wartość 0
(prawda), jeśli wzorzec został znaleziony; w przeciwnym razie puste.
if grep -q [string] [filename]
then
[whatever action]
fi
Przykład
if grep -q 'my cat is in a tree' /tmp/cat.txt
then
mkdir cat
fi
Spróbuj tego:
if [[ $(grep "SomeString" $File) ]] ; then
echo "Found"
else
echo "Not Found"
fi
grep
zwraca bardzo dobry powód status wyjścia; przechwytywanie wyniku w ciągu może potencjalnie przechowywać dużą ilość tekstu w buforze, aby można było powiedzieć, że nie jest pusty.
Zrobiłem to, wydaje się, że działa dobrze
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"
$?
, ale w ogóle nie ma takiej potrzeby - wystarczyif grep -q ...
foo && truthy_action || falsey_action
nie jest prawdziwym operatorem trójskładnikowym - jeśli truthy_action
zawiedzie, falsey_action
zostanie dodatkowo uruchomiony .
if
jest uruchomienie komendy i sprawdzić jego kod wyjścia. Bardzo rzadko trzeba $?
jawnie badać .