[ -n ]не использует -nтест.
-nВ [ -n ]это не тест на всех. Если между [и есть только один аргумент ], этот аргумент является строкой, которая проверяется, чтобы определить, является ли она пустой. Даже если эта строка имеет ведущий -, она все равно интерпретируется как операнд, а не тест. Поскольку строка -nне пуста - она содержит два символа, -и n, не нулевой characters-- имеет [ -n ]значение верно.
Как говорит Игнасио Васкес-Абрамс , где stringодин аргумент, тест, выполняемый в stringin, совпадает с тестом, выполненным для него . Когда это случается , ничего особенного не происходит. В и второй в просто строки, испытываемых пустоты.[ 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 "")...может быть лучше.