
Ich versuche ein Skript zu schreiben, das irgendwann die Benutzerrechte mehrerer Ordner überprüfen muss. Die Pfade werden in einer Variablen gespeichert, jeder Pfad in einer neuen Zeile.
Bisher habe ich Folgendes:
output=$PATH
output=$(echo "$output" | tr ':' '\n' | sort )
arr=($(echo "$output"))
for i in "$arr"
do
echo "$i"
if ! [[ -x $i ]]; then
echo "You are missing execute Permission on
echo "$i"
fi
done
Die Ausgabe enthält mehrere Pfade, in meinem Fall den Inhalt meiner $PATH
Variable.
Mit der ersten Zeile versuche ich die mehrzeilige Variable in ein Array umzuwandeln und anschließend über alle Array-Elemente zu iterieren.
Wenn ich den Code ausführe, funktioniert er nur für den ersten Eintrag, der echo "$i"
nur /bin
vor dem Verlassen der Schleife angezeigt wird.
Ich nehme also an, dass ich die mehrzeilige Variable nicht in ein Array konvertiert habe.
Antwort1
Ersetzen:
for i in "$arr"
mit:
for i in "${arr[@]}"
$arr
bezieht sich nur auf das erste Element eines Arrays. {$arr[@]}
wird auf alle Elemente erweitert, jedes als separates Wort.
Wenn Sie über Bash 4.0 oder neuer verfügen, können Sie Folgendes außerdem arr
in einem Schritt erstellen:
mapfile -t arr <<<"${PATH//:/$'\n'}"