web-dev-qa-db-ja.com

基本的なBash配列の質問

#!/bin/bash
# query1.sh

numbers=(53 8 12 9 784 69)
echo ${numbers[3]} # <--- this echoes "9" to standard output.

number=numbers[3]
echo number # <--- this echoes "number" to stdout.
echo $number # <--- this echoes "numbers[3]" to stdout.
echo ... <--- ???

numberという名前の変数をエコーし​​、標準出力として「9」を取得するには、どの構文を使用する必要がありますか?

3
Anthony Webber

ここで、${!var}演算子を使用して変数の間接化を行います。

bash-4.4$ numbers=(53 8 12 9 784 69)
bash-4.4$ number=numbers[3]
bash-4.4$ echo "${!number}"
9

zshに相当するものは次のようになります。

numbers=(53 8 12 9 784 69)
number=numbers[4]
echo ${(P)number}

zsh配列インデックスは他のほとんどのシェルやシェルツールと同様に1から始まるため、numbers[4]を使用して4番目の数値を取得できます)。

配列の4番目の要素の値を$numberに割り当てたい場合は、zshnumber=$numbers[4]を実行するか、kshnumber=${numbers[3]}を実行します。 (そしてbash配列をコピーしたばかりのksh)。

3

あなたの問題はこれです:

number=numbers[3]

配列numbersの4番目の要素を変数numberに割り当てていません。これは、numbers[3]が実際には何も意味しないためです。

$ numbers=(53 8 12 9 784 69)
$ echo $numbers[3]
53[3]

配列の名前だけを変数として使用すると、実際に使用されているのは配列の最初の要素(53)です。したがって、$numbers[3]53[3]になります。あなたが欲しいものは:

$ number=${numbers[3]}
$ echo $number
9
6
terdon

変数を宣言するときは、$を使用する必要はありませんが、使用するときは使用する必要があります。

したがって、このように割り当てるだけで、number=${numbers[3]}で機能するはずです。

0
Carpette