在 Array Bash 脚本中打印值

在 Array Bash 脚本中打印值

我的文件Threadout.txt包含类似Thread 1/1/25/100

val1=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $1}')  
val2=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $2}')    
val3=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $3}')  
val4=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $4}')

for((i=1;i<5;i++))  
do  
  val[i]=$(grep 'Thread' Threadout.txt | awk -F"/" '{print $[i]}')  
  echo $val[i] 
done

我已经尝试过这个数组,但没有给出正确的结果,例如1 1 25 100值。有错误吗?

答案1

您的代码有几个问题。

  • 首先要记住的重要事情是,由于您的awk程序用单引号引起来(建议这样做),因此不会发生 shell 参数扩展,并且您的语句print $[i]将不起作用。看到这个StackOverflow 上详尽的问答关于如何在awk程序中使用 shell 参数。
  • 即便如此,awk其编号存储在 ( awk) 变量中的字段n将通过$n,而不是 来寻址$[n]
  • val1您分配了变量val4但从未实际使用它们,因此脚本示例的第一部分不执行任何操作。
  • 最后,要取消引用数组变量,您必须声明${val[i]}, not $val[i](这将打印变量的内容$val- 空字符串 - 后跟固定字符串[i])。

还有一些效率低下的问题,例如重复调用awkand (据我所知)在仅用作字段分隔符Thread时无法解决示例输入中的前导问题。/

要解决这些问题,并且由于示例中相关值不包含空格,请尝试以下操作:

#!/bin/bash

val=( $(awk '/^Thread/{n=split($2,a,/\//); for (i=1;i<=n;i++) printf("%s%s",a[i],OFS)}' Threadout.txt) )

for i in ${!val[@]}
do
    echo "${val[i]}"
done
  • awk调用将分割该行的第二个“字段” Thread 1/1/25/100,即1/1/25/100位于/数组中的部分a,并打印数组的所有条目,以OFS(默认为空格)分隔。
  • shell 脚本将获取该程序的输出- 因为它是一个以空格分隔的标记列表 -通过语句awk将各个标记分配给一个数组变量。valval=( ... )
  • 然后它将迭代数组索引并打印数组值。

您可能想进一步阅读 bash 数组GNU Bash 参考手册, 或者GreyCat&Lhunath 的 Bash 指南。我还建议您看一下外壳检查调试您的 shell 脚本。

相关内容