【问题标题】:I need help for below code for loop condition我需要以下循环条件代码的帮助
【发布时间】:2022-01-19 12:56:51
【问题描述】:
   #!/bin/bash
    dev="job1"
    test="job1 job2"
    Env="dev test"
    for i in $Env; do
      for j in $i; do
         echo "env:$i"
         echo "job_id: $j"
       done
    done
    
    output:
    -----------
    env: dev
    job_id: dev
    
    actual output i want:
    --------------------
    env: dev
    job_id: job1

    env: test
    job_id: job1
   
    env: test
    job_id: job2

我尝试了不同的 for 循环,但没有得到实际的输出 我们如何循环上面代码中提到的列表

【问题讨论】:

  • 您的内部 for 循环中的变量是错误的。你有$i,但它应该是$test
  • 我有多个环境,如下所示:#!/bin/bash dev="job1" test="job1 job2" Env="dev test" for i in $Env;为 $i 中的 j 做; do echo "env:$i" echo "job_id: $j" done done

标签: shell


【解决方案1】:

您确实应该为这种事情使用数组(请记住,只要数组适合在 shell 脚本中使用,这可能表明您应该完全使用不同的语言),但是要执行您正在尝试的操作你可以这样做:

#!/bin/bash

dev=job1
test="job1 job2"
Env="dev test"

for i in $Env; do
        for j in ${!i}; do
                echo "env:$i"
                echo "job_id: $j"
        done
done

如果您使用的是支持关联数组的足够新的 bash,您可以执行以下操作:

declare -A task
task[dev]="job1"
task[test]="job1 job2"

for k in "${!task[@]}"; do
        for v in ${task[$k]}; do
                echo $k: $v
        done
done

但这仍然依赖于字段拆分来迭代值,并且 bash 不允许您将数组存储为数组的成员,因此这会退回到前面提到的使用不同语言的建议。 (其中数组是一等公民,而不是经过数十年的发展而扔进的临时包袱。)

【讨论】:

  • 感谢 William Pursell 上面的解决方案似乎按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2012-06-20
  • 2015-01-24
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多