web-dev-qa-db-ja.com

シェル変数名にハイフンまたはダッシュ(-)を含めることはできますか?

シェルの変数で-を使用できません。このような名前付き変数に依存するスクリプトが1つあるので、それを使用する方法はありますか。

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

$export a_b=c

最初は指定されたエラーをスローし、2番目は正常に動作します。

43
xyz

変数名に-を使用できるBourneスタイルのシェルに出会ったことはありません。 ASCII文字(どちらの場合でも)、_、および数字のみがサポートされ、最初の文字は数字であってはなりません。

シェルの制限に一致しない環境変数を必要とするプログラムがある場合は、envプログラムを使用して起動します。

env 'strange-name=some value' myprogram

一部のシェル(例: modern dash 、mksh、zsh)は、名前が好ましくない変数を環境から削除することに注意してください。 ( Shellshock は、環境変数名について人々がより慎重になる原因となっています。そのため、制限は時間の経過とともに厳しくなり、許容度が高くなります。)したがって、名前に特殊文字を含む変数を渡す必要がある場合プログラム。シェルを介さずに直接渡します(env 'strange-name=some value' sh -c'…; myprogram'は機能する場合と機能しない場合があります)。

Bashではそれは不可能です。

bashのマニュアルページのDefinitionsセクションから:

名前英数字とアンダースコアのみで構成され、アルファベット文字またはアンダースコアで始まる単語。識別子とも呼ばれます。

bashのマニュアルページのParametersセクションから:

パラメータは、値を格納するエンティティです。名前、番号、または以下の「特殊パラメーター」にリストされている特殊文字のいずれかになります。変数は、名前で示されるパラメーターです。

16
Lekensteyn

間接参照を使用してハイフン付きの変数にアクセスできます。

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

変数名にハイフンが含まれていることに依存しているスクリプトが依存している場合、それはプログラミングエラーです。変数名にハイフンを含めるために定期的に使用するツールのために便利な場合は、さらに多くの異なるツールを学ぶ必要があるかもしれません。

trを使用してハイフンをアンダースコアに変換してみましたか?

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

Bashでは、関数名に「-」を使用できます。私はいつもこれをします。例えば:

function foo-bar() {
   echo "$@"
}
6
Brian J. Fox

Bashのマニュアルでは、「名前」を次のように定義しています。

文字、数字、アンダースコアのみで構成され、文字またはアンダースコアで始まる「単語」。 「名前」は、シェル変数および関数名として使用されます。 「識別子」とも呼ばれます。

したがって、名前にハイフンを使用することはできません。

3
Michael Hoffman

ダッシュ(_-_)文字はブレーク文字であり、変数名の一部としては使用できません。引用符で囲まれた変数でこれをハッキングする方法はいくつかありますが、その解析は本当に問題があります。また、bashの変数名のコンテキストで特別な意味を持つ他の文字、特に中かっこ、括弧、演算子文字、引用符もあります。 (例:{}()=+-&'"など)

実際には、スクリプトを作成するための別のパラダイムを見つける必要があることをお勧めします。 「変数変数名」について、他の言語からの思いがけないかもしれません。これは通常、シェルスクリプトではお勧めできません。

これを編集するか、コンテキストの詳細と達成しようとしていることについて新しい質問をすると、スクリプトを作成するための適切な方法を提案できる場合があります。

2
Caleb

envコマンドを使用して、ハイフン「-」で環境変数を設定および設定解除できます。

設定するには、envを使用してコマンドを実行する必要があります:env command。この方法で変数を渡します。

env a-b=c command

それが動作するのを見てください:

env a-b=c env

またはそれを明確にするために:

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

あなたは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

ほとんどのシェルは、変数名としてa-z、A-Z、0-9および_のみをサポートしています。 このページ の2番目の項目を読みます。

0
Lycha

Bash変数には、文字、数字、およびアンダースコアしか使用できないと思います。これは、多くのプログラミング言語に当てはまります(JavaScriptは例外です)。

スクリプトがこれらのタイプの変数名に依存しないようにすることをお勧めします。

実際、変数名を他の名前に置き換えることができ、違いが生じないようにプログラミングする必要があります。一般に、変数名は変数に含まれるものを説明する必要があります。これにより、デバッグがはるかに簡単になります。そうでない場合は、次の開発者がコードを理解しようとしています。

0
evan

プログラミングの問題ではなく、概念的な問題があるようです。スクリプトで実際に何が必要かを詳しく説明すると便利です。

スクリプトは本質的に、問題を解決するためのアルゴリズム(またはヒューリスティック)です。ソリューション自体ではなく、ソリューションを生成するツールです。このため、およびスクリプト内のほとんどの変数のスコープは、スクリプト自体と、場合によってはスクリプトが呼び出す他のスクリプトに制限されているため、変数が呼び出される機能に違いはありません。変数名の唯一の(しかし重要な)意味は、スクリプトを人間が読みやすく理解できるようにすることへの貢献です。コンピューター(シェル)は関係ありません。

特定の方法で調べる必要があるものはおそらくスクリプトの出力であり、少し巧妙な方法で、ほとんどすべての言語で想像できるほとんどすべての文字列をスクリプトに出力させることができます。文字ベースのターミナルは、色付きのテキストや背景などを持つGUIに少し似ています。スクリプトがGUIダイアログボックスやその他のグラフィック要素を使用できるようにする単純なツールさえあります。

0
Joe