Может ли переменная оболочки включать – символ?

Я не могу использовать - в переменных в оболочке. Есть ли способ использовать его, потому что у меня есть один скрипт, который зависит от таких именных переменных:

 $export ab=c -bash: export: `ab=c': not a valid identifier $export a_b=c 

Сначала выбрасывает данную ошибку, а вторая работает нормально.

  • Отдельные файлы ZIP для папок - Исключая несколько
  • Как установить дамп базы данных через Shell Script?
  • Как получить дату с двухнедельной давности с использованием даты Solaris?
  • Почему возникает ошибка при двойном цитировании одинарных кавычек в скрипте, который запускает удаленную команду SSH?
  • Правильное поведение ловушек EXIT и ERR при использовании `set -eu`
  • Как использовать регулярное выражение в sed?
  • Файлы размером более 1 ГБ и старше 6 месяцев
  • Почему этот скрипт рыбы не запускается из пусковой установки?
  • 9 Solutions collect form web for “Может ли переменная оболочки включать – символ?”

    Я никогда не встречал оболочку стиля Bourne, которая позволяла - в имени переменной. Поддерживаются только буквы ASCII (любого из них), _ и цифры, а первый символ не должен быть цифрой.

    Если у вас есть программа, для которой требуется переменная среды, которая не соответствует ограничениям оболочки, запустите ее с помощью программы env .

     env 'strange-name=some value' myprogram 

    Обратите внимание, что некоторые оболочки (например, современные dash , mksh, zsh) удаляют переменные, имя которых им не нравится в среде. ( Shellshock заставил людей более осторожно относиться к именам переменных среды, поэтому ограничения со временем станут более жесткими, а не более разрешительными.) Поэтому, если вам нужно передать переменную, чье имя содержит специальный символ для программы, передайте ее напрямую, без оболочки между ними ( env 'strange-name=some value' sh -c'…; myprogram' может работать или не работать).

    Это невозможно в Баше.

    В разделе « Определения » на странице руководства bash :

    name Слово, состоящее только из буквенно-цифровых символов и символов подчеркивания, и начинающееся с буквенного символа или подчеркивания. Также упоминается как идентификатор.

    Из раздела « Параметры » на странице руководства bash :

    Параметр – это объект, который сохраняет значения. Это может быть имя, номер или один из специальных символов, перечисленных ниже в разделе «Специальные параметры». Переменная – это параметр, обозначаемый именем.

    Вы можете получить доступ к переносимой переменной, используя косвенную ссылку.

     $ env 'my-hyphenated-variable=hello' /bin/bash $ name='my-hyphenated-variable' $ echo ${!name} hello 

    Символ тире ( - ) является символом разрыва и не допускается как часть имен переменных. Есть способы взломать это с помощью цитируемых переменных, но анализ его действительно проблематичен. Существуют также другие символы со специальными значениями в контексте имен переменных в bash, в частности скобки, скобки, символы оператора и кавычки. (например, {}()=+-&'" и более)

    Я бы предположил, что вам практически нужно найти еще одну парадигму, на которой можно построить свой скрипт. Возможно, у вас может возникнуть идея с других языков о «именах переменных переменных». Как правило, это не очень хорошая идея в сценариях оболочки.

    Если вы отредактируете это или зададите новый вопрос с подробностями вашего контекста и тем, что вы пытаетесь выполнить, мы сможем предложить хороший способ его сценария.

    Если ваш скрипт зависит от наличия имен переменных с дефисами, это ошибка программирования. Если это удобно для вас из-за инструментов, которые вы регулярно используете, чтобы имена переменных содержали дефис, вам, возможно, придется узнать больше и разные инструменты.

    Вы пытались использовать tr для преобразования дефис в символы подчеркивания?

     hyphenated_name="ab" unhyphenated_name=$(echo $hyphenated_name | tr '-' '_') declare -x $unhyphenated_name="some value" 

    Bash позволяет «-» появляться в именах функций. Я все время это делаю. Например:

     function foo-bar() { echo "$@" } 

    В руководстве Bash определяется «имя» как:

    «Слово», состоящее исключительно из букв, цифр и подчеркиваний, и начинается с буквы или подчеркивания. «Имя используется как имена переменных оболочки и функции. Также упоминается как «идентификатор».

    Поэтому вы не можете использовать дефис в имени.

    Большинство оболочек поддерживают только az, AZ, 0-9 и _ для variablenames. Прочтите второй пункт на этой странице .

    Я считаю, что для переменных bash допускаются только буквы, цифры и подчеркивание. Это происходит во многих языках программирования (исключение javascript).

    Я рекомендую, чтобы ваш сценарий не зависел от этих типов имен переменных.

    На самом деле, вы должны попытаться запрограммировать таким образом, что вы можете заменить имена переменных другими именами, и это не имеет значения. В общем случае имена переменных должны описывать, что содержит переменная. Это значительно облегчает отладку; если не для вас, то для следующего разработчика, который пытается выяснить код.

    Похоже, здесь есть концептуальная проблема, а не программирование. Было бы полезно узнать, что вам действительно нужно для выполнения сценария.

    Сценарий по существу является алгоритмом (или эвристическим) для решения проблемы. Это инструмент, который создает решение, а не само решение. Из-за этого и из-за того, что область большинства переменных в скрипте ограничена внутри самого скрипта и, возможно, другими скриптами, которые он вызывает, он не должен иметь никакого функционального отличия от того, что вы вызываете ваши переменные. Единственное (но важное) значение имен переменных – их вклад в превращение сценария в удобочитаемый и понятный человеку. На компьютере (оболочке) все равно.

    Все, что вам нужно посмотреть определенным образом, вероятно, будет выводиться из сценария, и с небольшой уловкой вы можете получить в своем скрипте почти любую строку символов, которую вы можете себе представить практически на любом языке – даже те, которые раньше использовались для создания основанный на символах терминал выглядит немного как gui с цветным текстом и фоном и т. д. Существуют даже простые инструменты, которые позволяют скрипту использовать диалоговые окна gui и другие графические элементы.

    Interesting Posts

    Драйвер ядра для беспроводного адаптера не используется

    Распространение, дружелюбное к новичкам, безопасное, хорошо работает с Wine и имеет сетевые возможности

    Расширение скобы и составная команда

    Строка Bash заменяет несколько символов одним

    Как я могу добавить символ для каждого вывода команды?

    Что такое настольный менеджер Mint?

    Как правильно изменить отображение клавиатуры?

    Как можно вычесть 2 поплавки, которые были извлечены из 2 других файлов с помощью BASH

    Изменение имени устройства OpenVPN

    Получение возможностей моего CD / DVD-привода, когда wodim -devices не работает

    Ошибка ввода-вывода для члена RAID5. Что делать с плохими блоками?

    Как исправить ошибку, когда 2 из 3 пользователей в chrooted сети не могут получить доступ на запись?

    Есть ли способ заблокировать запуск программы в определенные моменты?

    Почему мой sudo запрашивает пароль только один раз, но оценивает трижды?

    Запуск диспетчера окон в гибридной графической системе не выполняется

    Linux и Unix - лучшая ОС в мире.