Назад | Перейти на главную страницу

переменные параметры bash whiptail

Я действительно выдергиваю волосы на этом. Я только начал с некоторых сценариев 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 несколькими строчками позже.