Zacząłem uczyć się języka Bash kilka dni temu.
Próbuję uzyskać status wyjścia grep
wyrażenia w zmiennej takiej jak ta:
check=grep -ci 'text' file.sh
a wyjście, które mam, to
No command '-ic' found
Czy powinienem to zrobić za pomocą polecenia potoku?
bash
shell
command-line
grep
exit-status
omri gilhar
źródło
źródło
$?
zaraz po zakończeniu komendy.Odpowiedzi:
Twoje rozkaz
będą interpretowane przez powłokę jako „uruchom polecenie
-ci
z argumentamitext
ifile.sh
i ustaw zmiennącheck
na wartośćgrep
w jej środowisku”.Powłoka przechowuje w zmiennej wartość wyjściową ostatnio wykonanego polecenia
?
. Możesz przypisać jego wartość do jednej ze swoich zmiennych, takich jak to:Jeśli chcesz zastosować tę wartość, możesz albo użyć swojej
check
zmiennej:lub możesz pominąć użycie oddzielnej zmiennej i konieczność sprawdzenia
$?
wszystkich razem:(zwróć uwagę
-q
, że instruuje,grep
aby niczego nie wysyłać i wychodzić, gdy tylko coś się dopasuje; tak naprawdę nie jesteśmy zainteresowani tym, co pasuje tutaj)Lub, jeśli chcesz po prostu „robić rzeczy”, gdy wzór nie zostanie znaleziony:
Zapisywanie
$?
w innej zmiennej jest zawsze potrzebne tylko wtedy, gdy trzeba jej użyć później, gdy wartość w$?
została zastąpiona, jak wW powyższym fragmencie kodu
$?
zostanie zastąpiony wynikiem[ "$err" -ne 0 ] && [ ! -d "$dir" ]
testu. Zapisanie go tutaj jest naprawdę konieczne tylko wtedy, gdy musimy go wyświetlić i używać zexit
.źródło
Twoje pytanie jest niejasne, ale w oparciu o przesłany kod wygląda na to, że chcesz, aby zmienna
check
przechowywała status wyjściagrep
polecenia. Sposobem na to jest uruchomieniePodczas uruchamiania polecenia z powłoki, jej status wyjścia jest udostępniane za pośrednictwem specjalnego parametru powłoki
$?
.Jest to udokumentowane przez POSIX (standard dla systemów operacyjnych typu Unix) w specyfikacji dla powłoki, a implementacja Bash jest udokumentowana w parametrach specjalnych .
Ponieważ jesteś nowym uczniem, zdecydowanie polecam zacząć od dobrej książki i / lub samouczka online, aby uzyskać podstawy. Zalecenia dotyczące zasobów zewnętrznych są odradzane na stronach Stack Exchange, ale sugerowałbym Bash Guide Lhunatha i GreyCata .
źródło
Poleciłeś bashowi ustawić zmienną
check=grep
w środowisku, które przekazuje do poleceniaale
ci
nie istnieje.Sądzę, że chciałeś zawrzeć to polecenie w tyknięciach wstecz lub w nawiasach poprzedzonych znakiem dolara, z których każdy przypisałby liczbę wierszy, w których „tekst” został znaleziony (bez rozróżniania wielkości liter) w pliku:
Teraz
$check
powinno być 0, jeśli nie ma żadnych dopasowań, lub dodatnie, jeśli były jakieś dopasowania.źródło
Mylić, dlaczego przy użyciu -c podczas sprawdzania danych wyjściowych? Służy do sprawdzania, ile razy coś jest dopasowywane - nie, czy się powiedzie, czy nie.
ale w tym przykładzie
Nie wypisuje niczego poza kodem wyjścia, który jest następnie powtarzany. To dane wyjściowe wykorzystuje sprawdzanie zmiennych. Wolę też, ponieważ jest to pojedyncza linia.
Możesz zamienić --silent na -q. Używam go, ponieważ nie jesteś zainteresowany wyjściem grep, tylko czy zadziałało, czy nie.
źródło
Prawidłowy sposób przypisania wyjścia polecenia grep do zmiennej jest taki, jak wspomniano @ monty-trudniej:
Aby przypisać status wyjścia tego polecenia do zmiennej, musisz użyć parametru powłoki
$?
zaraz po wykonaniu polecenia, jak pokazano poniżej:źródło