variable - bash test




Testen Sie die Länge der Zeichenfolge ungleich Null in Bash:[-n "$ var"] oder (4)

Ich habe gesehen, dass Bash-Skripte auf zwei verschiedene Arten auf Nicht-Null-Länge-Strings testen. Die meisten Skripte verwenden die Option -n:

#!/bin/bash
# With the -n option
if [ -n "$var" ]; then
  # Do something when var is non-zero length
fi

Aber die Option -n wird nicht wirklich benötigt:

# Without the -n option
if [ "$var" ]; then
  # Do something when var is non-zero length
fi

Welcher ist der bessere Weg?

Ähnlich ist der bessere Weg zum Testen auf Null:

if [ -z "$var" ]; then
  # Do something when var is zero-length
fi

oder

if [ ! "$var" ]; then
  # Do something when var is zero-length
fi

Die richtige Antwort lautet wie folgt:

if [[ -n $var ]] ; then
  blah
fi

Beachten Sie die Verwendung von [[...]] , die das Angeben der Variablen für Sie korrekt behandelt.


Diese Antwort seit diesem Beitrag zu veröffentlichen ist als nur bash markiert.

Es ist besser, die mächtigeren [[ so weit wie Bash betrifft] zu verwenden.

Übliche Fälle

if [[ $var ]]; then   # var is set and it is not empty
if [[ ! $var ]]; then # var is not set or it is set to an empty string

Die obigen zwei Konstrukte sehen sauber und lesbar aus. Sie sollten in den meisten Fällen ausreichen.

Beachten Sie, dass wir die Variablenerweiterungen innerhalb [[ da keine Gefahr der Worttrennung und globbing .

Seltene Fälle

In dem seltenen Fall, dass wir unterscheiden müssen zwischen "auf einen leeren String gesetzt" und "überhaupt nicht gesetzt" können wir diese verwenden:

if [[ ${var+x} ]]; then           # var is set but it could be empty
if [[ ! ${var+x} ]]; then         # var is not set
if [[ ${var+x} && ! $var ]]; then # var is set and is empty

Wir können auch den -v Test verwenden:

if [[ -v var ]]; then             # var is set but it could be empty
if [[ ! -v var ]]; then           # var is not set
if [[ -v var && ! $var ]]; then   # var is set and is empty

Mehr Diskussion

Es gibt eine Menge Fragen und Antworten dazu. Hier sind ein paar:

  • Wie überprüft man, ob eine Variable in Bash gesetzt ist?
  • Sind doppelte eckige Klammern [[]] gegenüber einzelnen eckigen Klammern [] in Bash vorzuziehen?
  • Was ist der Unterschied zwischen einfachen und doppelten eckigen Klammern in Bash?
  • Eine ausgezeichnete answer von mklement0 wo er über [[ vs [

Hier sind einige weitere Tests

True, wenn die Zeichenfolge nicht leer ist:

[ -n "$var" ]
[[ -n $var ]]
test -n "$var"
[ "$var" ]
[[ $var ]]
(( ${#var} ))
let ${#var}
test "$var"

True, wenn die Zeichenfolge leer ist:

[ -z "$var" ]
[[ -z $var ]]
test -z "$var"
! [ "$var" ]
! [[ $var ]]
! (( ${#var} ))
! let ${#var}
! test "$var"

Verwenden Sie case/esac zum Testen

case "$var" in
  "") echo "zero length";;
esac




if-statement