如何在bash脚本中逐个传递数组中的所有值作为参数?

时间:2017-03-04 10:01:31

标签: linux bash

我想为用户创建一个菜单,以便使用对话框选择要查看的文件。文件名存储在名为“fileNames”的数组中。我想将它们作为参数发送到对话框命令,如下所示:

dialog --menu "Choose a file:" 20 50 ${#fileNames[@]} 1 <${fileNames[0]}> 2 <${fileNames[1]}> ...

2 个答案:

答案 0 :(得分: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开始。如果这些不是正确的假设,请注释,我可以相应地更新解决方案。

答案 1 :(得分:0)

嗯,最简单的方法是使用${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