2011-09-11 14 views
0

以下のbashコマンドの置換は、私が思ったように動作しません。bashコマンドの展開

echo $TMUX_$(echo 1) 

のみ1を出力し、私も試した変数$TMUX_1 .Iの値を期待しています:

echo ${TMUX_$(echo 1)} 
-bash: ${TMUXPWD_$(echo 1)}: bad substitution 

任意の提案ですか?

答えて

1

あなたが探しているものを正しく理解している場合は、変数名をプログラムで作成し、その変数の値にアクセスしようとしています。この種のものを行うと、通常はeval文が必要です。$()が正しくコマンド置換、最初$のエスケープとして解釈されますように、この文の

eval "echo \$TMUX_$(echo 1)" 

重要な特徴は、二重引用符の使用を含みます最初に評価されることはありません。同じことを達成するための別の方法は、この場合には、私は自動的に連結され得る2つの文字列を使用

eval 'echo $TMUX_'"$(echo 1)" 

です。最初は一重引用符で囲まれているため、最初は評価されません。

eval要件には例外が1つあります。変数の内容を変数名として使用する場合、Bashには間接参照の方法${!name}があります。次のようにして、これを使用することができます:

tmux_var = "TMUX_$(echo 1)" 
echo ${!tmux_var} 

あなたはこれを動作させるためにという名前の変数を持っている必要があるため、私は、しかし、1つのステートメントでそれを行う方法があるかどうかわかりません。

P.S.私はecho 1がもっと複​​雑なコマンドのための単なるスタンドであると仮定しています;-)

+0

$ {!...}を使って解決策を見つけました。これは彼の目的のために働くでしょう。 ''複雑なコマンドについての私の他のコメントを見てください。'' :) – casualcoder

+0

はい、 'echo 1'はテスト用です。どちらの提案も機能します。実際には、eval式の引用符を省略することができます。 – yorua007

+0

@ yorua007:スペースがないので引用符を使わずにも動作しますので、単語の分割は問題になりません。私が指摘したかったのは、一重引用符ではなく二重引用符の使用でした。 –

0

アレイをお探しですか?バッシュはそれらを持っています。 bashで配列を作成して使用するにはいくつかの方法がありますが、配列のbashマンページのセクションを強くお勧めします。コードのサンプルは次のとおりです。

TMUX=("zero", "one", "two") 
echo ${TMUX[2]} 

この場合の結果は、もちろん2つです。

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. 
+0

私はbash配列を探していません。私は現在のウィンドウと同じディレクトリに新しいウィンドウを開くようにしようとしています(http://tmux.svn.sourceforge.net/viewvc/tmux/trunk/FAQ) – yorua007

+0

@ yorua007、このコードが必要ですbashのtcsh、右:[-n "$ TMUX"] && tmux setenv TMUXPWD _ $(tmux display -p "#I")$ PWD – casualcoder

+0

はい、私はおそらく問題がここにないのですが、 '$ PS1'変数'TMUXPWD_ *'変数は更新されません。 – yorua007

0

(テスト)これは動作します:ここで

は、bashのmanページからいくつかの短い線であるけれども

eval echo \$TMUX_`echo 1` 

おそらく非常に明確ではありません。どんな解決策でもエコーを回避するためにエコーの周りにバックティックが必要になることは間違いありません。

関連する問題