Odpowiedzi:
To sprawdza, które $1
są puste, choć powinny być cytowane (identycznie jak [ -z "$1" ]
). Niektóre bardzo stare powłoki nie obsługiwały poprawnie pustych łańcuchów, więc autorzy skryptów przenośnych przyjęli ten styl sprawdzania. Nie było to konieczne od dziesięcioleci, ale ludzie nadal robią to w ten sposób, ponieważ ludzie nadal tak robią.
[ x$1 = x ]
jest nadal niepoprawny, ale [ "x$1" = x ]
dotyczyłby powłok, które mają problem z gdzie $1
jest !
lub (
lub -n
.... [ "" = "$1" ]
i case $1 in "")
również byłyby OK.
[ -z "$1" ]
i [ "$1" = "" ]
nadal nie działa z / bin / sh Solaris 10, poprzedni z dash-0.5.4.
[ "$1" = "" ]
nadal nie działa z jego /bin/sh
(choć tylko chcesz używać /usr/xpg4/bin/sh
tam, nie /bin/sh
). kres został naprawiony w tym względzie w styczniu 2009 r.
Nawiasy kwadratowe wskazują na test , więc [ x$1 = x]
bez if
lub coś podobnego jest bez znaczenia, chociaż składniowo ok.
Ma on oceniać jako prawda, jeśli x$1
rozwija się x
, a w przeciwnym razie fałsz, ale ponieważ nie jest cytowany, jeśli $1
jest (np.) „Hej x”, powłoka zobaczy x = x
, więc ta konstrukcja nadal nie jest bezpieczna.
Celem tego x = x
sprawdzenia jest ustalenie, czy zmienna jest pusta. Częstszym sposobem na to byłoby po prostu użycie cudzysłowów:
if [ "$1" = "" ]; then
Operatorzy testowe bash -z
i -n
może być również używany, ale są one mniej przenośne do innych rodzajów muszli. 1
Powodem cytowania lub tego x$1
jest to, że lewa strona nie rozwija się do zera, co byłoby błędem składniowym:
if [ = x ] # No good!
if [ "" = "" ] # Okay.
if [ x = x ] # Also okay.
1. W rzeczywistości test
może być samodzielnym narzędziem, ale większość powłok implementuje je jako wbudowane; sprawdź różnicę między which test
i type test
. W GNU / Linux man test
twierdzi, że odnosi się do wbudowanego, ale jeśli wywołasz (np.) /usr/bin/test
, To narzędzie wydaje się implementować funkcje udokumentowane na stronie podręcznika, w tym -z
i -n
.
[ x$1 = x ]
oceni również prawdę, jeśli tak $1
jest na przykład " -o x"
. Spróbować sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
jest zły i nie ma sensu.
if
go używać test
, możesz go użyć przed &&
, ||
po while
lub sprawdzić wynik za pomocą$?
[ x$1 = x ]
Ma to sens tylko w zsh
. To porównuje konkatenację x
z pierwszym argumentem skryptu do x
. Tak więc [
polecenie zwraca true, jeśli $1
jest puste lub nie zostało podane.
[ $1 = "" ]
Nie działałoby, ponieważ zsh
gdy pusta zmienna nie jest cytowana w kontekstach list, nie rozwija się w ogóle do żadnego argumentu zamiast pustego argumentu, więc gdyby $1
były nieustawione lub puste, [
polecenie otrzymywałoby tylko jako argumenty [
, =
pusty ciąg i z ]
czego to nie miało sensu. [ -z "$1" ]
lub [ "$1" = "" ]
byłoby OK, chociaż jak w powłokach POSIX.
W powłokach typu Bourne'a / POSIX [ x$1 = x ]
nie ma sensu. To jest operator split + glob w jakiś sposób zastosowany do konkatenacji x
i pierwszy argument skryptu, mając nadzieję, że wynik i, =
i x
, i ]
tworzą prawidłowe wyrażenie testowe dla [
polecenia.
Na przykład, jeśli skrypt został przekazany jednego " = x -o x ="
argumentu, [
by otrzymać te argumenty: [
, x
, =
, x
, -o
, x
, =
, x
, ]
, który [
zrozumie porównać x
z x
i x
z x
a return true.
Gdyby tak $1
było "* *"
, to powłoka przekazałaby do [
polecenia listę plików w bieżącym katalogu, których nazwa zaczyna się od x
(globalne rozszerzenie x*
), a następnie listę plików nie ukrytych (rozszerzenie *
) ... co [
jest mało prawdopodobne z jakiegokolwiek sensu. Jedynymi przypadkami, w których byłoby to sensowne, jest to, $1
że nie zawiera symboli wieloznacznych ani pustych znaków.
Teraz czasem znajduje się kod:
[ "x$1" = x ]
Służy do sprawdzania, czy $1
jest pusty lub rozbrojony.
Normalny sposób testowania pustej lub nieuzbrojonej zmiennej to:
[ -z "$1" ]
Ale to nie udaje się w przypadku niektórych wartości $1
podobnych =
w niektórych [
implementacjach (nie POSIX), takich jak wbudowana w powłoce Bourne'a, jak znaleziono /bin/sh
w Solarisie 10 i wcześniejszych wersjach lub niektórych starych wersjach dash
(do 0.5.4) lub sh
niektórych BSD.
To dlatego, że [
widzi [
, -z
, =
, ]
i narzeka na brak argumentów do =
operatora binarnego zamiast zrozumienia go jako -z
operator jednoargumentowy stosowane do =
łańcucha.
Podobnie [ "$1" = "" ]
nie udaje się w przypadku niektórych implementacji [
if $1
is !
lub (
.
W tych powłokach / [
implementacjach:
[ "x$1" = x ]
jest zawsze ważnym testem niezależnie od wartości $1
, więc są:
[ "" = "$1" ]
i:
[ -z "${1:+x}" ]
i
case $1 in "") ...; esac
Oczywiście, jeśli chcesz sprawdzić, czy nie podano argumentu, wykonaj następujące czynności:
[ "$#" -eq 0 ]
Oznacza to, że sprawdzasz liczbę argumentów przekazanych do skryptu.
Należy zauważyć, że w dzisiejszych czasach, [ -z "$var" ]
jest jasno określony przez POSIX i nie może zabraknąć w zgodnymi [
wdrożeń (a bash
„s [
jest i był przez dziesięciolecia). Powinieneś więc móc polegać na nim w POSIX sh lub bash
skryptach.
x$1
jest łączeniem dwóch łańcuchów, x
a $1
jeśli $ 1 jest pusty, x $ 1 równa się x, a [x $ 1 = x] będzie w rezultacie prawdziwe. x = y
służy do porównywania napisów w sh
x$1
nie jest cytowany, więc dzielenie i globowanie jest wykonywane na nich.
[ x$1 = x ]
ma wartość true, jeśli $1
jest nieustawione / zerowe / puste lub nie.
Wypróbuj się z:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
i
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"
[ x$1 = x ]
jest również prawdą, jeśli tak $1
jest na przykład " -o x"
. Spróbować sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
jest zły i nie ma sensu.