我有一个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/

10-14 11:55
查看更多