ワイルドカードシェル変数名

ワイルドカードシェル変数名

たとえば、1つ以上の他の項目がある可能性があるトピック関連のシェルB2_...(環境ではない)変数名を拡張する必要があります。...ACCOUNT_IDACCOUNT_KEYRESPOSITORY

どのくらいの変数があるのか​​、どの変数なのかわかりません。それが私が知りたいことです。

B2...ファイル名を拡張する方法と同様に、各個々の名前をリストに入れずに変数を繰り返すことができます。

対話型セッションにはzshを使用しますが、shまたはbashソリューションもうまく機能します。

答え1

使用 パラメータ拡張:

$ foobar_1=x foobar_2=y foobar_3=z
$ for v in "${!foobar_@}"; do echo "$v"; done

出力:

foobar_1
foobar_2
foobar_3

「逆参照」:

$ for v in "${!foobar_@}"; do echo "${!v}"; done

出力²:

x
y
z

答え2

B2_B2名前で始まる単一の変数を使用する代わりに、連想配列()を使用できます。例えば

注:以下にのみ該当し、zsh連想配列kshbashありますが、それを初期化して使用する構文は異なります(以下を参照)。

typeset -A B2
# initialise array
B2=(ACCOUNT_ID 12345 ACCOUNT_KEY 54321 REPOSITORY somewhere)

# two different ways of adding elements to the array
B2[FOO]=bar
B2+=(NAME fred)             

for key val in ${(kv)B2}; do 
  echo "$key: $val"
done

この例の出力は次のとおりです。

ACCOUNT_KEY: 54321
FOO: bar
REPOSITORY: somewhere
ACCOUNT_ID: 12345
NAME: fred

以下を使用して、配列全体を(スクリプトまたはコマンドラインで再利用するのに適した形式で)印刷することもできますtypeset -p

% typeset -p B2
typeset -A B2=( ACCOUNT_ID 12345 ACCOUNT_KEY 54321 FOO bar NAME fred REPOSITORY somewhere )

またはBashでの同じ操作kshは次のようになります。

# initialise it
typeset -A B2
B2=([ACCOUNT_ID]=12345 [ACCOUNT_KEY]=54321 [REPOSITORY]=somewhere)

# add elements
B2[FOO]=bar
B2+=([NAME]=fred) 

# get a list of the keys and use them as indexes to get the values
for key in "${!B2[@]}"; do 
  echo "$key: ${B2[$key]}"
done

# print the entire array
typeset -p B2

答え3

バッシュはcompgen -v

Bashでは、次から始まる変数名を一覧表示できます。B2使用:

compgen -v B2

コマンドを実行すると、次の入力時にオートコンプリートの結果として使用できるのと同じ変数が一覧表示されます。compgen -v text$text次に Tab キーを押します。 (すべての項目を表示するには、Tabキーを数回押す必要があるかもしれません。)compgen -v対話的に使用できますが、スクリプトで使用することもできます。たとえば、

$ bash -c 'compgen -v SDK'
SDKMAN_CANDIDATES_DIR
SDKMAN_CURRENT_API
SDKMAN_DIR
SDKMAN_LEGACY_API
SDKMAN_PLATFORM
SDKMAN_VERSION

(もちろん、スクリプトはフラグのオペランドbashに渡されずにファイルに配置できます。)-c

目的compgenはコマンドを完了することです。help compgenこれに関する一般的な情報については、出力を参照してください。これはあなたの要件を満たすことができますが、次のパラメータ拡張技術などの他のアプローチを見つけることもできます。Gil Quinaultの回答、あなたがしていることをより明確に表現してください。個人の好みや活動によって異なるため、どちらが良いと言うことはできません。

答え4

そしてzsh

for var (${(M)${(k)parameters}:#B2_*})
  printf '$%s == %s\n' $var ${(P)var}
  • ${(k)parameters}はい$parametersすべてのパラメータに関する情報を提供する特別な連想配列。
  • ${array:#B2_*} 削除$array拡張で一致する要素B2_*(M)(パッチが適用された場合)にはM反対が適用されます。維持する一致する要素。
  • ${(P)var}bash( 'sに似ています${!var}):名前が保存されているパラメータの値に展開されます$var

エクスポートされていない変数だけが必要な場合:

setopt extendedglob # for ^
for var (${(M)${(k)parameters[(R)^*export*]}:#B2_*})
  printf '$%s == %s\n' $var ${(P)var}

関連情報