我编写了一个Bash脚本,该脚本读取各种传感器读数并将它们设置为变量(以供以后保存到文件中)。 如果由于某种原因而导致读取错误并且未设置变量,则需要将该变量更改为-999(这样一来,将它们全部保存到文件中后,我就知道它是无效读取)。>
我可以做类似的事情
if [[ -z "$latitude" ]]
then
latitude="-999"
fi
(明确定义要测试和替换的变量)...但是我有大约五十个变量(在接下来的几个月中我将逐渐添加到变量中),因此,如果可能的话,我宁愿使用一种更简单/更灵活的方法,而不是对其进行硬编码。
我想我可以将所有变量输入一个数组,然后进行if [[-z VARIABLE]]测试。
这是我编写的一些示例代码:
#!/bin/bash
TypesArray=(latitude longitude elevation)
#code for setting sensor readings as variables is here but is redacted from this sample for brevity.
for i in ${TypesArray[@]}
do
if [[ -z "$i" ]]
then
$i="-999"
fi
done
(即,如果数组元素(它是一个变量)为空(使用-z测试),则将其设置为-999,如果它不为空,则将其保留原样。)
运行此命令时,没有收到任何错误消息,但是已知空变量的输出最终为空而不是-999。
有什么建议吗?
答案 0 :(得分:3)
Parameter substitution和indirection。
for i ...
do
: ${!i:=-999}
done
答案 1 :(得分:1)
您的代码段中有两个问题。
第一个问题:在测试变量是否为空时,您测试了变量名称是否为空。使用参数间接${!<varname>}
可以帮助您。
在bash联机帮助页上:
如果参数的第一个字符是感叹号(!),则 引入了变量间接级别。 Bash使用以下值 由其余参数构成的变量作为 变量;然后扩展此变量,并在 其余的替换,而不是参数本身的值。 这就是所谓的间接扩展。
第二个问题:您已将变量i
设置为-999-评估在这里有用。
从评估帮助页面:
将ARG合并为一个字符串,将结果用作输入 贝壳, 并执行生成的命令。
这是正确的代码:
#!/bin/bash
TypesArray=(latitude longitude elevation)
for i in ${TypesArray[@]}
do
if [[ -z "${!i}" ]]
then
eval $i="-999"
fi
done