私の状態に何か問題があるようです。

私の状態に何か問題があるようです。

現在の行に次の正規表現がある場合は、現在の行と前の行を印刷するという条件でファイルを読み取ろうとします。しかし、まったく出力が出ません。

$ cat xc
#!/bin/bash
prev=
regex="switchport trunk allowed vlan*"
while read line
do
    if [ -n "${prev}" ] && [[ $line =~ $regex ]];then
        line1="${prev}"
        line2="${line}"
        echo "${line1}"
        echo "${line2}"
    fi
done < as159.tmp

$ ./xc

$prev 部分なしで条件をテストすると(下記のようにコメントアウト)、出力が出てくるのがわかります。

$ cat xc
#!/bin/bash
prev=
regex="switchport trunk allowed vlan*"
while read line
do
    #if [ -n  "${prev}" ] && 
    if [[ $line =~ $regex ]];then
        line1="${prev}"
        line2="${line}"
        echo "${line1}"
        echo "${line2}"
    fi
done < as159.tmp


$ ./xc

switchport trunk allowed vlan 40,10,30

switchport trunk allowed vlan 10,20,30,50,100

したがって、これは確かに状態の問題です。それが何なのかよく分からない。

ベストアンサー1

主な問題は変数に関するものです。prevこの変数には値がないためです。したがって、解決策は次の値を割り当てることです。

...
while read line
do
    #if [ -n  "${prev}" ] && 
    if [[ $line =~ $regex ]];then
        line1="${prev}"
        line2="${line}"
        echo "${line1}"
        echo "${line2}"
    fi
prev="$line"
done < as159.tmp
...

ところで、line1="${prev}"使用はline2="${line}"重複します(元の変数に影響を与えずに値を操作したい場合を除く)。したがって、単に以下を使用できます。

...
while read line
do
    #if [ -n  "${prev}" ] && 
    if [[ $line =~ $regex ]];then
        echo "${prev}"
        echo "${line}"
    fi
prev="$line"
done < as159.tmp
...

おすすめ記事