2

我有一个 bash 脚本,它接受几个文件作为输入,这些文件与各种脚本的选项混合在一起,例如:

bristat -p log1.log -m lo2.log log3.log -u

我创建了一个数组,我在其中保存所有索引,我可以在脚本调用中找到文件,所以在这种情况下,它将是 3 个元素的数组,其中

arr_pos[0] = 2
arr_pos[1] = 4
arr_pos[3] = 5

稍后在脚本中,我必须在这些文件中调用“head”和“grep”,我尝试了这种方式

head -n 1 ${arr_pos[0]}

但我在非运行时收到此错误

head: cannot open `2' for reading: No such file or directory

我尝试了各种括号组合,但我找不到哪个是正确的。

4

2 回答 2

2

我认为 eval 是你需要的。

#!/bin/bash

arr_pos[0]=2;
arr_pos[1]=4;
arr_pos[2]=5;

eval "cat \$${arr_pos[1]}"

对我来说,这行得通。

于 2013-05-12T15:33:10.107 回答
2

这里的问题是${arr_pos[0]}存储您拥有文件名的索引,而不是文件名本身 - 所以您不能简单地head使用它。存储参数的数组由 给出$@

访问所需数据的一种可能方法是:

#! /bin/bash

declare -a arr_pos=(2 4 5)
echo ${@:${arr_pos[0]}:1}

输出:

log1.log

扩展${@:${arr_pos[0]}:1}意味着您正在获取从${arr_pos[0]}数组中的索引到同一数组$@中索引的元素的值。${arr_pos[0]} + 1$@

正如@flaschenpost 所指出的,另一种方法是指向eval前面的索引$,这样您就可以访问参数数组。尽管它工作得很好,但根据谁将运行您的脚本可能会有风险——因为他们可能会在参数行中添加命令。

无论如何,您可能应该尝试在脚本开头循环遍历整个参数数组,对找到的值进行哈希处理,这样您以后在尝试获取每个值时就不会遇到麻烦。您可以使用 a 循环for + case ... esac并将值存储在关联数组中。

于 2013-05-12T15:34:35.380 回答