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 一个答案。
因此,我的脚本应该使用 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
. 所需的值填充 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 一个答案。
arglist