如何在Shell脚本中的循环内对数组索引进行grep

时间:2019-06-08 07:46:20

标签: bash shell unix

cmd是一个数组,我想grep每个索引:

for i in "${cmd[@]}";
do
a=`deep status | grep "${cmd[$i]}" |  awk  '{print $2 ~ /RUNNING/}'

但这不起作用a应该包含10,但是我没有任何处理:

cmd[@]: ERROR (no such process)

1 个答案:

答案 0 :(得分:1)

您要遍历数组的内容,然后尝试将元素用作索引。您需要直接使用元素作为参数:

for i in "${cmd[@]}"
do
    a=$(deep status | awk -v my_var="$i" '$0 ~ my_var {print $2 ~ /RUNNING/}')
done

可以遍历索引,然后在数组引用中使用索引,但这可能不是必需的,除非您需要对索引本身做一些事情:

for i in "${!cmd[@]}"    # Note the "!"
do
    echo "$i"    # or some other operation using the index
    a=$(deep status | awk -v my_var="${cmd[$i]}" '$0 ~ my_var {print $2 ~ /RUNNING/}')
done

请注意,没有必要将grep用管道传输到awk中,因为后者可以自己进行匹配。我在这里使用过$0,但是如果您知道要匹配的字段,则可以更具体。

此外,在循环中重复运行同一命令可能很慢。取决于“深度状态”的工作方式和数组的格式,您可能不需要for循环就可以完成全部操作。

并使用$()代替反引号。它们更具可读性,更易于嵌套。