在bash脚本中打开文件

时间:2013-05-12 15:22:44

标签: bash file-io parentheses

我有一个bash脚本接受多个文件作为输入,并与各种脚本的选项混合,例如:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

我认为eval就是你所需要的。

#!/bin/bash

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

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

对我有用。

答案 1 :(得分: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的元素范围内取值{ {1}}。

正如@flaschenpost指出的那样,另一种方法是$@索引前面加eval,这样你就可以访问参数数组了。虽然它运行得很好,但是根据谁来运行你的脚本可能会有风险 - 因为他们可能会在参数行中添加命令。

无论如何,您可能应该尝试在脚本开头循环遍历整个参数数组,散列您找到的值,这样您在尝试获取时就不会遇到麻烦每个值以后。您可以使用$循环,并将值存储在关联数组中。