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

Bash - find string associated with number?

因此,我的脚本应该使用 whiptail 提示用户要 select 哪个文件,然后从用户 selected 文件中读取一些内容。 Whiptail 接受 2 个参数:列表条目的编号和列表条目本身。当用户 select 是列表条目时,Whiptail 仅 returns 的 selection。所以,我的问题是,如何在脚本中引用用户稍后 select 编辑的 文件?这是我目前所拥有的:

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 的回答非常有效,而且他解释得很好。谢谢!

我们可以用两个数组来完成。一个数组将保留文件名,另一个数组将包含 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

    这会用 whiptail.

  • 所需的值填充 arglist
  • 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 语句中,检测用户是否按下取消而不是 select 一个答案。