【问题标题】:Bash For loop - multiple variables, not using arrays?Bash For循环 - 多个变量,不使用数组?
【发布时间】:2014-01-02 19:19:47
【问题描述】:

我遇到了一个问题,似乎应该有一个简单的答案,但我一直在碰壁。

我正在尝试创建一个目录结构,其中包含通过两个不同变量命名的文件。例如:

101_2465
203_9746
526_2098

我正在寻找看起来像这样的东西:

for NUM1 in 101 203 526 && NUM2 in 2465 9746 2098
do
mkdir $NUM1_$NUM2
done

我曾考虑将 NUM1 和 NUM2 的值设置为数组,但它使脚本过于复杂——我必须使每一行代码尽可能简单,因为它被不太了解的人使用关于编码。他们已经熟悉使用上述示例设置的 for 循环(但仅使用 1 个变量),因此我试图使其尽可能接近。

提前致谢!

【问题讨论】:

  • 您的问题是您需要保持相关对相关。一个简单的嵌套循环不会这样做。您需要通过索引耦合的数组(因此 a[x] 匹配 b[x]),或者,如果值始终是整数且唯一,b => a[b](因为 bash 具有稀疏数组,所以您可以这样做)。

标签: bash loops for-loop


【解决方案1】:
while read NUM1 NUM2; do
    mkdir ${NUM1}_$NUM2
done << END
101 2465
203 9746
526 2098
END

请注意,下划线是有效的变量名字符,因此您需要使用大括号来消除名称NUM1 与下划线的歧义

【讨论】:

    【解决方案2】:

    ...将 NUM1 和 NUM2 的值设置为数组,但它使脚本过于复杂...

    不不不。一切都会比数组更复杂。

    NUM1=( 101 203 526 )
    NUM2=( 2465 9746 2098 )
    for (( i=0; i<${#NUM1}; i++ )); do
        echo ${NUM1[$i]}_${NUM2[$i]}
    done
    

    【讨论】:

      【解决方案3】:

      一种方法是用换行符分隔两个变量中的条目,然后使用paste 将它们放在一起:

      a='101 203 526'
      b='2465 9746 2098'
      
      # Convert space-separated lists into newline-separated lists 
      a="$(echo $a | sed 's/ /\n/g')"
      b="$(echo $b | sed 's/ /\n/g')"
      
      # Acquire newline-separated list of tab-separated pairs
      pairs="$(paste <(echo "$a") <(echo "$b"))"
      
      
      # Loop over lines in $pairs
      
      IFS='
      '
      
      for p in $pairs; do
      echo "$p" | awk '{print $1 "_" $2}'
      done
      

      输出:

      101_2465
      203_9746
      526_2098
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 2016-10-30
        • 2022-11-15
        • 1970-01-01
        相关资源
        最近更新 更多