2013-05-12 104 views
2

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

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

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

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

脚本后来我必须调用这些文件中的“头”和“grep的”的arrat我试图这样

head -n 1 ${arr_pos[0]} 

,但我得到这个错误不运行时

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

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

+0

也许你试图以双重替换以某种方式访问​​第二个参数。你可以检查一下'shift'http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_09_07.html – abasu 2013-05-12 15:31:02

+0

@abasu我知道从脚本调用获取参数的标准方法($ X其中X是参数的位置),但这是行不通的。 – 2013-05-12 15:34:19

回答

2

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

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

#! /bin/bash 

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

输出:

log1.log 

膨胀${@:${arr_pos[0]}:1}意味着你服用范围从索引${arr_pos[0]}的值的数组中[email protected]到相同数组[email protected]中的索引${arr_pos[0]} + 1的元素。

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

无论如何,你可能应该通过参数的整个阵列由脚本的开始,散列找到值尽量循环,这样你就不会遇到麻烦,而试图稍后获取每个值。您可以循环使用for + case ... esac,并将值存储在关联数组中。

+0

$ {@:$ {arr_pos [0]}:1} 1代表什么? 如果我是正确的,我试图“在”scrip的调用($ {@:...})中触及$ {arr_pos [0]}元素 – 2013-05-12 15:39:45

+1

@ArrigoPierotti我已经给答案添加了一个解释。 – Rubens 2013-05-12 15:42:51

+0

似乎它的工作!谢谢! – 2013-05-12 15:47:02

2

我认为eval是你需要的。

#!/bin/bash 

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

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

对我而言有效。