【问题标题】:Unix Script loop through individual variables in a list and execute codeUnix脚本循环遍历列表中的各个变量并执行代码
【发布时间】:2021-03-06 13:51:23
【问题描述】:

我整天都在绞尽脑汁,也没有想出一个成功的解决方案。

设置: 我们有 Linux RHEL 8.3 和一个文件 script.sh

应用程序设置了一个环境变量,其中包含 dynamic 字符串。

export PROGARM_VAR="abc10,def20,ghi30"

分隔符始终是“,”,里面的值从 1 到 20 不等。

在脚本中我定义了 20 个取值的变量

使用“cut”命令获取每个值并将其分配给变量

  var1=$(echo $PROGARM_VAR | cut -f1 -d,) 
  var2=$(echo $PROGARM_VAR | cut -f2 -d,)  
  var3=$(echo $PROGARM_VAR | cut -f3 -d,)  
  var4=$(echo $PROGARM_VAR | cut -f4 -d,)
  etc

在我们的例子中,我们将有:

var1="abc10" var2="def20" var3="ghi30" and var4="" which is empty

循环必须获取每个变量,测试它是否不为空,并使用测试的变量执行 10 页代码。当它到达一个空变量时,它应该中断。

请帮我一下好吗? 谢谢

【问题讨论】:

    标签: string bash loops variables unix


    【解决方案1】:

    只需用逗号分隔即可。有无限的可能性。你可以:

    10_pages_of_code() { echo "$1"; }
    IFS=, read -a -r vars <<<"abc10,def20,ghi30"
    for i in "${vars[@]}"; do 10_pages_of_code "$i"; done
    

    或:

    printf "%s" "abc10,def20,ghi30" | xargs -n1 -d, bash -c 'echo 10_pages_of_code "$1"' _
    

    更安全的代码可以使用readarray 而不是read 来正确处理值中的换行符,但我怀疑这对你很重要:

    IFS= readarray -d , -t vars < <(printf "%s" "abc10,def20,ghi30")
    

    您也可以向上阅读:

    while IFS= read -r -d, var || [[ -n "$var" ]]; do
            10_pages_of_code "$var"
    done < <(printf "%s" "abc10,def20,ghi30")
    

    但你仍然可以用 cut 来做到这一点......只需实际编写一个循环并使用一个迭代器。

    i=0
    while var=$(printf "%s\n" "$PROGARM_VAR" | cut -f"$i" -d,) && [[ -n "$var" ]]; do
          10_pages_of_code "$var"
          ((i++))
    done
    

    【讨论】:

    • 谢谢,非常感谢
    【解决方案2】:

    echo "$PROGRAM_VAR" | tr , \\n | while read var; do
       : something with $var
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2017-11-01
      • 2016-02-05
      • 2020-07-08
      • 1970-01-01
      相关资源
      最近更新 更多