[ -n ]
не використовує -n
тест.
-n
У [ -n ]
це не тест на всіх. Якщо між [
і є лише один аргумент ]
, цей аргумент - це рядок, який тестується, щоб перевірити, чи він порожній. Навіть коли ця струна має провідне місце -
, вона все ж інтерпретується як операнд, а не тест. Оскільки рядок -n
не порожній - він містить два символи -
і n
, не нульові символи, - [ -n ]
оцінює як істинне.
Як каже Ігнасіо Васкес-Абрамс , де string
є єдиний аргумент, тест, виконаний string
в, є таким же, як і тест, виконаний ним . Коли буває , нічого особливого не відбувається. В і друге в просто рядки, яку відчувають порожнечу.[ string ]
[ -n string ]
string
-n
-n
[ -n ]
-n
[ -n -n ]
Якщо між [
і ]
аргументом є лише один аргумент , цей аргумент - це завжди рядок, який слід перевірити на непомітність, навіть якщо він має бути названий таким же, як тест. Точно так само, коли між [
та ]
і першим з них є два аргументи -n
, другий - це завжди рядок, який підлягає тестуванню на непомітність, навіть якщо він трапляється називатися таким же, як і тест. Це просто тому, що синтаксис для [
наполягає на тому, що один аргумент між [
і ]
після -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 "")...
може бути краще.