Bashに他の変数で定義された変数があることを確認してください。

Bashに他の変数で定義された変数があることを確認してください。

私が見ています。これしかし、私は私のケースに合わせて変数名をハードコーディングしないように調整しようとしています。実は論理を合わせています。私の前の質問

このような:

shopt -s extglob
export var=abc_def__123__456
echo ${var/%__*}
# does this variable (abc_def) exist?
echo This is not valid syntax: [ -z ${${var/%__*}+x} ] && echo ${var/%__*} does not exist
echo Effectively checking this: [ -z ${abc_def+x} ] && echo abc_def does not exist
shopt -u extglob

編集(@ikkachuの答えから):

shopt -s extglob
export var=abc_def__123__456
# does this variable (abc_def) exist?
if [[ ! -v ${var/%__*} ]]; then echo ${var/%__*} does not exist; fi
# does this variable (abc_def) exist? (with temp variable)
export temp=${var/%__*}
echo ${temp}
if [ ! -z ${temp+x} ]; then echo \'temp\' exists; fi # checks temp variable only
if [ -z ${!temp+x} ]; then echo ${temp} does not exist; fi
if [ -z ${abc_def+x} ]; then echo abc_def does not exist; fi
shopt -u extglob

追加情報(ソース:バッシュマニュアル):

サブストリング拡張を実行しないと、Bashは以下に説明する形式(例: ":-")を使用して設定されていない引数またはnull引数をテストします。コロンを省略すると、設定されていないパラメータのみがテストされます。つまり、コロンが含まれている場合、演算子は両方をテストします。パラメータ存在し、その値はnullではありません。コロンが省略された場合、演算子は存在をテストします。

ベストアンサー1

特にBashでは、次のものを使用できます[[ -v var ]]

$ foo=1; unset bar;
$ varname=foo
$ if [[ -v $varname ]]; then echo set; else echo not set; fi
set
$ varname=bar
$ if [[ -v $varname ]]; then echo set; else echo not set; fi
not set

[[ -v ${var/%__*} ]]たとえば、動作します。

あるいは、namerefで「代替値」拡張を使用できます(ただし、対応する一時変数が必要です)。

$ declare -n ref=foo
$ if [[ ${ref+set} = set ]]; then echo set; else echo not set; fi
set
$ declare -n ref=bar
$ if [[ ${ref+set} = set ]]; then echo set; else echo not set; fi
not set

または間接拡張と同じです${!var}${!var+set}

おすすめ記事