#!/bin/bash input="packages.csv" while IFS=',' read -r col1 col2 col3 dummy do array+=("$col1") array+=("$col2") array+=("$col3") done < <(tail -n +2 "$input") option=$(dialog --checklist --output-fd 1 "Choose packages:" 10 60 4 "$") exitstatus=$? if [ $exitstatus = 0 ]; then echo "$option" else echo "Cancel" fi
Hauptänderungen:
tail -n +2 "$input"
den Header abstreifen;dummy
Variable, um mehr als drei Spalten zuzulassen (zusätzliche Spalten spielen keine Rolledialog
);- eine
array
Variable, für die eine Eingabe erstellt werden kann,dialog
anstatt viele, die Daten auf verkrüppelte Weise übergeben; "$"
in diesem Fall eine geeignete Methode, um array als Befehlszeilenargumente zu übergeben;--output-fd 1
erklärt in dieser Antwort (es gibt bessere, robustere Lösungen gibt);- Kleinbuchstabenvariablen für diese Antwort .
Eigentlich habe
.csv
ich in meiner Datei mehr als 3 Spalten, aber die Bash-Checkliste erwartet 3 Argumente. Kann man sie irgendwie in die Checkliste aufnehmen?
Wozu? Richtig, dialog --checklist
erwartet sie drei mal drei. Halten Sie es aufgeräumt. Ich denke, vielleicht haben Sie mehr Spalten für Ihren Code benötigen, das kommt nach dialog
. Beachten Sie Folgendes: Wenn dialog
die Bezeichner aus der ersten Spalte erfolgreich zurückgegeben werden und diese vorhanden sind $option
, parsen Sie die Ausgabe folgendermaßen:
for package in $option; do … ; done
(Damit dies funktioniert, packages.csv
darf Ihre erste Spalte keine Leerzeichen enthalten.)
Auf diese Weise können Sie für jedes ausgewählte Paket etwas tun. Innerhalb dieser Schleife können Sie so viele Spalten lesen, wie Sie benötigen, jedoch zuerst grep
für die richtige Zeile:
IFS=',' read -r col1 col2 col3 col4 col5 col6 dummy < <(grep "^$," "$input")
(Hinweis: Nachforschen read -a
, siehe help read
). Und dann, immer noch in der Schleife, erledigen Sie den Rest Ihrer Arbeit.