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

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

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

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

  • два, если условия для скриптов bash
  • Преобразование списка с разделителями строк с пробелами в аргументы
  • Каковы могут быть причины, по которым сценарии оболочки убивают себя?
  • Как проверить скрипт оболочки, если исполняемый файл запущен или нет?
  • Как передать содержимое файла параметру / параметру функции
  • По умолчанию «Выполнить» при двойном щелчке по сценарию оболочки в PCManFM
  • Использование grep в условном выражении в bash
  • В bash я должен спросить каждую строку из первого файла csv, второго файла csv и ответов, помещенных в третий файл csv
  • 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

    Вывод скрипта python, выполняющегося как единица, не соответствует порядку, в то время как оболочки не отображаются

    список всех команд Linux, которые не относятся к выбору

    пусть скрипт найдет путь сам по себе

    Команда AIX 'rm' не имеет параметра '-v' для подробного вывода

    Я хочу изменить разрешения для всех папок / файлов, исключая некоторые из них

    Есть ли пароль root для OS X и Ubuntu?

    Как настроить резервное копирование, если файловая система только для чтения

    Как настроить synaptic в Debian Stable, Не удалось получить lock / var / lib / dpkg / lock

    Teamcity не запускается при запуске службы, но фактическая команда работает нормально

    GNOME не запускается

    Почему Alt + SysRq + B не всегда срабатывает при выполнении REISU?

    Как запустить скрипт во время загрузки с правами root после загрузки рабочего стола пользователя

    Как изменить изображения флагов XFCE Клавиатурные макеты, которые апплет использует для указания?

    Разделение gzip-файла на более мелкие gz-файлы без повторного сжатия

    «Awk» значение от нерегулярного вывода по имени столбца

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