如果满足Bash中的条件,如何立即更改多个变量

时间:2018-07-14 10:35:51

标签: arrays bash variables

我编写了一个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。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

Parameter substitutionindirection

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