R
relkai
Grünschnabel
Hallo Freunde der Bash,
ich habe ein inzwischen recht langes Script, welches bei manuellem Aufruf durch bestimmte Unterverzeichnisse wandert und diverse Aufgaben durchführt.
Nun beiße ich mir aber schon seit Stunden an einer in meinen Augen eigentlich recht trivialen Sache die Zähne aus:
Das Script soll unter anderem bestimmte Verzeichnisse von Unrat befreien, und vor dem Löschen eine Dateiliste der Dateien ausgeben, welche NICHT gelöscht werden (leerzeichen sollten auch berücksichtigt werden).
In stark vereinfachter Form versuche ich also folgendes Script-Schnipsel auszuführen:
Ich moechte also jedem Eintrag aus der Variable $muell ein "--ignore=" voranstellen, und die daraus resultierende Variable $ls_ignore als Parameter dem "ls" Befehl mitgeben.
Im aktuellen Verzeichnis befinden sich bei meinen Tests folgende Dateien:
Führe ich das Script aus, erhalte ich jedoch als Fehlermeldung:
Ersetze ich den "ls" Befehl durch ein "echo ${ls_ignore}", erhalte ich folgende Ausgabe:
Kopiere ich diese Ausgabe manuell und füge sie direkt in der Bash als Parameter nach einem "ls -l" ein, funktioniert es tadellos:
Ich habe natürlich noch die Möglichkeit, eine weitere Variable manuell in meinem Script zu erstellen, also in der Art:
Auch dies funktioniert tadellos, erhöht nur bei vielen Muell-Einträgen die Fehlerquote, da immer zwei Variablen gepflegt werden müssen.
Jetzt aber zu meiner Kernfrage (wird auch Zeit):
Wo liegt mein Denkfehler? Warum kann ich den Inhalt der selbst-gestrickten Variable direkt auf der Bash als Parameter verwenden, aber nicht innerhalb meines Scripts?
Gibt es einen besseren als den von mir skizzierten Weg, dies zu erreichen?
Wäre klasse, wenn mich jemand in die richtige Richtung schubsen würde, da ich kurz davor stehe, ein Stück aus meiner Tastatur herauszubeißen.
Besten Dank und Gruß,
relkai
ich habe ein inzwischen recht langes Script, welches bei manuellem Aufruf durch bestimmte Unterverzeichnisse wandert und diverse Aufgaben durchführt.
Nun beiße ich mir aber schon seit Stunden an einer in meinen Augen eigentlich recht trivialen Sache die Zähne aus:
Das Script soll unter anderem bestimmte Verzeichnisse von Unrat befreien, und vor dem Löschen eine Dateiliste der Dateien ausgeben, welche NICHT gelöscht werden (leerzeichen sollten auch berücksichtigt werden).
In stark vereinfachter Form versuche ich also folgendes Script-Schnipsel auszuführen:
Code:
#!/bin/bash
muell=" *.avi
*.mpg
*.mp3"
for i in ${muell}; do
ls_ignore="${ls_ignore} --ignore='${i}'"
done
echo -e "\n\033[1;32mDiese Dateien werden nicht geloescht:\033[0m"
ls -l ${ls_ignore}
while [ "$loeschen" != 'j' -a "$loeschen" != 'n' ]; do
echo -en "\n\033[1;34mSoll Datenmuell geloescht werden? (j/n) \033[0m"
read -n 1 loeschen
done
if [ "$loeschen" == 'n' ]; then
echo -e "\n\033[1;32mNichts wird geloescht\033[0m"
else
echo -e "\n\033[1;32mLoesche Datenmuell\033[0m"
rm -r $muell 2>/dev/null
fi
Ich moechte also jedem Eintrag aus der Variable $muell ein "--ignore=" voranstellen, und die daraus resultierende Variable $ls_ignore als Parameter dem "ls" Befehl mitgeben.
Im aktuellen Verzeichnis befinden sich bei meinen Tests folgende Dateien:
Code:
# ls -ls
insgesamt 0
0 -rw-r--r-- 1 root root 0 23. Sep 15:03 Diese Datei loeschen.avi
0 -rw-r--r-- 1 root root 0 23. Sep 15:06 Nicht loeschen.txt
Führe ich das Script aus, erhalte ich jedoch als Fehlermeldung:
Code:
ls: Zugriff auf Datei nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf loeschen.avi' nicht möglich: Datei oder Verzeichnis nicht gefunden
Ersetze ich den "ls" Befehl durch ein "echo ${ls_ignore}", erhalte ich folgende Ausgabe:
Code:
--ignore='Diese Datei loeschen.avi' --ignore='*.mpg' --ignore='*.mp3'
Kopiere ich diese Ausgabe manuell und füge sie direkt in der Bash als Parameter nach einem "ls -l" ein, funktioniert es tadellos:
Code:
# ls -l --ignore='Diese Datei loeschen.avi' --ignore='*.mpg' --ignore='*.mp3'
insgesamt 0
-rw-r--r-- 1 root root 0 23. Sep 15:06 Nicht loeschen.txt
Ich habe natürlich noch die Möglichkeit, eine weitere Variable manuell in meinem Script zu erstellen, also in der Art:
Code:
ls_ignore=" --ignore=*.avi
--ignore=*.mpg
--ignore=*.mp3"
Auch dies funktioniert tadellos, erhöht nur bei vielen Muell-Einträgen die Fehlerquote, da immer zwei Variablen gepflegt werden müssen.
Jetzt aber zu meiner Kernfrage (wird auch Zeit):
Wo liegt mein Denkfehler? Warum kann ich den Inhalt der selbst-gestrickten Variable direkt auf der Bash als Parameter verwenden, aber nicht innerhalb meines Scripts?
Gibt es einen besseren als den von mir skizzierten Weg, dies zu erreichen?
Wäre klasse, wenn mich jemand in die richtige Richtung schubsen würde, da ich kurz davor stehe, ein Stück aus meiner Tastatur herauszubeißen.
Besten Dank und Gruß,
relkai