我有一个需要1到20个变量的应用程序。每个变量的名称相同,只是它们以序号结尾。从_1
到_20
。
例如:Value_1, Value_2, Value_3...Value_20
我想做的是:
Value_
开头的变量,我想检查一下它们是否为null。我听说使用数组可能是一种方法。但是我必须将找到的变量转换为数组...或我可以从1 ... 20对其进行交互,看看它们是否存在,并为其分配了值,我可以从每个值中提取值。
最佳方法是什么?
Bash使用例如var_$i
(其中$i
是数字),您可以分配创建的模式(例如tmp="var_$i"
),然后使用var_x
从生成的${!tmp}
名称中获取值,例如
#!/bin/bash
var_1=1
var_2=2
var_4=4
var_5=5
var_6=6
var_8=8
var_9=9
var_10=10
var_11=11
var_13=13
var_14=14
var_15=15
var_16=16
var_18=18
var_19=19
for ((i = 1; i <= 20; i++)); do
tmp="var_$i"
if [ -n "${!tmp}" ]; then
printf "var_%d exits: %s\n" "$i" "${!tmp}"
fi
done
自4.3起,它已并入bash的nameref声明中。您可以选择declare -n tmp=var_x
声明一个nameref
,例如
for ((i = 1; i <= 20; i++)); do
declare -n tmp="var_$i"
if [ -n "$tmp" ]; then
printf "var_%d exits: %s\n" "$i" "$tmp"
fi
done
尝试一下,如果您有任何疑问,请告诉我。
示例使用/输出
在两种情况下,您都会收到:
$ bash nameref.sh
var_1 exits: 1
var_2 exits: 2
var_4 exits: 4
var_5 exits: 5
var_6 exits: 6
var_8 exits: 8
var_9 exits: 9
var_10 exits: 10
var_11 exits: 11
var_13 exits: 13
var_14 exits: 14
var_15 exits: 15
var_16 exits: 16
var_18 exits: 18
var_19 exits: 19