Передача переменной строка за строкой в ​​другую команду в Bash

326
Krishna Basude

У меня есть код, который читает текстовый файл и должен прочитать строки из него в команду. Затем вывод этой команды также должен быть прочитан построчно в другую команду. Мой внешний цикл работает (я проверил его с помощью эха), но мой вложенный цикл не:

#!/bin/bash  while read p; do  folder="$(aws s3 ls s3://a-bucket/users/ --recursive | grep $ | cut -c 32-)"  while read -r line do aws s3 cp s3://a-bucket/"$line" 'c:/users/basud/desktop/testerData' --recursive done <<< "$folder"  done < testIDs.txt 

Вывод первой строки, которая читается в «папку», выглядит следующим образом для каждой строки testIDs.txt:

users/3e8c95b4-c5ee-4edc-954e-6d988d30557e/111BEF99-5AB6-486A-ABD5-A4682CE0D491-LEFT.zip users/3e8c95b4-c5ee-4edc-954e-6d988d30557e/111BEF99-5AB6-486A-ABD5-A4682CE0D491-RIGHT.zip 

Я хочу передать каждую строку «папки» в команду aws после «a-bucket /», чтобы добавить к имени пути. Я не получаю выходной. Ваша помощь очень ценится.

1
`done <<(aws s3 ls ...)` choroba 5 лет назад 0
Один из способов отладки заключается в добавлении echo перед строкой aws, чтобы вы могли видеть, как выглядит команда. Что-то вроде `echo aws s3 cp s3: // a-bucket /" $ line "'c: / users / basud / desktop / testerData' --recursive`. JakeGould 5 лет назад 1
@choroba Можете ли вы объяснить свой комментарий? confetti 5 лет назад 0
@choroba интересный ответ, но без кубиков, когда я запустил код = / Я предполагаю, что "done" в вашем комментарии - это то, что предшествует "$ folder" в моем исходном коде Krishna Basude 5 лет назад 0

1 ответ на вопрос

0
RalfFriedl

Ваш код должен работать

$ folder="$(echo 1; echo 2)"; while read -r line; do echo "line: $line"; done <<< "$folder" line: 1 line: 2 

Но в вашем случае я бы использовал это:

aws s3 ls s3://a-bucket/users/ --recursive | grep $ | cut -c 32- | while read -r line do aws s3 cp s3://a-bucket/"$line" 'c:/users/basud/desktop/testerData' --recursive done  

Чтобы отладить ваш оригинальный скрипт (или любой другой), запустите его с bash -x.

К сожалению, это тоже не сработало = / Вот код, который я запустил: `#! / Bin / bash при чтении p; сделать aws s3 ls s3: // a-bucket / users / --recursive | grep $ | вырезать -c 32- | в то время как чтение -r line делает эхо $ line aws s3 cp s3: // a-bucket / "$ line" 'c: / users / basud / desktop / testerData' --recursive done done <testIDs.txt` Krishna Basude 5 лет назад 0
Без разрывов строк это невозможно прочитать. Попробуйте запустить его с помощью `bash -x` и добавить вывод к вопросу. Или запустите исходный код с помощью `bash -x` и добавьте вывод к вопросу. RalfFriedl 5 лет назад 0

Похожие вопросы