Bash - 找到与数字相关联的字符串?

时间:2016-09-14 22:26:29

标签: bash input whiptail

因此,我的脚本应该提示用户使用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的答案完美无缺,他解释得非常好。谢谢!

1 个答案:

答案 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语句中,该语句检测用户是否按下取消而不是选择答案。