Похожие вопросы

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

Я пытаюсь написать скрипт bash для автоматизации установки моих пакетов. Идея в том, чтобы читать .CSV-файл (пакеты.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=("${array_col1[@]:1}")
array2=("${array_col2[@]:1}")
array3=("${array_col3[@]:1}")

let num=${#array2[*]}-1

for i in $(seq 0 $num); do
    list[i]=$(echo ${array1[i]} ${array2[i]} ${array3[i]})
done

OPTION=$(dialog --checklist "Choose packages:" 
10 60 4 
${list[*]})
exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "$OPTION"
else
    echo "Cancel"
fi

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

5
задан coverflower
источник

1 ответов

#!/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 "${array[@]}")

exitstatus=$?
if [ $exitstatus = 0 ]; then
    echo "$option"
else
    echo "Cancel"
fi

основные изменения:

  • tail -n +2 "$input" снять заголовок;
  • dummy переменная разрешить более трех столбцов (дополнительные столбцы не имеют значения для dialog);
  • one array переменная для создания входных данных для dialog вместо многих, которые передают данные в манере;
  • "${array[@]}" как правильно передать массив в качестве аргументов командной строки в этом случае;
  • --output-fd 1 объяснил в ответ (есть лучше, более надежных решений нет);
  • переменные в нижнем регистре на ответ.

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

для чего? Правда,dialog --checklist ожидает их три на три. Держите его в чистоте. Я думаю, возможно, вам нужно больше столбцов для вашего кода, который приходит после dialog. Рассмотрим следующее: Когда dialog успешно возвращает идентификаторы из первого столбца и они у вас в $option, парсить его вывод такой:

for package in $option; do … ; done

(для этой работы ваш первый столбец в packages.csv не может содержать пробелы и т. д.)

таким образом, вы можете сделать что-то для каждого выбранного пакета. Внутри этого цикла вы можете прочитать столько столбцов, сколько вам нужно заново, но сначала grep для правильного line:

IFS=',' read -r col1 col2 col3 col4 col5 col6 dummy < <(grep "^${package}," "$input")

(подсказка: проанализируйте read -a см. help read). И затем, все еще в петле, делайте остальную часть своей работы.

1
отвечен Kamil Maciorowski 2018-04-20 18:20:01
источник

Другие вопросы bash dialog