我真的为此绞尽了脑汁。我刚开始编写一些 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