Antworten:
Nun, hier ist meine aktuelle Lösung, die ich mir ausgedacht habe. Nutzung meiner (sehr) eingeschränkten Kenntnisse in Bash und Google.
#!/bin/bash
# Print a list of packages that no other package depends on
PackageCount=0
PackageIter=0
# Populate package array
declare -A Packages
PackageList=$(cygcheck.exe -c | cut -d' ' -f1 | tail -n +3)
for P in $PackageList; do
Packages[${P,,}]=0
((PackageCount++))
done
# Determine the last mirror used
LastMirror=$(sed -n '/last-mirror/{n;p}' /etc/setup/setup.rc | tr -d '\t')
echo "[DEBUG] LastMirror = $LastMirror"
# Download the setup.ini file from the mirror server
echo "[DEBUG] Downloading setup.ini from mirror"
if which bzcat &>/dev/null; then
wget --quiet "${LastMirror}$(uname -m)/setup.bz2" -O - | bzcat > setup.ini
else
wget --quiet "${LastMirror}$(uname -m)/setup.ini" -O setup.ini
fi
for P in $PackageList; do
((PackageIter++))
echo -ne "[DEBUG] Processing packages $((PackageIter * 100 / PackageCount))%\r"
deps=$(sed -n "/^@ $P$/,/^requires/p" setup.ini | grep -i '^requires' | cut -d' ' -f2-)
for dep in $deps; do
if [[ ${Packages[${dep,,}]} ]]; then
Packages[${dep,,}]=$((Packages[${dep,,}]+1))
fi
done
done
echo -e "\n== Packages =="
for P in $PackageList; do
if [[ ${Packages[${P,,}]} == 0 ]]; then
echo $P
fi
done
rm setup.ini
Ich würde gerne sehen, ob jemand eine bessere Lösung oder Tipps zur Verbesserung meines Skripts hat.
N=$N+1
Fehler zu beheben. In Bash wird hierdurch tatsächlich eine Zeichenfolge erstellt und keine mathematische. Wenn Sie die Anweisung in(( ))
einschließen, können Sie echte Mathematik in Bash ausführen (wie Sie später im Skript festgestellt haben müssen). Außerdem habe ich diesen Teil nicht geändert, aber Sie müssen die Anzahl der Elemente in einem Array nicht zählen. Stattdessen$PackageCount
können Sie${#PackageList}
direkt auf zugreifen , um die Anzahl der Elemente abzurufen.