1

所以,我的脚本应该提示用户使用whiptail选择哪个文件,然后从用户选择的文件中读取一些内容。Whiptail 有 2 个参数:列表条目的编号和列表条目本身。当用户选择一个列表条目时,Whiptail 只返回选择的编号。所以,我的问题是,如何引用用户稍后在脚本中选择的文件?这是我到目前为止所拥有的:

whiptailargs=""
num=0
for file in device-configs/*
do
echo "File is $file"
let "num += 1"
if [[ ! "$file" == *" "* ]];
then
rem="device-configs/"
rem2=" "
whiptailargs="$whiptailargs"
whiptailargs="$whiptailargs$num"
whiptailargs="$whiptailargs $file "
fi
echo "Whiptail args: $whiptailargs"
done
mode=$(whiptail --title "Example" --menu "Choose an option" 15 60 4 $whiptailargs 3>&1 1>&2 2>&3)
num=""
echo $mode

编辑:John1024 的回答效果很好,他解释得很好。谢谢!

4

1 回答 1

0

我们可以用两个数组来完成。一个数组将保留文件名,另一个将具有所需的参数whiptail。因为我们使用的是数组,而不是变量,所以即使文件名有空格或其他难以理解的字符,也可以安全使用。因此:

flist=(device-configs/*)
arglist=()
for i in "${!flist[@]}"; do
   arglist+=("$i" "${flist[i]}")
done
mode=$(whiptail --title "Example" --menu "Choose an option" 15 60 4 "${arglist[@]}" 3>&1 1>&2 2>&3)
if [ "$mode" ]
then
    echo "$mode, ${flist[mode]}"
else
    echo "Canceled."
fi

这个怎么运作

  • flist=(device-configs/*)

    这将创建一个包含所有感兴趣文件名称的 bash 数组。即使名称包含空格或其他难字符,这也是安全的。

  • arglist=()

    这将创建一个空数组。

  • for i in "${!flist[@]}"; do arglist+=("$i" "${flist[i]}"); done

    这填充arglist了 所需的值whiptail

  • mode=$(whiptail --title "Example" --menu "Choose an option" 15 60 4 "${arglist[@]}" 3>&1 1>&2 2>&3)

    这会调用whiptail并保存结果。"${arglist[@]}"同样,即使文件名包含空格等,表单也是安全的。

  • echo "$mode, ${flist[mode]}"

    这会报告结果。我们已经把它放在一个if语句中,检测用户是否按下了取消而不是选择一个答案。

于 2016-09-14T22:50:51.253 回答