Я действительно выдергиваю волосы на этом. Я только начал с некоторых сценариев bash, и я пытаюсь создать простой сценарий, который использует некоторые диалоги, чтобы дать мне быстрый способ выполнить проверку svn. Он работает нормально, пока я не хочу обслуживать радиолист с несколькими вариантами, которые выбираются, когда вы входите в свой проект для проверки.
Вот последняя часть кода, где он не работает:
if [ $MATCHFOUND = true ]; then
echo 'Exact match found do checkout'
else
if [ ${#repoar[@]} == 0 ]; then
whiptail --title "Error" \
--msgbox "No matches found for [$PROJECT]" 8 78
./dialog.sh
else
for ((i=0; i<${#repoar[@]}; i++))
do
RADIOLIST=$RADIOLIST" \"$i\" \"${repoar[$i]}\" \"OFF\""
done
let ARLENGTH=${#repoar[@]}
whiptail --radiolist "Projects found" 20 78 $ARLENGTH "$RADIOLIST"
fi
fi
Пример для $ RADIOLIST
"0" "test" "OFF" "1" " test 5" "OFF" "2" " test2" "OFF" "3" " test3" "OFF" "4" " test4" "OFF"
Аргументы Radiolist, похоже, не экранируются, как должны, когда я добавляю переменную в качестве аргументов параметра. Когда я копирую пример с помощью команды whiptail, он работает нормально.
Цитаты интерпретируются перед переменные подставляются, поэтому вложение кавычек в значения переменных не дает ничего полезного. Если я понимаю, что вы пытаетесь сделать правильно, самый простой способ сделать это - использовать массив для RADIOLIST:
RADIOLIST=()
for ((i=0; i<${#repoar[@]}; i++))
do
RADIOLIST+=("$i" "${repoar[$i]}" "OFF")
done
let ARLENGTH=${#repoar[@]}
whiptail --radiolist "Projects found" 20 78 $ARLENGTH "${RADIOLIST[@]}"
Похоже, тебе нужно изменить
RADIOLIST=$RADIOLIST" \"$i\" \"${repoar[$i]}\" \"OFF\""
Чтобы
RADIOLIST=$RADIOLIST" \\\"$i\\\" \\\"${repoar[$i]}\\\" \\\"OFF\\\""
Это вставит \
перед каждым "
в сгенерированном выводе, что приводит к желаемому экранированию при вызове whiptail
несколькими строчками позже.