Я не могу использовать -
в переменных в оболочке. Есть ли способ, чтобы иметь возможность использовать его, потому что у меня есть один скрипт, который зависит от таких именованных переменных:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
Первый выдает данную ошибку, а второй работает нормально.
Ответы:
Я никогда не встречал оболочку в стиле Борна, которая допускала
-
бы имя переменной._
Поддерживаются только буквы ASCII (в любом случае) и цифры, и первый символ не должен быть цифрой.Если у вас есть программа, для которой требуется переменная среды, которая не соответствует ограничениям оболочки, запустите ее вместе с
env
программой.Обратите внимание, что некоторые оболочки (например, современные dash , mksh, zsh) удаляют переменные, имена которых им не нравятся, из среды. ( Shellshock заставил людей быть более осторожными в отношении имен переменных среды, поэтому ограничения, вероятно, со временем станут более жесткими, а не более жесткими.) Поэтому, если вам нужно передать в программу переменную, имя которой содержит специальный символ, передайте ее напрямую, без оболочки между (
env 'strange-name=some value' sh -c'…; myprogram'
может или не может работать).источник
env
Вас используется на какой операционной системе.)env
изcoreutils
,sh
изdash
:env 'with-dashes=value' bash -c 'env | fgrep dashes'
работает, ноenv 'with-dashes=value' sh -c 'env | fgrep dashes'
ничего не печатает. То естьenv
само по себе хорошо, но Dash, кажется, специально блокирует эти переменные. Таким образом, если рассматриваемая программа запускается через оболочку оболочки с типичным#!/bin/sh
заголовком, нет очевидного способа передачи таких переменных. пример обходного решенияenv
ближе к вызывающему сайту программы, которая нуждается в этом имени переменной, без оболочки между ними. Dash не одинок в удалении переменных, чье имя ему не нравится.Это невозможно в Баше.
Из раздела « Определения » на странице руководства
bash
:Из раздела « Параметры » на странице руководства
bash
:источник
Вы можете получить доступ к дефисной переменной, используя косвенную ссылку.
источник
Если ваш сценарий зависит от наличия в именах переменных дефисов, это ошибка программирования. Если вам это удобно из-за того, что инструменты, которые вы регулярно используете, чтобы имена переменных содержали дефис, вам, возможно, придется изучить больше и другие инструменты.
Вы пытались использовать tr для преобразования дефисов в подчеркивания?
Bash позволяет '-' появляться в именах функций. Я делаю это все время. Например:
источник
Символ dash (
-
) является символом разрыва и не допускается как часть имен переменных. Есть способы взломать это с помощью указанных в кавычках переменных, но их разбор действительно проблематичен. Есть и другие символы со специальным значением в контексте имен переменных в bash, в частности, фигурные скобки, скобки, операторные символы и кавычки. (например,{}()=+-&'"
и больше)Я бы предположил, что практически вам нужно найти другую парадигму для построения вашего сценария. Возможно, у вас есть идея о «именах переменных переменных» из других языков. Как правило, это не очень хорошая идея в сценариях оболочки.
Если вы отредактируете это или зададите новый вопрос с подробной информацией о вашем контексте и о том, что вы пытаетесь достичь, мы могли бы предложить хороший способ написания сценария.
источник
Руководство Bash определяет «имя» как:
Таким образом, вы не можете использовать дефис в имени.
источник
Большинство оболочек поддерживают только имена переменных az, AZ, 0-9 и _. Прочитайте второй пункт на этой странице .
источник
Вы можете играть с env и sed.
В качестве примера мне нужно было прочитать эту переменную 'ELASTICSEARCH_CLUSTER-NODES'.
Команда env выведет это:
Итак, чтобы извлечь переменную:
источник
Я считаю, что только переменные bash допускаются только буквы, цифры и подчеркивание. Это имеет место во многих языках программирования (исключение составляет JavaScript).
Я не рекомендую, чтобы ваш скрипт зависел от этих типов имен переменных.
На самом деле, вы должны попытаться запрограммировать таким образом, чтобы вы могли заменить имена переменных другими именами, и это не имеет значения. Как правило, имена переменных должны описывать, что содержит переменная. Это значительно облегчает отладку; если не для вас, то для следующего разработчика, который пытается выяснить код.
источник
Вы можете использовать
env
команду для установки и сброса переменных окружения с помощью хифенов "-".Для установки необходимо использовать окр запустить команду:
env command
. Вы передаете переменные следующим образом:Посмотрите, как это работает с:
или чтобы было понятнее:
источник