Muszę napisać skrypt, który uruchamia mój program z różnymi argumentami, ale jestem nowy w Bash. Zaczynam mój program od:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
.
Oto pseudokod tego, co chcę zrobić:
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
Naprawdę więc zastanawiam się, jak utworzyć drugi argument z pierwszego, więc wygląda to jak dataABCD_Log1.txt i uruchomić mój program.
basename -s
jest niestandardowym rozszerzeniem - zedytuję odpowiedź, aby użyć standardowej składni.shopt -s nullglob
przed pętlą (ishopt -u nullglob
później, aby uniknąć problemów później), albo dodajif [[ ! -e "$filename ]]; then continue; fi
na początku pętli, aby pominąć nieistniejące pliki.Przepraszamy za nekromancję w wątku, ale za każdym razem, gdy wykonujesz iterację po plikach przez globbing, dobrą praktyką jest unikanie przypadkowego narożnika, w którym glob nie jest zgodny (co powoduje, że zmienna pętli rozwija się do (niepasującego) łańcucha wzorca globu).
Na przykład:
Odniesienie: Bash Pitfalls
źródło
shopt nullglob
jest! (lubshopt failglob
może być również użyty, w zależności od pożądanego zachowania).dir.txt
name=${file##*/}
Podstawienie ( powłoka rozszerzenie parametrów ) usuwa się ścieżki prowadzącej aż do ostatniego/
.base=${name%.txt}
Podstawienie usuwa krawędzie tylną.txt
. Trochę trudniej jest, jeśli rozszerzenia mogą się różnić.źródło
base=${name%.txt}
zamiastbase=${base%.txt}
.Możesz użyć opcji znalezienia wyjścia z separacją null z odczytem, aby bezpiecznie iterować struktury katalogów.
Więc w twoim przypadku
dodatkowo
uruchomi pętlę while w bieżącym zakresie skryptu (procesu) i pozwoli na użycie wyjścia find w ustawianiu zmiennych w razie potrzeby
źródło
$'\0'
to dziwny sposób pisania''
. TraciszIFS=
a-r
przełącznikread
: lektury oświadczenie powinno być:IFS= read -rd '' file
.$'\0'
i rozmieszczenia kilku punktów stosu. Zamierzam wprowadzić wskazane zmiany. Jakie są złe skutki brakuIFS=
próbyecho -e "ok \nok\0" | while read -d '' line; do echo -e "$line"; done
, wydaje się, że ich nie ma. Także -r Widzę, że jest często domyślny, ale nie mogę znaleźć przykładu, dlaczego to się nie dzieje.IFS=
jest potrzebne w przypadku, gdy nazwa pliku kończy się spacją: try ma postaćtouch 'Prospero '
(zwróć uwagę na spację końcową). Potrzebujesz także-r
przełącznika, jeśli nazwa pliku ma odwrotny ukośnik: wypróbuj gotouch 'Prospero\n'
.Wygląda na to, że próbujesz uruchomić plik systemu Windows (.exe) Z pewnością powinieneś używać programu PowerShell. W każdym razie w powłoce bash dla Linuksa wystarczy zwykły jednowarstwowy.
Lub w mgnieniu oka
źródło