/ / BASH Zmena elementu Array do premennej - pole, bash, premenné

BASH meniace pole prvku do premennej - polia, bash, premenné

Snažím sa vytvárať premenné z prvkov poľa a kontrolovať hodnotu vytvorenej premennej v zdrojovom súbore.

MySourceFile:

value1abc="10"
value2efg="30"
value3ade="50"
value4tew="something else"
onemorevalue="192.168.1.0"

Skriptový kód:

declare -a CfgData
CfgData=("value1abc" "value2efg" "value3ade" "value4tew" "othervalue" "onemorevalue")
COUNTER="0"

source MySourceFile

until [ $COUNTER == ${#CfgData[@]}  ]; do
value=$[${CfgData[$COUNTER]}]
echo -ne "\n${CfgData[$COUNTER]}="$value""\n\n
let COUNTER+=1
done

Skript funguje dobre, až kým nedôjde k hodnotám, ktoré obsahujú iné údaje ako čisté čísla (písmená, medzery, bodky, vo všeobecnosti všetky znaky) av takom prípade:

value="randomcharacters" # Gives me "0"
value="something else" & value="192.168.1.0" # line XX: 192.168.1.0: syntax error: invalid arithmetic operator (error token is ".168.1.0")

Som si istý, že mi niečo stratí niečo elementárne, ale teraz to nemôžem zistiť: P.

odpovede:

2 pre odpoveď č. 1

Po prvé $[...] syntax bash je zastaraný a nemal by sa používať.

Teraz vyhodnocuje jeho obsah ako aritmetikuvýrazom. Keď zadáte reťazec, interpretuje sa ako premenná a jeho hodnota sa opäť vyhodnocuje ako aritmetický výraz. Keď je premenná nenastavená, vyhodnotí sa na nulu.

Ak zadáte reťazec s jedným slovom, tietopravidlá rozširujú na nulu. Ak zadáte reťazec s viacerými slovami, rozšírenie zlyhá, pretože slová sa interpretujú ako premenné bez operátora aritmetického operátora, čo je chyba. To je to, čo vidíte.

Čo pravdepodobne chcete, je nahradiť riadok value=$[${CfgData[$COUNTER]}] s value=${!CfgData[$COUNTER]}.

Dovoľte mi dodať, že váš skript bude pravdepodobne lepšie napísaný bez indexov, ako napr

for varname in "${CfgData[@]}"; do
value=${!varname}
echo -ne "$varname=$value"
done