Ho uno script di shell in cui abbiamo le seguenti righe if [ -z "$xyz" ]
e if [ -n "$abc" ]
, ma non sono sicuro di quale sia il loro scopo. Qualcuno può spiegare per favore?
Risposta
Puoi trovare un bel riferimento per gli operatori di bash qui . Se utilizzi una shell diversa, cerca <my shell> operators
e troverai tutto ciò di cui hai bisogno. Nel tuo caso particolare, sei utilizzando:
-n string is not null. -z string is null, that is, has zero length
Per illustrare:
$ 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
Commenti
Risposta
man test
o man [
ti forniranno tutte le opzioni per testare il comando. In questo caso, -n verifica se il contenuto di $ abc ha una lunghezza diversa da zero e -z verifica se il contenuto di $ xyz è una stringa di lunghezza zero.
Commenti
- man [doesn ' t funziona per me in GNU bash, versione 4.1.2 (1) -release (x86_64- redhat-linux-gnu). Ma +1 per man test.
- Nota
man test
(sempre?) Fornisce la pagina man per la versione del programma esterno, che (per la versione GNU-coreutils su almeno) avverte esplicitamente che alcune shell (IME la maggior parte) hanno una versione incorporata che potrebbe essere diversa.
Answer
Per estendere la risposta di terdon “, ho scoperto che Unix / Linux – Shell Basic Operators on Tutorials Point include anche operatori relativi ai file (oltre ad altri utili).
-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
, potrebbe essere perché stai seguendo alcune cattive guide sul Web (ad esempio GeeksforGeeks o TutorialsPoint ) che non citano le variabili. Questa risposta e la guida collegata qui citano correttamente Se utilizzi-n
senza virgolette, ti dirà che ' non è vuoto anche quando lo è! @terdon, grazie mille!