次のbashコマンド置換は、思ったとおりに機能しません。
echo $TMUX_$(echo 1)
1のみを出力し、変数の値を期待しています$TMUX_1
。また、次のことを試しました。
echo ${TMUX_$(echo 1)}
-bash: ${TMUXPWD_$(echo 1)}: bad substitution
助言がありますか ?
次のbashコマンド置換は、思ったとおりに機能しません。
echo $TMUX_$(echo 1)
1のみを出力し、変数の値を期待しています$TMUX_1
。また、次のことを試しました。
echo ${TMUX_$(echo 1)}
-bash: ${TMUXPWD_$(echo 1)}: bad substitution
助言がありますか ?
私があなたが探しているものを正しく理解しているなら、あなたはプログラムで変数名を作成し、次にその変数の値にアクセスしようとしています。この種のことを行うには、通常、次のeval
ステートメントが必要です。
eval "echo \$TMUX_$(echo 1)"
$( )
このステートメントの重要な機能には、がコマンド置換として適切に解釈されるように二重引用符を使用することと、最初$
に評価されないように最初のステートメントをエスケープすることが含まれます。同じことを達成する別の方法は
eval 'echo $TMUX_'"$(echo 1)"
この場合、自動的に連結される2つの文字列を使用しました。最初は一重引用符で囲まれているため、最初は評価されません。
要件には1つの例外があります。変数の内容を変数名として使用する場合にeval
備えて、Bashには間接参照のメソッドがあります。${!name}
これは次のように使用できます。
tmux_var = "TMUX_$(echo 1)"
echo ${!tmux_var}
ただし、これを機能させるには名前付き変数が必要なので、1つのステートメントでそれを行う方法があるかどうかはわかりません。
PS私はそれecho 1
がいくつかのより複雑なコマンドの単なる代用だと思います;-)
アレイをお探しですか?Bashにはそれらがあります。bashで配列を作成して使用するには、いくつかの方法があります。配列に関するbashのマンページのセクションを強くお勧めします。コードのサンプルは次のとおりです。
TMUX=( "zero", "one", "two" )
echo ${TMUX[2]}
もちろん、この場合の結果は2つです。
bashのマンページからの短い行を次に示します。
Bash provides one-dimensional indexed and associative array variables. Any variable may be
used as an indexed array; the declare builtin will explicitly declare an array. There is
no maximum limit on the size of an array, nor any requirement that members be indexed or
assigned contiguously. Indexed arrays are referenced using integers (including arithmetic
expressions) and are zero-based; associative arrays are referenced using arbitrary
strings.
An indexed array is created automatically if any variable is assigned to using the syntax
name[subscript]=value. The subscript is treated as an arithmetic expression that must
evaluate to a number greater than or equal to zero. To explicitly declare an indexed
array, use declare -a name (see SHELL BUILTIN COMMANDS below). declare -a name[subscript]
is also accepted; the subscript is ignored.
これは動作します(テスト済み):
eval echo \$TMUX_`echo 1`
おそらくあまり明確ではありません。どんな解決策でも、それを機能させるためにエコーの周りにバッククォートが必要になることはかなり確実です。