Как передать более одной переменной в команду в l oop? - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь сделать итеративную l oop с копией skopeo. Я попытался:

  export image_name=$(sed -e 's/\-[^*]*$//' "$line");  
  export version=$(sed -e 's/[^0-9.]*//' "$line" | sed 's/.tar//');

  IFS=$'\n'
  for line in "$(cat list_files.txt)"; do 
    skopeo copy \
    docker-archive:/opt/app-root/src/"$line" \
    docker://private/dsop/test/"$image_name":"$version" \
    --dest-creds="$USERNAME":"$PASSWORD" \
    --dest-tls-verify=false
  done

Мои переменные правильно размещены, но, похоже, они не передаются должным образом моей команде. Кто-нибудь может указать на мою проблему?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2020

Вы оцениваете переменные только один раз, до l oop. Я предполагаю, что вы хотите

while read -r line; do
    image_name=$(sed -e 's/-[^*]*$//' <<<"$line")
    version=$(sed -e 's/[^0-9.]*//;s/\.tar$//' <<<"$line")
    skopeo copy \
    docker-archive:/opt/app-root/src/"$line" \
    docker://private/dsop/test/"$image_name":"$version" \
    --dest-creds="$USERNAME":"$PASSWORD" \
    --dest-tls-verify=false
  done <  list_files.txt

Нет необходимости export переменных, если они не должны быть видимы для подпроцесса (например, здесь, skopeo - но так как вы передаете эти значения как переменные, я думаю, он не ищет и не использует переменные с этими именами); и sed -e script x использует x в качестве имени входного файла, а не строку для обработки. Символ da sh является обычным символом и не нуждается в обратном слэсе sh, экранированном в sed. Наконец, не читает файлы с for.

Синтаксис «здесь строка» <<< имеет расширение Bash (которое также доступно в некоторых других оболочках, но не переносится на POSIX / Bourne sh).

0 голосов
/ 04 февраля 2020

Когда вы устанавливаете переменные с помощью команды sed, переменная $line не существует. Вы должны изменить его на:

  IFS=$'\n'
  for line in "$(cat list_files.txt)"; do 
    image_name=$(sed -e 's/\-[^*]*$//' "$line");  
    version=$(sed -e 's/[^0-9.]*//' "$line" | sed 's/.tar//');
    skopeo copy \
    docker-archive:/opt/app-root/src/"$line" \
    docker://private/dsop/test/"$image_name":"$version" \
    --dest-creds="$USERNAME":"$PASSWORD" \
    --dest-tls-verify=false
  done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...