因此,我的脚本应该提示用户使用whiptail选择哪个文件,然后从用户选择的文件中读取一些内容。 Whiptail有两个参数:列表条目的编号和列表条目本身。当用户选择列表条目时,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的答案完美无缺,他解释得非常好。谢谢!
答案 0 :(得分: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
语句中,该语句检测用户是否按下取消而不是选择答案。