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ď č. 1Po 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