【问题标题】:How do you iterate over environment variables that are sequentially numbers?您如何迭代按顺序编号的环境变量?
【发布时间】:2020-10-04 11:17:42
【问题描述】:

我有一个包含 1 到 20 个变量的应用程序。除了以序号结尾外,每个变量的名称都是相同的。从_1_20

例如: Value_1, Value_2, Value_3...Value_20

我想做的是:

  1. 先查看变量是否存在。可能有一个变量或其中的 20 个。此外,不能保证它们按特定顺序排列。例如,可能只存在 Value_15。
  2. 对于以Value_ 开头的变量,我想检查一下它们是否为空。
  3. 对于那些不是 NULL 或 EMPTY 的变量,我想获取它们的值并将它们提供给另一个进程。

我听说使用数组可能是要走的路。但我必须将找到的变量转换为数组......或者 我可以从 1...20 对它们进行交互,看看它们是否存在并且它们有分配给它们的值,我可以从每个中提取值。

最好的方法是什么?

【问题讨论】:

  • 您可以通过$@ 访问所有变量,使用$# 访问输入变量的数量。检查变量是否为空,使用if [ -z "$VALUE_1" ]
  • VALUE_1Value_2 的不同情况是否是故意的?
  • 查看"Dynamic variable names in Bash"BashFAQ #6 的非基于数组的答案。

标签: linux bash loops variables


【解决方案1】:

Bash 提供了变量间接使用,例如var_$i(其中$i 是一个数字),您可以分配创建的模式(例如tmp="var_$i"),然后使用${!tmp} 从生成的var_x 名称中获取值。例如

#!/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

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2017-02-19
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多