it-swarm-eu.dev

Může název proměnné Shell obsahovat spojovník nebo pomlčku (-)?

Nemohu použít - v proměnných ve Shell. Existuje způsob, jak jej použít, protože mám jeden skript, který závisí na takto pojmenovaných proměnných:

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

$export a_b=c

První vyvolá danou chybu a druhá funguje dobře.

43
xyz

Nikdy jsem se nesetkal s Bourneovým stylem, který dovolil - v názvu proměnné. Pouze ASCII písmena (v obou případech), _ a číslice jsou podporovány a první znak nesmí být číslice.

Pokud máte program, který vyžaduje proměnnou prostředí, která neodpovídá omezením prostředí, spusťte jej pomocí programu env.

env 'strange-name=some value' myprogram

Všimněte si, že některé prostředí (např. moderní pomlčka , mksh, zsh) odstraní proměnné, jejichž název se jim z prostředí nelíbí. ( Shellshock způsobil, že lidé byli opatrnější ohledně názvů proměnných prostředí, takže omezení se v průběhu času pravděpodobně zpřísní, ne více tolerantní.) Takže pokud potřebujete předat proměnnou, jejíž jméno obsahuje zvláštní znak, program, předejte jej přímo, bez Shell mezi (env 'strange-name=some value' sh -c'…; myprogram' může nebo nemusí fungovat).

To v Bashi není možné.

Z části Definice v manuálové stránce bash:

name Slovo skládající se pouze z alfanumerických znaků a podtržítek a začínající abecedním znakem nebo podtržítkem. Označuje se také jako identifikátor.

Z části Parametry v manuálové stránce bash:

Parametr je entita, která ukládá hodnoty. Může to být jméno, číslo nebo jeden ze speciálních znaků uvedených níže v části Zvláštní parametry. Proměnná je parametr označený jménem.

16
Lekensteyn

K nepřátelské proměnné můžete přistupovat pomocí nepřímého odkazu.

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

Pokud váš skript závisí na tom, že názvy proměnných mají spojovníky, je to chyba programování. Pokud je to pro vás vhodné, protože nástroje, které pravidelně používáte, aby názvy proměnných obsahovaly spojovník, možná budete muset zjistit více a různé nástroje.

Zkoušeli jste pomocí tr převést pomlčky na podtržítka?

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

Bash umožňuje, aby se v názvech funkcí zobrazoval znak „-“. Dělám to pořád. Například:

function foo-bar() {
   echo "[email protected]"
}
6
Brian J. Fox

Manuál Bash definuje „jméno“ jako:

„Slovo“ sestávající pouze z písmen, čísel a podtržítek a začínající písmenem nebo podtržítkem. 'Jména se používají jako názvy proměnných a funkcí Shell. Nazývá se také „identifikátor“.

Takže ve jménu nemůžete použít spojovník.

3
Michael Hoffman

Znak pomlčky (-) Je znak konce a není povolen jako součást názvů proměnných. Existují způsoby, jak to hacknout pomocí citovaných proměnných, ale jejich rozbor je opravdu problematický. Existují také jiné znaky se zvláštními významy v souvislosti s názvy proměnných v bash, zejména závorky, závorky, znaky operátora a uvozovky. (např. {}()=+-&'" a další)

Navrhoval bych, že prakticky musíte najít další paradigma, na kterém budete stavět svůj skript. Možná budete mít pověšení z jiných jazyků o "proměnných proměnných názvů". V skriptech Shell to obecně není dobrý nápad.

Pokud to upravíte nebo položíte novou otázku s podrobnostmi o vašem kontextu a co se snažíte dosáhnout, můžeme navrhnout dobrý způsob, jak to skriptovat.

2
Caleb

Příkaz env můžete použít k nastavení a deaktivaci proměnných prostředí pomocí hiphens "-".

Chcete-li nastavit, musíte použít příkaz env ke spuštění vašeho příkazu: env command. Proměnné předáváte takto:

env a-b=c command

Podívejte se, jak to funguje:

env a-b=c env

nebo aby bylo jasnější:

env a-b=c env|grep 'a-b'
0
neves

Můžete hrát s env a sed.

Jako příklad jsem potřeboval přečíst tuto proměnnou 'ELASTICSEARCH_CLUSTER-NODES'.
Příkaz env vydává toto:

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

Takže extrahujte proměnnou:

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

Většina nábojů podporuje pouze proměnné a-z, A-Z, 0-9 a _. Přečtěte si druhou položku v tato stránka .

0
Lycha

Věřím, že pro bash proměnné jsou povolena pouze písmena, čísla a podtržítko. To je případ mnoha programovacích jazyků (výjimkou je javascript).

Doporučuji, aby váš skript nebyl závislý na těchto typech názvů proměnných.

Ve skutečnosti byste se měli pokusit programovat takovým způsobem, že můžete názvy proměnných nahradit jinými jmény a to nijak nezmění. Názvy proměnných by obecně měly popisovat, co proměnná obsahuje. To usnadňuje ladění; pokud ne pro vás, pak pro dalšího vývojáře, který se snaží zjistit kód.

0
evan

Zní to, jako by tu byl spíše koncepční problém než programovací. Bylo by užitečné, kdybyste se zabývali tím, co vlastně skript potřebujete.

Skript je v zásadě algoritmus (nebo heuristický) pro řešení problému. Je to nástroj, který vytváří řešení, nikoli samotné řešení. Z tohoto důvodu a vzhledem k tomu, že rozsah většiny proměnných ve skriptu je omezen na samotný skript a případně i na jiné skripty, které volá, nemělo by to dělat žádný funkční rozdíl, jak se vaše proměnné nazývají. Jediným (ale důležitým) významem proměnných jmen je jejich příspěvek k tomu, aby byl skript čitelný a srozumitelný pro člověka. Počítači (Shell) to nezáleží.

Všechno, co potřebujete hledat konkrétním způsobem, bude pravděpodobně výstupem skriptu a s trochou chytrosti můžete mít výstup skriptu téměř jakýkoli řetězec znaků, který si dokážete představit v téměř jakémkoli jazyce - dokonce i ty, které se používaly k výrobě znakový terminál vypadá trochu jako gui s barevným textem a pozadím atd. Existují dokonce jednoduché nástroje, které umožňují skriptu používat dialogová okna gui a další grafické prvky.

0
Joe