[ -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 "")...може бути краще.