0

1 行でいくつかの変数名を宣言したいだけです。これらの名前は、必ずしも特定の値に設定されていなくても、使用さた名前として表示される必要があります。

ではC、次のようにします。

int i, j, k;

ではBash、私は驚きの世界に歓迎されます。

declare -a a1 a2 a3; echo ${!a*}

出力:

a1 a2 a3

動作します!:)しかし、これらは配列であるため、おそらく空で作成されます..正しい例ではありません。

もう一度試してみましょう。これ:

declare -r b1 b2 b3; echo ${!b*}

出力:

<nothing>

でも今:

b1=foo

爆弾:

bash: b1: readonly variable

奇数。

名前を読み取り専用としてマークしますが、名前自体は${!...}間接的に表示されません。

Bash「決心して!これらのシンボルを知っていますか?」と言いたくなる。

とにかく、確かにこれはうまくいくでしょう:

declare -g c1 c2 c3; echo ${!c*}

出力:

<nothing>

ついに:

declare -x d1 d2 d3; echo ${!d}

出力:

<nothing>

不可解なのは、次のことです。

declare -p

定義されたすべての変数が表示されますが${!...}、値が割り当てられている場合にのみ呼び出しによって出力されます。しかし、manページには「値を持つ名前は展開されます..」とは書かれていません。変。

したがって、値を割り当てていないため、もともと意図していたように、変数名を宣言するのにこれは機能しないと結論付けました。

declare y1= y2= y3=; echo ${!y*}

...しかし、残念なことに、これにより次の結果が得られます。

y1 y2 y3

したがって、質問は次のようになります。

の後に y1、y2、y3 がある値はどれdeclare y1= y2= y3=ですか?

が最終的に利用可能な名前として表示される場合、これらの変数には何かが含まれている必要があるため、私は自分自身に答えようとしました。さらに、おそらく、\0値。そうでなければ、上記のどれも意味がありませんよね?

printf "$v1" > /tmp/tmp

これを与える:

hexdump -C /tmp/tmp
<nothing>

と:

wc -c /tmp/tmp

与えます:

0 /tmp/tmp

ファイルは完全に空です。

誰もこれを理解していますか?私がやりたかったのは、のCようなものでしたint i, j, k;..

私の関数では、いくつかの変数が「見える」かどうかをチェックすることで、いくつかのユーザーと環境の条件を非常に合理的にチェックするので、それが必要です。それに基づいて、スクリプトは何かを実行し、これらのステータス シグナル変数を更新します。値を持つかどうかに関係なく、シンボル テーブルに入れ、declare -p に表示する必要があるものは、値がある場合にのみ変数名の展開に表示されるというのは矛盾しています..値を設定することを除いて、完全に空にすると、名前が再び表示されます。明らかに、ここで一貫した動作に頼ることはできませんか?

4

1 に答える 1

1

したがって、質問は次のようになります。

の後に y1、y2、y3 がある値はどれdeclare y1= y2= y3=ですか?

あなたの質問への答えは次のdeclare -pとおりです。

cobalt@carbon:~ $ declare foo
cobalt@carbon:~ $ declare -p | grep -- "-- foo"
declare -- foo
cobalt@carbon:~ $ declare foo=
cobalt@carbon:~ $ declare -p | grep -- "-- foo"
declare -- foo=""
cobalt@carbon:~ $ declare -a foo
cobalt@carbon:~ $ declare -p | grep foo
declare -a foo='([0]="")'

${!prefix*}明らかに、値が割り当てられて宣言されている変数の名前のみを展開します。-x単純な宣言では、変数がエクスポートされているか ( )、グローバルに宣言されているか ( ) に関係なく、値は割り当てられません-g。ただし、配列変数の宣言 ( declare -a var) は、値を代入するため、異なります。明示的に値を代入して宣言する場合も同様です ( declare var=)。

于 2013-04-01T10:41:02.863 に答える