Цикл сценария Bash для увеличения параметров

Я хочу использовать whiptail для создания списка whiptail на основе вывода из другой программы. Нужно только первое слово в каждой строке вывода из первой программы, поэтому я извлекаю его с помощью awk .

Чтобы узнать, как bash обрабатывает массивы, я использовал эту ссылку по tldp . Я получил, как проверить размер массивов отсюда .

Это не работает, как ожидалось, но если я echo выход echo и whiptail « whiptail » перед ним, он работает.

Как исправить этот код так, чтобы он работал?

пример program.sh :

 #! /bin/bash find ./ -printf "%f\n" 

пример mainscript.sh :

 #! /bin/bash MYARRAY=($(./program.sh -l | awk '{print $1;}')) MYPARAMS=" --checklist \"\" 15 40 5" i=0 while [[ $i -lt ${#MYARRAY[@]} ]] do MYPARAMS+=" \"${MYARRAY[$i]}\" \" \" off" i=$[$i+1] done whiptail $MYPARAMS echo $MYPARAMS exit 

Не очень желательное решение, но вы можете использовать eval :

 eval whiptail $MYPARAMS 

Я подозреваю, что проблема заключается в цитировании. Однако вы можете создать MYPARAMS как массив, и он будет работать, как ожидалось:

 #! /bin/bash MYARRAY=($(./program.sh -l | awk '{print $1;}')) MYPARAMS=( --checklist "" 15 40 5 ) i=0 while [[ $i -lt ${#MYARRAY[@]} ]] do MYPARAMS+=( "${MYARRAY[$i]}" " " off ) i=$[$i+1] done whiptail "${MYPARAMS[@]}" echo "${MYPARAMS[@]}" exit 

Почему вы сделали MYPARAMS строкой, а не массивом? Поскольку MYPARAMS представляет собой строку, такую ​​как --checklist "" 15 40 5 "foo1" " " off , командная строка оболочки whiptail $MYPARAMS приводит к whiptail $MYPARAMS с аргументами --checklist "" (строка, состоящая из двух двойных кавычек ), 15 , 40 , 5 , "foo1" , " , " и off . Когда вы оставляете переменное расширение без кавычек, его значение разбивается на поля в каждой пробельной последовательности, а полученные поля рассматриваются как шаблоны подстановочных знаков, которые расширяются, если они соответствуют любому файлу. Цитаты относятся к синтаксису оболочки, они только расширены синтаксическим анализатором оболочки, а не как часть расширения переменных.

Вы можете вызвать синтаксический анализатор оболочки с помощью встроенного eval , но получить правильное цитирование сложно. Было бы особенно сложно, если бы элементы могли содержать символы, которые не выдерживают себя в синтаксисе оболочки.

Массив – это правильный способ хранения списка строк. Предполагая, что вы успешно установите MYARRAY в список тегов, которые хотите использовать, вы можете MYARRAY этот массив для построения массива параметров.

 MYPARAMS=() for t in "${MYARRAY[@]}"; do MYPARAMS+=("$t" " " "off") done whiptail "${MYPARAMS[@]}"