我有一个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
我试过各种括号组合,但找不到哪一个是正确的。
最佳答案
这里的问题是${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]}
中的index$@
到同一数组${arr_pos[0]} + 1
中index$@
元素的值。另一种方法,正如@flaschenpost所指出的,是
eval
前面有$
的索引,这样您就可以访问参数数组了。尽管它工作得很好,但根据谁来运行脚本,这可能会有风险,因为它们可能会在参数行中添加命令。无论如何,您可能应该尝试在脚本的开头遍历整个参数数组,对找到的值进行哈希运算,以便以后尝试获取每个值时不会遇到问题可以使用
for + case ... esac
循环并将值存储在关联数组中。关于bash - 在bash脚本中打开文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16508866/