我想创建一个菜单供用户选择使用对话框查看哪个文件。文件名称存储在名为'fileNames'的数组中。我想送他们作为参数传递给对话框的命令是这样的:如何在bash脚本中逐个传递数组中的所有值?
dialog --menu "Choose a file:" 20 50 ${#fileNames[@]} 1 <${fileNames[0]}> 2 <${fileNames[1]}> ...
我想创建一个菜单供用户选择使用对话框查看哪个文件。文件名称存储在名为'fileNames'的数组中。我想送他们作为参数传递给对话框的命令是这样的:如何在bash脚本中逐个传递数组中的所有值?
dialog --menu "Choose a file:" 20 50 ${#fileNames[@]} 1 <${fileNames[0]}> 2 <${fileNames[1]}> ...
你的目标应该是一个什么样的解决方案将包含特殊字符(空格,换行连)文件名的工作。你可以做的是建立一个二级阵列所需的所有字符串,像这样:
declare -i i=0
declare -a arguments=()
for file in "${fileNames[@]}" ; do
arguments+=($((++i)) "$file")
done
dialog --menu "Choose a file:" 20 50 "${arguments[@]}"
围绕"${arguments[@]}"
阵列扩展的双引号是什么阻止分词从每个单独的元素内发生,并保证空格和特殊(但有效的)文件名中的字符不会导致问题。
请注意,此代码假定fileNames
数组已存在且不为空。它还假设传递给dialog
命令的数字不是实际的数组索引,而是顺序并从1开始。如果这些不是正确的假设,请评论,我可以相应地更新解决方案。
好,最简单的方法是使用${fileNames[@]}
。
dialog --menu "Choose a file:" 20 50 ${#fileNames[@]} 1 "${fileNames[@]}"
编辑:要在每个参数之间的数字相加,我会用一个for
循环;
line="dialog --menu \"Choose a file:\" 20 50 ${#fileNames[@]}"
for ((i=0;i<${#fileNames[@]};i++)); do
line="$line "$(($i + 1))
line="$line " "${FileNames[$i]}"
done
$line #This will run the completed line built above
是的,但我需要在每个文件名之间添加数字 –
我的错误,一个时刻。 – Guest