首页 > 解决方案 > shell脚本中的剪切命令

问题描述

我的 shell 脚本看起来像这样

 i="10 ID:794 A:TX-SPN S:0"
 A=`echo $i | cut -d" " -f 3| cut -d":" -f2`  # gives TX-SPN
 ID=`echo $i | cut -d" " -f 2|cut -d":" -f2`  # gives 794 
 sZeroCount=`echo $i | cut -d" " -f 1`  # gives  10

通过上述命令,我可以获得 A、ID、sZeroCount 变量的值,因为 i 的值只包含一个条目,i 的值不限于 1,它可能会上升到 1000。有没有更好的方法可以让我可以获得这些值。

标签: shellawk

解决方案


使用这段代码,您可以将您的行转换为适当的关联数组:

declare -A dict
for token in START:$i  # choose a value for START that is not a key
do
  IFS=: read key value <<< "$token"
  dict["$key"]=$value
done

您可以使用以下方式转储结果declare -p dict

declare -A dict='([A]="TX-SPN" [S]="0" [ID]="794" [START]="10" )'

您可以使用以下内容访问内容:echo "${dict[A]}"

TX-SPN

起始值(10在您的示例中)可以作为"${dict[START]}". 选择一个START不会在您的输入中显示为键的值。

如果你想遍历很多行,比如你的$i,你可以这样做:

while read i
do
  declare -A dict
  # ... add code from above ...
done < input_file

使用关联数组的优势在于,通过这种方式,您可以以更易于理解的方式访问您的值,即使用键而不是一些任意索引,这些索引很容易混淆,并且在更改代码时需要不断维护。


推荐阅读