我有一个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
我尝试了各种括号组合,但我找不到哪一个是正确的。
答案 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
,这样你就可以访问参数数组了。虽然它运行得很好,但是根据谁来运行你的脚本可能会有风险 - 因为他们可能会在参数行中添加命令。
无论如何,您可能应该尝试在脚本开头循环遍历整个参数数组,散列您找到的值,这样您在尝试获取时就不会遇到麻烦每个值以后。您可以使用$
循环,并将值存储在关联数组中。