Erstellen einer ausgewählten Benutzerliste in Bash unter OS X

Erstellen einer ausgewählten Benutzerliste in Bash unter OS X

Ich versuche, ein Kopierskript zu erstellen, um schnell einen Benutzerordner in OS X zu kopieren und dabei allen Müll (Caches, alte iPhone-Backups, Protokolle usw.) auszuschließen. Soweit ich diese Dateien/Ordner nicht kopiere, habe ich kein Problem. Das Problem tritt bei der Auswahl des Benutzers auf. Ich möchte eine Liste aller Benutzer auf dem Computer erstellen, Systemkonten ausgenommen, und den Bediener auswählen lassen, welcher Benutzerordner gesichert werden soll, indem er einfach eine Nummer aus einer Liste eingibt. Derzeit kann ich die Benutzer mit dem folgenden Befehl abrufen:

userList=`dscl . list /Users UniqueID | awk '$2 >= 400 { print $1; }'`

Dies gibt beispielsweise Folgendes zurück:

hiddenadmin fred joe kim

Ich möchte eine Auswahlliste erstellen, die dann anzeigt:

Please choose which user folder you would like to copy:
  1) hiddenadmin
  2) fred
  3) joe
  4) kim

Sobald ich den Benutzer habe, ist alles in Ordnung, aber ich kann die Liste scheinbar nicht erstellen. Außerdem gibt es keine Garantie dafür, dass die Namen gleich sind oder dass die Anzahl der Benutzer gleich ist.

Falls Sie sich fragen, warum ich nicht einfach im Ordner /Users nachschaue, um die Liste zu erstellen. Einige Konten sind möglicherweise ausgeblendet und haben ihren Benutzerordner woanders, und ich möchte die Ordner Guestoder nicht Sharedin der Liste haben. Das Problem hier ist, dass ich nicht einmal weiß, wo ich hier anfangen soll.

Antwort1

Es gibteine MengeMöglichkeiten, das zu tun, was Sie verlangen. Hier ist meine schnelle und einfache Antwort.

Da Sie Ihre Benutzer bereits in einer Variablen haben, benötigen Sie nur eine forSchleife, um die Formatierung durchzuführen. Ich verwende Ihre Werte für mein Beispiel:T

userList="hiddenadmin fred joe kim"
echo "Please choose which user folder you would like to copy:"
count=0
for name in $userList;do
  count=$((count+1))
  printf '\t%s) %s\n' $count $name
  echo
done
read -p "Choose from $(eval echo {1..$count}): " CHOICE

Diese Schleife liest Ihre userList, initialisiert einen Zähler und verwendet ihn printffür die Ausgabe. \tIhre Auswahl wird eingerückt und \nein CRLF gesendet.

Sobald Ihre Menüoption gedruckt ist, readfordert der Befehl den Benutzer zur Eingabe auf und setzt seine Auswahl auf die Variable . Sie können die Variable innerhalb der Option CHOICEwiederverwenden, um gültige Auswahlmöglichkeiten anzuzeigen. Sie müssen zusätzlichen Code hinzufügen, um die Eingabe zu validieren. Sie können das mit einer einfachen Anweisung tun .count-preadcase

case $choice in 
  1) #some code
     ;;
  2) #some code
     ;;
  *) echo "Invalid choice"
     ;;
esac

verwandte Informationen