#!/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
Основные изменения:
tail -n +2 "$input"
раздеть заголовок;dummy
переменная для разрешения более трех столбцов (дополнительные столбцы не имеют значенияdialog
);- одна
array
переменная для создания входных данныхdialog
вместо многих, которые передают данные ограниченным образом; "$"
как правильный способ передать массив в качестве аргументов командной строки в этом случае;--output-fd 1
объяснил в этом ответе (там есть лучшие, более надежные решения);- строчные переменные в этом ответе .
На самом деле в моем
.csv
файле более 3 столбцов, но контрольный список bash ожидает 3 аргумента. Можно ли как-то включить их в контрольный список?
Зачем? Правда, dialog --checklist
ожидает их три на три. Держите это в порядке. Я думаю, может быть, вам нужно больше столбцов для вашего кода, который идет после dialog
. Примите во внимание следующее: когда вы dialog
успешно вернете идентификаторы из первого столбца и получите их $option
, проанализируйте их вывод следующим образом:
for package in $option; do … ; done
(Для этого ваш первый столбец packages.csv
не может содержать пробелов и т. Д.)
Таким образом, вы можете сделать что-то для каждого выбранного пакета. Внутри этого цикла вы можете прочитать столько столбцов, сколько вам нужно, но сначала grep
для правильной строки:
IFS=',' read -r col1 col2 col3 col4 col5 col6 dummy < <(grep "^$," "$input")
(Подсказка: исследуйте read -a
, смотрите help read
). А затем, все еще внутри цикла, сделайте остальную часть своей работы.