bash whiptail 变量参数

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 命令复制示例时,它工作正常。

答案1

引言得到解读变量会被替换,因此在变量值中嵌入引号不会产生任何作用。如果我理解您要正确执行的操作,最简单的方法是使用 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[@]}"

答案2

看来你需要改变

RADIOLIST=$RADIOLIST" \"$i\" \"${repoar[$i]}\" \"OFF\""

RADIOLIST=$RADIOLIST" \\\"$i\\\" \\\"${repoar[$i]}\\\" \\\"OFF\\\""

这将在生成的输出中的\每个之前插入一个,从而导致在几行之后的调用中进行所需的转义。"whiptail

相关内容