-
シェルの変数で使用することはできません。そのような名前付き変数に依存するスクリプトが1つあるため、それを使用する方法はありますか?
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
最初に指定されたエラーをスローし、2番目は正常に動作します。
-
シェルの変数で使用することはできません。そのような名前付き変数に依存するスクリプトが1つあるため、それを使用する方法はありますか?
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
最初に指定されたエラーをスローし、2番目は正常に動作します。
回答:
-
変数名に使用できるBourneスタイルのシェルに出会ったことはありません。ASCII文字(どちらの場合も)_
と数字のみがサポートされており、最初の文字は数字であってはなりません。
シェルの制限に一致しない環境変数を必要とするプログラムがある場合は、そのプログラムで起動しenv
ます。
env 'strange-name=some value' myprogram
一部のシェル(モダンダッシュ、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
間で殻なしに、この変数名を必要とするプログラムの呼び出しサイトに近いです。ダッシュは、名前が気に入らない変数を削除するだけではありません。
それはBashでは不可能です。
のマニュアルページの定義セクションからbash
:
名前英数字とアンダースコアのみで構成され、アルファベット文字またはアンダースコアで始まる単語。識別子とも呼ばれます。
のマニュアルページのパラメータセクションからbash
:
パラメータは、値を保存するエンティティです。名前、番号、または下の「特殊パラメーター」にリストされている特殊文字のいずれかです。変数は、名前で示されるパラメーターです。
間接参照を使用して、ハイフネーションされた変数にアクセスできます。
$ env 'my-hyphenated-variable=hello' /bin/bash
$ name='my-hyphenated-variable'
$ echo ${!name}
hello
スクリプトが変数名にハイフンを含めることに依存している場合、それはプログラミングエラーです。変数名にハイフンを含めるために定期的に使用するツールのために便利な場合は、より多くの異なるツールを学習する必要があります。
trを使用してハイフンをアンダースコアに変換しようとしましたか?
hyphenated_name="a-b"
unhyphenated_name=$(echo $hyphenated_name | tr '-' '_')
declare -x $unhyphenated_name="some value"
Bashでは、関数名に「-」を使用できます。私はこれをいつもしています。例えば:
function foo-bar() {
echo "$@"
}
ダッシュ(-
)文字はブレーク文字であり、変数名の一部として許可されていません。引用符で囲まれた変数を使用してこれをハックする方法はありますが、その解析には本当に問題があります。また、bashの変数名のコンテキストで特別な意味を持つ他の文字、特に中括弧、括弧、演算子文字、引用符もあります。(例{}()=+-&'"
など)
実際に、スクリプトを構築するための別のパラダイムを見つける必要があることをお勧めします。「変数変数名」について、他の言語からのアイデアに二日酔いを抱くかもしれません。通常、これはシェルスクリプトではお勧めできません。
これを編集するか、コンテキストの詳細と何を達成しようとしているのかについて新しい質問をする場合、スクリプトを作成するための良い方法を提案できるかもしれません。
bash変数には文字、数字、アンダースコアのみが許可されていると思います。これは多くのプログラミング言語の場合です(javascriptは例外です)。
スクリプトをこれらのタイプの変数名に依存させないことをお勧めします。
実際、変数名を他の名前に置き換えることができ、違いが生じないような方法でプログラミングする必要があります。一般に、変数名には変数に含まれるものを記述する必要があります。これにより、デバッグがはるかに簡単になります。そうでない場合は、コードを理解しようとしている次の開発者のために。