Bash: DECLARE / STYSET без назначения, по-видимому, не удается

Я бы сделал это, связав простые задачи:

grep 'Error Code: 704' test_log | uniq | less

Команда grep выберет только строки, содержащие строку «Код ошибки: 704». Команда uniq сохранит только по одному элементу каждого элемента. Знак «>» будет использовать стандартный вывод и отправлять его в файл с именем «new_file»

Возможно, есть более эффективные способы сделать это, о которых я пока не знаю

1
10.01.2019, 20:40
2 ответа

Действительно, предположение о значении параметра/переменной неустановленного в OP является неточным.

man bashопределяет переменную как особый тип параметра. Поэтому информация о переменных иногда находится в разделах, относящихся только к параметрам в целом.

Общие термины, характеризующие переменные

Термины, описывающие характеристики и состояния относительно переменных из статьи Википедии о переменных .

  1. объявленное состояние:память зарезервирована, имя существует
  2. инициализированное состояние:в дополнение к 1. значение присваивается (непосредственно после объявления)
  3. неинициализированное состояние:значение не определено, начальное значение не установлено (просто объявление имело место)
  4. ноль значение :зарезервированное/специальное значение, возвращаемое некоторыми языками программирования для указания неинициализированной переменной

Пункты руководства bash, относящиеся к переменным

  1. состояние установки:«Параметр установлен, если ему было присвоено значение». [Раздел ПАРАМЕТРЫ]
  2. неустановленное состояние , двусмысленное, похоже, применимо к переменным, которые больше не существуют/не существуют, и к переменным в «неинициализированном состоянии» в соответствии с общими условиями :«... bash проверяет параметр, который не установлен... " [Сегмент расширения параметра]
  3. нулевая/нулевая строка-пустое значение :"Параметр устанавливается, если ему было присвоено значение. Нулевая строка является допустимым значением." [Раздел ПАРАМЕТРЫ]
  4. сброс встроенной-команды "гашения" переменных, например.unset string:«Для каждого имени удалить соответствующую переменную…» [раздел «ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ», параграф «unset»]
  5. объявить встроенный-например.declare -p string:«Опция -p будет отображать атрибуты и значения каждого имени». [Раздел ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ,«объявить»/«набрать» абзац]

Re -с формулировкой исходного вопроса и ответом на него

Вопрос должен был быть более точно сформулирован как :" Как можно отличить неинициализированную переменную bash от не -существующей? "

Ответ на это:

  1. Не удивляйтесь тому, чтоunsetвстроенная функция удаляет переменную из существования, а переменная в неустановленном состоянии в терминах bash является переменной, которая либо не была объявлена, либо была объявлена ​​без стоимость.

  2. Встроенная команда declareдействительно ведет себя непоследовательно в bash 4.3 по сравнению с bash 4.4 в отношении переменных, объявленных без значения:

    $ # bash 4.3
    $ unset string; declare string; declare -p string; echo $?
    bash: declare: string: not found
    1
    $ # bash 4.4
    $ unset string; declare string; declare -p string; echo $?
    declare -- string
    0
    

    Таким образом, этот способ проверки одного используемого имени переменной не является универсальным, но работает в последних версиях bash.

  3. К сожалению, раскрытие параметров не поможет провести различие между -несуществующими и неинициализированными переменными, так как обе ситуации охватываются одним и тем же неустановленным состоянием:

    $ declare string; echo ${string-UNSET} # `string` exists, empty
    UNSET
    $ unset string; echo ${string-UNSET} # `string` does not exist
    UNSET
    
  4. К сожалению, также условный оператор -vне помогает [руководство раздел CONDITIONAL EXPRESSIONS], он проверяет, было ли «переменной оболочки VARNAME установлено (присвоено значение )», без указания того, является ли VARNAME существовало в первую очередь:

    $ unset string; ! [ -v string ] && echo "unused"
    unused
    $ declare string; ! [ -v string ] && echo "unused"
    unused
    

Похожие темы

Обсуждения, посвященные путанице в терминологии и особенностям bash в отношении состояний и значений параметров/переменных:

  1. Как проверить, существует ли переменная...

  2. Как проверить, определена ли вообще переменная в Bash...

  3. Нулевая строка и «» — это одна и та же строка?

1
27.01.2020, 23:18

В версиях bash до 3.2 последовательность:

 $ declare string; declare -p string

Выводит declare -- string="", что показывает, что переменная получает нулевую строку.

В версиях 4.1, 4.2 и 4.3 переменная ничего не устанавливает, что на самом деле вызывает ошибку:

 $ declare string; declare -p string
 bash: declare: string: not found

Решено на bash 4.4:

 $ declare string; declare -p string
 declare -- string

Это означает, что строка была объявлена, но ей не было присвоено никакого значения (, даже нулевого ).

3
27.01.2020, 23:18

Теги

Похожие вопросы