将命令的输出放入数组并提取特定位置值

将命令的输出放入数组并提取特定位置值

这个问题是参考其他问题提出的这里

我试图将以下命令的输出存储到一个数组中并从中提取第二个值,但无法获取。

我的输出看起来像是将cat也存储在我的数组中并打印没有这样的文件或目录,我不明白这是怎么发生的。

#!/bin/sh

array=($(cat $(openssl asn1parse -inform der -in $1 | grep id-smime-aa-pattern -A 1 | cut -f1 -d:)))
echo ${array[1]}

# Below combinations also does not work
#echo startnum:"$(openssl asn1parse -inform der -in $1 | grep id-smime-aa-pattern -A 1 | cut -f1 -d:)" > array
#array=($(cat "$(openssl asn1parse -inform der -in $1 | grep id-smime-aa-pattern -A 1 | cut -f1 -d:)"))

输出:

cat:7430:没有这样的文件或目录
cat:7567:没有这样的文件或目录

如何更改脚本以在一行中提取第二个值?

答案1

$ readarray -t array <<< $(openssl asn1parse -inform der -in "$1" | 
                             grep id-smime-aa-pattern -A 1 |
                             cut -f1 -d:)

或者,使用andawk代替:grepcut

readarray -t array <<< $(openssl asn1parse -inform der -in "$1" |
                           awk -F: '/id-smime-aa-pattern/ {print $1; getline; print $1}')

鉴于上一个问题的示例输入,上述任一命令都将导致 $array 包含:

$ declare -p array
declare -a array=([0]="7430" [1]="7567")

或者,如果您只想要该行的输出 id-smime-aa-pattern,您不需要使用数组:

$ foo=$(openssl asn1parse -inform der -in "$1" |
          awk -F: '/id-smime-aa-pattern/ {getline; print $1}')
$ echo $foo
7567

相关内容