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 に表示する必要があるものは、値がある場合にのみ変数名の展開に表示されるというのは矛盾しています..値を設定することを除いて、完全に空にすると、名前が再び表示されます。明らかに、ここで一貫した動作に頼ることはできませんか?