Chciałbym, aby echo
polecenie zostało wykonane, gdy cat /etc/passwd | grep "sysa"
nie jest prawdziwe.
Co ja robię źle?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
bash
if-statement
syntax
boolean-expression
Sandra Schlichting
źródło
źródło
!
nie powinno być w nawiasach? tj.[ ! EXPR ]
Odpowiedzi:
próbować
grep
zwraca,true
jeśli znajdzie cel wyszukiwania, afalse
jeśli nie.Więc NIE
false
==true
.if
Ocena w powłokach ma być bardzo elastyczna i wiele razy nie wymaga łańcuchów poleceń (jak napisałeś).Patrząc na kod
$( ... )
w obecnej postaci, należy pochwalić użycie metody podstawienia cmd, ale zastanów się, co z tego wynika. Spróbujecho $(cat /etc/passwd | grep "sysa")
zobaczyć, co mam na myśli. Możesz pójść dalej, używając opcji-c
(count), aby grep, a następnie zrobić to,if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
co działa, ale jest to raczej stara szkoła.ALE, możesz użyć najnowszych funkcji powłoki (ocena arytmetyczna), takich jak
co daje również korzyść z używania operatorów porównania opartych na c-lang
==,<,>,>=,<=,%
i kilku innych.W tym przypadku, według komentarza Orwellophile'a, ocena arytmetyczna może być jeszcze bardziej ograniczona
LUB
Wreszcie jest nagroda o nazwie
Useless Use of Cat (UUOC)
. :-) Niektórzy skaczą w górę i w dół i płaczą gothca! Powiem tylko, żegrep
może przyjmować nazwę pliku na linii cmd, więc po co wywoływać dodatkowe procesy i konstrukcje rur, kiedy nie musisz? ;-)Mam nadzieję, że to pomoże.
źródło
grep "^$user:" /etc/passwd
byłby bardziej prawidłowym sposobem wyszukiwania / etc / passwd przypadkowo -grep -v
gdzie -v odwraca wyszukiwanie, jeśli chcesz aby uniknąć bałaganu ||(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
Myślę, że można to uprościć w:
lub w jednym wierszu poleceń
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
źródło
1>&2
na końcuecho
do drukowaniastderr
?!: not found
'grep
tego w ten sposób.-q
tłumi wydajność.$(...)
zawiera wartość , a nie status wyjścia, dlatego takie podejście jest błędne. Jednak w tym konkretnym przypadku to rzeczywiście działa, ponieważsysa
zostanie wydrukowane, dzięki czemu instrukcja testowa się spełni. Jednakif ! [ $(true) ]; then echo false; fi
zawsze wydrukowaćfalse
, ponieważtrue
komenda nie pisze nic na standardowe wyjście (mimo że kod wyjścia jest równy 0). Dlatego należy go przeformułowaćif ! grep ...; then
.Alternatywą byłoby
cat /etc/passwd | grep "sysa" || echo error
. Edit: Jak Alex wskazał, kot ma sensu tutaj :grep "sysa" /etc/passwd || echo error
.Znalazłem inne odpowiedzi raczej mylące, mam nadzieję, że to komuś pomoże.
źródło
W systemach Unix, które go obsługują (wydaje się, że nie macOS):
Ma to tę zaletę, że wysyła zapytanie do dowolnej usługi katalogowej, która może być używana (YP / NIS lub LDAP itp.) Oraz do lokalnego pliku bazy danych haseł.
Problem
grep -q "$username" /etc/passwd
polega na tym, że daje fałszywie dodatni wynik, gdy nie ma takiego użytkownika, ale coś innego pasuje do wzorca. Może się to zdarzyć, jeśli w pliku znajduje się częściowe lub dokładne dopasowanie.Na przykład w moim
passwd
pliku jest napis:W ten sposób sprowokować ważny mecz na rzeczy, jak
cara
ienoc
itd., Mimo że nie ma takich użytkowników na moim systemie.Aby
grep
rozwiązanie było poprawne, musisz poprawnie przeanalizować/etc/passwd
plik:... lub jakikolwiek inny podobny test w stosunku do pierwszego z
:
-delimowanych pól.źródło
bash
W tym przypadku Twój kod prawdopodobnie nie jest wykonywany .Oto przykładowa odpowiedź:
Aby upewnić się, że rejestratory danych są w trybie online,
cron
skrypt uruchamia się co 15 minut i wygląda następująco:... i tak dalej dla każdego rejestratora danych, który można zobaczyć w montażu na stronie http://www.SDsolarBlog.com/montage
FYI, używając
&>/dev/null
przekierowuje wszystkie dane wyjściowe polecenia, w tym błędy, do/dev/null
(Warunkowe wymaga tylko
exit status
zping
poleceniem)Również FYI, zauważ, że ponieważ
cron
zadania działają, ponieważroot
nie ma potrzeby używaniasudo ping
wcron
skrypcie.źródło