Mam skrypt powłoki, w którym mamy następujące wiersze if [ -z "$xyz" ]
i if [ -n "$abc" ]
, ale nie jestem pewien, jaki jest ich cel. Czy ktoś może wyjaśnić?
Odpowiedź
Możesz znaleźć bardzo ładne odniesienie do operatorów basha tutaj . Jeśli używasz innej powłoki, po prostu wyszukaj <my shell> operators
, a znajdziesz wszystko, czego potrzebujesz. W tym konkretnym przypadku używając:
-n string is not null. -z string is null, that is, has zero length
Aby zilustrować:
$ foo="bar"; $ [ -n "$foo" ] && echo "foo is not null" foo is not null $ [ -z "$foo" ] && echo "foo is null" $ foo=""; $ [ -n "$foo" ] && echo "foo is not null" $ [ -z "$foo" ] && echo "foo is null" foo is null
Komentarze
Odpowiedź
man test
lub man [
udostępnia wszystkie opcje testowania polecenia. W tym przypadku -n sprawdza, czy zawartość $ abc ma niezerową długość, a -z sprawdza, czy zawartość $ xyz jest ciągiem o zerowej długości.
Komentarze
- man [doesn ' nie działa dla mnie w GNU bash, wersja 4.1.2 (1) -release (x86_64- redhat-linux-gnu). Ale +1 dla man test.
- Uwaga
man test
(zawsze?) Daje stronę podręcznika dla wersji programu zewnętrznego, która (dla wersji GNU-coreutils pod adresem najmniej) wyraźnie ostrzega, że niektóre powłoki (większość IME) mają wbudowaną wersję, która może być inna.
Odpowiedź
Aby rozszerzyć odpowiedź terdona , stwierdziłem, że Unix / Linux – podstawowe operatory powłoki w punkcie samouczków zawiera także operatory związane z plikami (a także inne przydatne).
-b file Checks if file is a block special file; if yes, then the condition becomes true. [ -b $file ] is false. -c file Checks if file is a character special file; if yes, then the condition becomes true. [ -c $file ] is false. -d file Checks if file is a directory; if yes, then the condition becomes true. [ -d $file ] is not true. -f file Checks if file is an ordinary file as opposed to a directory or special file; if yes, then the condition becomes true. [ -f $file ] is true. -g file Checks if file has its set group ID (SGID) bit set; if yes, then the condition becomes true. [ -g $file ] is false. -k file Checks if file has its sticky bit set; if yes, then the condition becomes true. [ -k $file ] is false. -p file Checks if file is a named pipe; if yes, then the condition becomes true. [ -p $file ] is false. -t file Checks if file descriptor is open and associated with a terminal; if yes, then the condition becomes true. [ -t $file ] is false. -u file Checks if file has its Set User ID (SUID) bit set; if yes, then the condition becomes true. [ -u $file ] is false. -r file Checks if file is readable; if yes, then the condition becomes true. [ -r $file ] is true. -w file Checks if file is writable; if yes, then the condition becomes true. [ -w $file ] is true. -x file Checks if file is executable; if yes, then the condition becomes true. [ -x $file ] is true. -s file Checks if file has size greater than 0; if yes, then condition becomes true. [ -s $file ] is true. -e file Checks if file exists; is true even if file is a directory but exists. [ -e $file ] is true.
-n
, może to być spowodowane tym, że postępujesz zgodnie z kiepskimi przewodnikami w sieci (na przykład GeeksforGeeks lub TutorialsPoint ), które nie cytują zmiennych. Ta odpowiedź i linkowany tutaj przewodnik poprawnie cytują Jeśli użyjesz-n
bez cytowania, powie Ci, że ' nie jest pusty, nawet jeśli jest! @terdon, wielkie dzięki!