Eine Variable zeilenweise an einen anderen Befehl in Bash übergeben

407
Krishna Basude

Ich habe Code, der eine TXT-Datei liest und die Zeilen daraus in einen Befehl lesen soll. Dann sollte die Ausgabe dieses Befehls auch Zeile für Zeile in einen anderen Befehl eingelesen werden. Meine äußere Schleife funktioniert (ich habe sie mit Echo getestet), aber meine verschachtelte Schleife funktioniert nicht:

#!/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 

Die Ausgabe aus der ersten Zeile, die in "Ordner" eingelesen wird, sieht für jede Zeile von testIDs.txt folgendermaßen aus:

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 

Ich möchte jede Zeile "Ordner" an den Befehl aws übergeben, nachdem "a-bucket /" dem Pfadnamen hinzugefügt wurde. Ich bekomme keine Ausgabe. Ihre Hilfe wird gerne in Anspruch genommen.

1
`done <<(aws s3 ls ...)` choroba vor 5 Jahren 0
Um dies zu debuggen, können Sie vor der `aws'-Zeile ein` echo` hinzufügen, damit Sie sehen können, wie der Befehl aussieht. Etwas wie `echo aws s3 cp s3: // a-bucket /" $ line "'c: / users / basud / desktop / testerData' --recursive`. JakeGould vor 5 Jahren 1
@choroba Kannst du deinen Kommentar erklären? confetti vor 5 Jahren 0
@choroba interessante Antwort, aber kein Würfel, wenn ich den Code ausgeführt habe = / Ich gehe davon aus, dass in Ihrem Kommentar das "erledigt" ist, das in meinem ursprünglichen Code dem "$ ordner" vorangeht Krishna Basude vor 5 Jahren 0

1 Antwort auf die Frage

0
RalfFriedl

Ihr Code sollte funktionieren

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

Aber in Ihrem Fall würde ich Folgendes verwenden:

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  

Um Ihr Originalskript (oder ein anderes) zu debuggen, führen Sie es mit aus bash -x.

Das hat leider auch nicht funktioniert = / Hier ist der Code, den ich lief: `#! / Bin / bash beim Lesen von p; do aws s3 ls s3: // a-bucket / users / --recursive | grep $ | Schnitt -c 32- | Während read -r line echo $ line aws s3 cp s3: // a-bucket / "$ line" 'c: / users / basud / desktop / testerData' --recursive done <testIDs.txt` Krishna Basude vor 5 Jahren 0
Ohne Zeilenumbrüche ist das nicht lesbar. Versuchen Sie es mit `bash -x` auszuführen und hängen Sie die Ausgabe an die Frage an. Oder führen Sie Ihren Originalcode mit `bash -x` aus und hängen Sie die Ausgabe an die Frage an. RalfFriedl vor 5 Jahren 0