Имя переменной оболочки может включать дефис или тире (-)?

Почему использование ps когда можно сделать это легко с top команда?

Если необходимо использовать ps, попробуйте это:

ps aux | sort -nrk 3,3 | head -n 5

Если Вы хотите что-то, что это действительно 'top'esq с постоянными обновлениями, используйте часы

watch "ps aux | sort -nrk 3,3 | head -n 5"
40
19.07.2019, 14:15
10 ответов

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

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

env 'strange-name=some value' myprogram

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

48
27.01.2020, 19:35
  • 1
    Больше работы. –  Jesse Glick 09.02.2017, 23:00
  • 2
    @JesseGlick Да это делает. (Ваш комментарий был бы полезен при определении “не работы”: с какой данные? каков эффект вместо желаемого эффекта? и если Вы сказали который реализация env Вы использовали на какой операционная система.) –  Gilles 'SO- stop being evil' 09.02.2017, 23:17
  • 3
    Извините. Ubuntu Yakkety со всеми обновлениями, env от coreutils, sh от dash: env 'with-dashes=value' bash -c 'env | fgrep dashes' работы, но env 'with-dashes=value' sh -c 'env | fgrep dashes' печать ничто. Таким образом, env самостоятельно прекрасен, но Тире, кажется, конкретно блокирует эти переменные. Таким образом, если рассматриваемая программа запускается через обертку оболочки с типичным #!/bin/sh заголовок, нет никакого очевидного способа передать в таких переменных. обходное решение –  Jesse Glick 14.04.2017, 15:23
  • 4
    @JesseGlick Это - тире, удаляющий переменную. Необходимо использовать env ближе на сайт вызова программы, для которой нужно это имя переменной без промежуточной оболочки. Тире не является одним в удалении переменных, имя которых это не любит. –  Gilles 'SO- stop being evil' 14.04.2017, 16:05
  • 5
    @JesseGlick Это верно, что некоторые вещи, которые раньше работали, больше не могли бы работать, хотя: начиная с контузии люди стали более консервативными об именах переменной, и тире действительно на самом деле изменялся, так как я записал этот ответ (не в результате Контузии хотя, но избегать ошибки в том же направлении). Я добавил примечание к своему ответу. –  Gilles 'SO- stop being evil' 14.04.2017, 16:10

Это не возможно в Bash.

От раздела Definitions в странице руководства bash:

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

От раздела Parameters в странице руководства bash:

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

16
27.01.2020, 19:35
  • 1
    +1 для демонстрации полноценности страниц справочника еще раз, –  ktf 31.10.2011, 13:48
  • 2
    Старое сообщение, которое я знаю, но, я хочу указать, что к страницам справочника вновь прибывших может быть довольно загадочным. У меня все еще есть времена, когда я должен выследить лучшие объяснения/примеры. Любой лгал бы, если бы они сказали, что этого никогда не происходило с ними. –  TCZ8 17.12.2014, 17:08
  • 3
    @TCZ8 единственные люди, которые сказали мне, они думали страницы справочника, были 'загадочными', является тем же видом людей, которые не читают сообщения об ошибках и просто скользят, читает все, пропуская прямо по тому, что они должны считать. –  Miles Rout 25.01.2017, 00:49

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

Я предложил бы, чтобы практически Вы нашли другую парадигму, на которой можно создать Ваш сценарий. У Вас могло бы быть подвешивание по идее с других языков о "переменных именах переменной". Это обычно - не хорошая идея в сценариях оболочки.

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

2
27.01.2020, 19:35

Руководство Bash определяет "имя" как:

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

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

2
27.01.2020, 19:35

Большинство оболочек только поддерживает a-z, A-Z, 0-9 и _ для variablenames. Считайте второй объект на этой странице.

0
27.01.2020, 19:35

Я полагаю, что только обозначает буквами, числа, и подчеркивание позволяется для переменных удара. Дело обстоит так на многих языках программирования (JavaScript, являющийся исключением).

Я рекомендую не иметь Вашего сценария, зависят от тех типов имен переменной.

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

-1
27.01.2020, 19:35

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

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

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

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

function foo-bar() {
   echo "$@"
}
6
27.01.2020, 19:35

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

$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello
13
27.01.2020, 19:35

Puede utilizar el comando envpara establecer y desactivar variables de entorno con guiones "-".

Para configurar, debe usar env para ejecutar su comando:env command. Pasas variables de esta manera:

env a-b=c command

Véalo funcionando con:

env a-b=c env

o para que quede más claro:

env a-b=c env|grep 'a-b'
-1
27.01.2020, 19:35

Вы можете поиграться с env и sed.

В качестве примера мне нужно было прочитать эту переменную «ELASTICSEARCH _CLUSTER -NODES».
Команда env выводит это:

~ $ env
ELASTICSEARCH_CLUSTER-NODES=elasticsearch:9200
JAVA_ALPINE_VERSION=8.212.04-r0
HOSTNAME=17eb9e7fec4c
...

Таким образом, чтобы извлечь переменную:

ESHOST=`env | sed -n 's/ELASTICSEARCH_CLUSTER-NODES=\(.*\)/\1/p'`
0
27.01.2020, 19:35

Теги

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