Ich habe ein Shell-Skript, in dem die folgenden Zeilen if [ -z "$xyz" ]
und if [ -n "$abc" ]
, aber ich bin nicht sicher, was ihr Zweck ist. Kann jemand bitte erklären?
Antwort
Sie finden eine sehr schöne Referenz für die Operatoren von bash hier . Wenn Sie eine andere Shell verwenden, suchen Sie einfach nach <my shell> operators
und Sie finden alles, was Sie brauchen. In Ihrem speziellen Fall sind Sie es Verwenden von:
-n string is not null. -z string is null, that is, has zero length
Zur Veranschaulichung:
$ 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
Kommentare
- Wenn Sie Probleme haben,
-n
zum Laufen zu bringen, kann dies daran liegen, dass Sie einigen schlechten Anleitungen im Web folgen (z. B. GeeksforGeeks oder TutorialsPoint ), die die Variablen nicht zitieren. Diese Antwort und die hier verlinkte Anleitung zitieren korrekt it. Wenn Sie-n
ohne Anführungszeichen verwenden, wird angezeigt, dass ' nicht leer ist, auch wenn es ist! @terdon, vielen Dank!
Antwort
man test
oder man [
bietet Ihnen alle Optionen zum Testen des Befehls. In diesem Fall prüft -n, ob der Inhalt von $ abc eine Länge ungleich Null hat, und -z prüft, ob der Inhalt von $ xyz eine Zeichenfolge mit der Länge Null ist.
Kommentare
- man [funktioniert nicht ' funktioniert nicht für mich in GNU bash, Version 4.1.2 (1) -release (x86_64- redhat-linux-gnu). Aber +1 für Man-Test.
- Hinweis
man test
(immer?) Gibt die Manpage für die externe Programmversion an, die (für die GNU-coreutils-Version unter am wenigsten) warnt ausdrücklich davor, dass einige (IME die meisten) Shells eine integrierte Version haben, die möglicherweise unterschiedlich ist.
Antwort
Um die Antwort von terdon „zu erweitern , stellte ich fest, dass Unix / Linux – Shell-Basisoperatoren in Tutorials Point enthält auch dateibezogene Operatoren (sowie andere nützliche Operatoren).
-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.