[ -n ]
не использует -n
тест.
-n
В [ -n ]
это не тест на всех. Если между [
и есть только один аргумент ]
, этот аргумент является строкой, которая проверяется, чтобы определить, является ли она пустой. Даже если эта строка имеет ведущий -
, она все равно интерпретируется как операнд, а не тест. Поскольку строка -n
не пуста - она содержит два символа, -
и n
, не нулевой characters-- имеет [ -n ]
значение верно.
Как говорит Игнасио Васкес-Абрамс , где string
один аргумент, тест, выполняемый в string
in, совпадает с тестом, выполненным для него . Когда это случается , ничего особенного не происходит. В и второй в просто строки, испытываемых пустоты.[ string ]
[ -n string ]
string
-n
-n
[ -n ]
-n
[ -n -n ]
Когда между [
и есть только один аргумент ]
, этот аргумент всегда является строкой, которая должна быть проверена на непустоту, даже если она названа так же, как и тест. Точно так же, когда между [
и ]
и есть два аргумента, и первый из них есть -n
, второй всегда является строкой, которая должна быть проверена на непустоту, даже если она названа так же, как и тест. Это просто потому, что синтаксис for [
настаивает на том, что один аргумент между [
и ]
после -n
является строковым операндом.
По той же причине, по [ -n ]
которой не используется -n
тест, [ -z ]
не используется -z
тест.
Вы можете узнать больше о [
в bash
, исследуя помощь для него. Обратите внимание, что это встроенная оболочка :
$ type [
[ is a shell builtin
Таким образом, вы можете запустить, help [
чтобы получить помощь по этому вопросу:
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
Для получения дополнительной информации, в том числе о том, какие тесты поддерживаются и как они работают, вам необходимо обратиться к справке test
. Когда вы запустите команду help test
, вы получите подробный список. Вместо того, чтобы воспроизводить все это, вот часть о строковых операторах:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.
Обратите внимание на это -n STRING
и просто STRING
сделайте то же самое: они проверяют, не является ли строка STRING
пустой.
[ -t ]
проверялось, является ли stdout терминалом (сокращенно[ -t 1 ]
), и некоторые оболочки все еще делают это (в случае,ksh93
когда это-t
буквально), так что лучше использовать,[ -n "$var" ]
чем[ "$var" ]
. Хотя это все равно не в некоторых старыхtest
реализациях для значений ,$var
как=
, в этом случае ,[ "" != "$var" ]
или[ "x$var" != x ]
илиcase $x in "")...
может быть лучше.