コマンドの出力を配列に入れ、特定の位置値を抽出します。

コマンドの出力を配列に入れ、特定の位置値を抽出します。

この質問は他の質問に関して質問された。ここ

次のコマンドの出力を配列に保存し、ここから2番目の値を抽出しようとしていますが、インポートできません。

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: 該当ファイルまたはディレクトリなし

行の2番目の値を抽出するようにスクリプトを変更するにはどうすればよいですか?

ベストアンサー1

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

または代わりにawk、以下を使用してください。grepcut

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

前の質問の入力例を考えると、上記のコマンドの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

おすすめ記事