Скрипт Bash - проблема с контрольным списком диалогов

487
coverflower

Я пытаюсь написать bash-скрипт для автоматизации установки моих пакетов. Таким образом, идея состоит в том, чтобы прочитать файл .csv (packages.csv) следующим образом:

pkg,Description,option wget,file downloader,on curl,tool to transfer data from or to a server,on nano,text editor for Unix-like computing systems,off emacs,An extensible customizable free/libre text editor — and more,on 

построить массив для каждого столбца (без заголовка), а затем передать массивы в контрольный список диалога.

#!/bin/bash  input="packages.csv" while IFS=',' read -r col1 col2 col3 do  for a in $col1; do array_col1+=("$a")  done  for b in $col2; do array_col2+=("$b") done  for c in $col3; do array_col3+=("$c") done   done < "$input"  array1=("$") array2=("$") array3=("$")  let num=${#array2[*]}-1  for i in $(seq 0 $num); do list[i]=$(echo $ $ $) done  OPTION=$(dialog --checklist "Choose packages:" \ 10 60 4 \ $) exitstatus=$? if [ $exitstatus = 0 ]; then echo "$OPTION" else echo "Cancel" fi 

В какой-то момент я все заработал, но в описании не было пробелов. После того, как я сделал некоторые изменения, чтобы включить пробелы, это не работает вообще. Как я могу это исправить? На самом деле в моем файле .csv у меня более 3 столбцов, но контрольный список bash ожидает 3 аргумента. Можно ли как-то включить их в контрольный список?

0
Рассматривали ли вы использовать что-то вроде [puppet] (https://www.puppetcookbook.com/posts/install-multiple-packages.html) вместо этого? Ссылка содержит пример вашего точного варианта использования. hhoke1 5 лет назад 0
Нет, кукла кажется излишним для этого простого случая. coverflower 5 лет назад 0
Что такое `для в $ col1; делать для? И то же самое для `b` и` c`? Я думаю, что когда вы делаете это для `b`,` $ col2` подвергается разделению слов со стандартным `IFS`; затем вы получаете несколько `b`-s, все еще анализируя одну строку. Kamil Maciorowski 5 лет назад 0
@Kamil Maciorowski: заполнить 3 массива coverflower 5 лет назад 0
Я нашел это здесь: https://stackoverflow.com/questions/30146241/error-with-linux-whiptail-dialog-arguments-from-bash-variable, который работает. Средний аргумент находится в одинарных кавычках, а левый и правый аргументы - нет. Это должно быть проблемой, но я не знаю, как это исправить ... coverflower 5 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski
#!/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). А затем, все еще внутри цикла, сделайте остальную часть своей работы.