Как зациклить вложенный цикл в bash без повторов? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь написать два цикла, которые бы создали функцию вместе, так как мне требуется обе переменные в одном развертывании для Azure, такие как имя учетной записи хранения и имя контейнера, чтобы содержать их ключ и хранить его, но я получаю повторяющиеся результаты.

    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: lama baba

Это файл для хранения json: abdelvt33cpgsa abdelvt44cpgsa

Это вывод, который я получаю abdelvt33cpgsa lamababa abdelvt44cpgsa lama baba

и ожидаемый результат должен быть abdelvt33cpgsa lama abdelvt44cpgsa baba

Ответы [ 3 ]

0 голосов
/ 10 июля 2019

См. FAQ по Bash 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"
0 голосов
/ 16 июля 2019

Правильным решением было запустить его через цикл 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
0 голосов
/ 10 июля 2019

Предполагая

  • ваши файлы не содержат символов табуляции, а
  • у них одинаковое количество строк,

быстрый способ - вставить оба файла и затем преобразовать символ разделителя (по умолчанию табуляцию) в новые строки:

$ cat A-file
A
B
C
D D
E E
$ cat 1-file
1
2
3
4 4
5 5
$ paste A-file 1-file|tr '\t' '\n'
A
1
B
2
C
3
D D
4 4
E E
5 5

Посмотрите, как раскраска синтаксиса Stackoverflow делает этот пример классным!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...