Ich brauche ein Skript zu schreiben, die mein Programm mit verschiedenen Argumenten startet, aber ich bin neu in Bash. Ich starte mein Programm mit:
Daten/data1.txt [Logs/data1_Log.txt]`.
Hier ist der Pseudocode für das, was ich tun möchte:
for each filename in /Data do
for int i = 0, i = 3, i++
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
end for
end for
Ich bin also wirklich verwirrt, wie ich das zweite Argument aus dem ersten erstellen kann, so dass es wie dataABCD_Log1.txt aussieht und mein Programm startet.
Zunächst ein paar Anmerkungen: Wenn Sie "Daten/Daten1.txt" als Argument verwenden, sollte es dann wirklich "Daten/Daten1.txt" heißen (mit einem führenden Schrägstrich)? Und sollte die äußere Schleife nur nach .txt-Dateien oder nach allen Dateien in /Data suchen? Hier ist eine Antwort, die von /Data/data1.txt
und nur von .txt-Dateien ausgeht:
#!/bin/bash
for filename in /Data/*.txt; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$filename" "Logs/$(basename "$filename" .txt)_Log$i.txt"
done
done
Anmerkungen:
/Data/*.txt
expandiert zu den Pfaden der Textdateien in /Data (einschließlich des /Data/ Teils)$( ... )
führt einen Shell-Befehl aus und fügt dessen Ausgabe an dieser Stelle in die Befehlszeile einbasename somepath .txt
gibt den Basisteil von somepath aus, wobei .txt am Ende entfernt wird (z.B. /Data/file.txt
-> file
)Wenn Sie MyProgram mit Data/file.txt
anstelle von /Data/file.txt
ausführen wollten, verwenden Sie "${filename#/}"
, um den führenden Schrägstrich zu entfernen. Andererseits, wenn es wirklich Data
und nicht /Data
ist, das Sie scannen wollen, verwenden Sie einfach für Dateiname in Data/*.txt
.
Sorry für necromancing den Thread, aber wann immer Sie iterieren über Dateien von globbing, it & #39; s gute Praxis, um den Eckfall zu vermeiden, wo die glob nicht übereinstimmt (was die Schleife Variable erweitert, um die (un-Matching) glob Muster Zeichenfolge selbst macht).
Zum Beispiel:
for filename in Data/*.txt; do
[ -e "$filename" ] || continue
# ... rest of the loop body
done
Referenz: Bash Pitfalls
for file in Data/*.txt
do
for ((i = 0; i < 3; i++))
do
name=${file##*/}
base=${name%.txt}
./MyProgram.exe "$file" Logs/"${base}_Log$i.txt"
done
done
Die Substitution name=${file##*/}
(shell parameter expansion) entfernt den führenden Pfadnamen bis zum letzten /
.
Die Substitution base=${name%.txt}
entfernt das nachfolgende .txt
. Es ist etwas schwieriger, wenn die Erweiterungen variieren können.