GNU/Linux >> Linux の 問題 >  >> Linux

Bash動的(変数)変数名?

要素の配列を操作して文字列のシーケンスを動的に作成し、算術演算手順を作成したい。

for name in FIRST SECOND THIRD FOURTH FIFTH; do
    $name = $(( $6 + 1 ))
    $name = "${$name}q;d"
    echo "${$name}"; printf "n"
done

$6の場合、希望の結果は次のようになります。 と等しい 。

1q;d
2q;d
3q;d
4q;d
5q;d

しかし、このエラーが発生します

reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution
reel_first_part.sh: line 18: FIRST: command not found
reel_first_part.sh: line 19: ${$name}q;d: bad substitution

簡単なことだと思います。

のようなことをしたときに機能していました
FIRST=$(( $6 + 1 ))
FIRST="${FIRST}q;d"

承認された回答:

まず第一に、=の周りにスペースを入れることはできません bashの変数宣言 。

必要なものを取得するには、evalを使用できます 。

たとえば、あなたのようなサンプルスクリプト:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    eval "$name"="'$(( $i + 1 ))q;d'"
    printf '%sn' "${!name}"
    i=$(( $i + 1 ))
done

プリント:

1q;d
2q;d
3q;d
4q;d
5q;d

evalを使用する 慎重に、正当な理由でそれを悪と呼ぶ人もいます。

declare うまくいくでしょう:

#!/bin/bash
i=0
for name in FIRST SECOND THIRD FOURTH FIFTH; do
    declare "$name"="$(( $i + 1 ))q;d"
    printf '%sn' "${!name}"
    i=$(( $i + 1 ))
done

また、印刷します:

1q;d
2q;d
3q;d
4q;d
5q;d

Linux
  1. SedでBash文字列変数への参照を使用しますか?

  2. Bash変数代入の単一括弧?

  3. Bashのコマンド置換への変数代入の終了コード

  1. Bashで合法的なコマンドの前に変数を設定するのはなぜですか?

  2. Bashで変数が数値かどうかをテストするにはどうすればよいですか?

  3. bashで読み取り専用変数を削除するには?

  1. Linux bash:複数の変数の割り当て

  2. Linux 環境変数名で使用できる文字

  3. bash の変数を持つエイリアス