如何在bash中循环嵌套循环而不重复?

时间:2019-07-10 10:42:58

标签: bash

我正在尝试编写两个将使功能在一起的循环,因为我需要在一个部署中同时使用两个变量来获得天蓝色,例如存储帐户名称和容器名称来包含它们的密钥并进行存储,但是我得到了重复的结果。

    for storage in $(cat $TMP_FILE_STORAGE | sed 's/^[^"]*"\([^"]*\)".*/\1/' )
    do
      echo $storage
      for container in $(cat $TMP_FILE_CONTAINER| sed 's/^[^"]*"\([^"]*\)".*/\1/' )
      do
        echo $container
        continue
      done
    done

这是容器json的文件: 喇嘛巴巴

这是用于存储json的文件: abdelvt33cpgsa abdelvt44cpgsa

这是我得到的输出 abdelvt33cpgsa 喇嘛 爸爸 abdelvt44cpgsa 喇嘛 爸爸

,预期结果应该是 abdelvt33cpgsa 喇嘛 abdelvt44cpgsa 爸爸

3 个答案:

答案 0 :(得分:0)

假设

  • 您的文件不包含制表符,并且
  • 它们的行数相同,

一种快速的方法是粘贴两个文件,然后将分隔符(默认情况下为制表符)转换为换行符:

react-native-cli

看看Stackoverflow语法的着色如何使这个示例看起来很酷!

答案 1 :(得分:0)

请参见Bash FAQ 001;您不应该一开始就使用for循环。

相反,请使用带有两个单独文件描述符的while循环。

while IFS= read -r storage <&3 && IFS= read -r container <&4 ; do
    echo "$storage"
    echo "$container"
done 3< <(sed 's/^[^"]*"\([^"]*\)".*/\1/' < "$TMP_FILE_STORAGE" ) 4< <(sed 's/^[^"]*"\([^"]*\)".*/\1/' < "$TMP_FILE_CONTAINER")

通过在sed上拆分每条输入行,您似乎也可以摆脱"

while IFS=\" read -r _ storage _ <&3 &&
      IFS=\" read -r _ container _ <&4; do
    echo "$storage"
    echo "$container"
done 3< "$TMP_FILE_STORAGE" 4< "$TMP_FILE_CONTAINER"

答案 2 :(得分:0)

对此的正确解决方案是在aray循环上运行它。

    Potato=$(cat $TMP_FILE_STORAGE)
    Potato1=$(cat $TMP_FILE_CONTAINER)
    eval "array=($Potato)"
    eval "array2=($Potato1)"
    for ((i=0; i<${#array[@]}; i++)); do
    end=`date -d "15 minutes" '+%Y-%m-%dT%H:%MZ'`
    az storage container generate-sas -n ${array2[$i]} --account-name ${array[$i]} --https-only --permissions dlrw --expiry $end -otsv`

      echo "First parameter : ${array[$i]} -- second parameter : ${array2[$i]}"

    done