2つの条件を1つの条件に移動できますか?

2つの条件を1つの条件に移動できますか?

私は数週間だけスクリプトを作成しましたが、この記事の一番下で動作するように管理しました。しかし、私は私が何をすべきかを知っています。本物次のifステートメントの条件を上記のifステートメントに移動します。したがって、次の条件を実行する必要があります。

ファイルが存在し(空の文字列ではない)、次の2つのいずれかである場合:(「スイッチポートモードアクセス」または「VLANへのスイッチポートトランキングを許可する」)。

次のようなことをしたような気がします(構文が正しいかどうかはわかりませんが、説明するだけなので重要ではありません)。

     ###### 1 #####        ################ 2 ####################     ######## 3 ########
if ([ ! -z "${prev}" ] && [ "$line" = "switchport access vlan $i" ] || [[ $line =~ $regex ]]);then

それなら、それがどのようにグループ化されているのか理解できないのではないかと心配です。したがって、各条件を 1,2,3 と呼ぶので、これは条件 1&2 または 3 を意味します。それとも、この人の条件は1&(2-OR-3)ですか?たとえば、グループ化したいビットの周りに括弧を入れて、数学のようにあいまいさを取り除く方法はありますか?正しいアプローチは何ですか?

tmpfiles="$PWD/configs/*.tmp"
prev=
for basefile in $tmpfiles
do
while read line
do
    ## get old vlans and interfaces
    for i in "${oldvlans[@]}"
    do
        if ([ ! -z "${prev}" ] && [ "$line" = "switchport access vlan $i" ]);then
            line1="${prev}"
            line2="${line}"
            echo "${line1}"
            echo "${line2}"
        fi
    done
    ### check for lines with "trunk allowed vlans" on and do a no trunk allowed vlan on them
    regex="switchport trunk allowed vlan*"
    if [ ! -z "${prev}" ] && [[ $line =~ $regex ]];then
        line1="${prev}"
        line2="${line}"
        echo "${line1}"
        echo "no ${line2}"
    fi

    prev="${line}"
done < "$basefile" > "$basefile.done"

編集:Stephenは()がテスト条件のグループ化には機能しないと言って、私は彼/彼女が間違っていることを証明したと信じていたので、ロジックを把握するために以下のいくつかのテストを行いました。

$ var1=sumit ; [ -z "var1" ] && ([ "$var1" = "sxxt" ] || [ "$var1" = "sumit" ]);  echo $?
1
$ var1=sumit ; [ -n "var1" ] && ([ "$var1" = "sxxt" ] || [ "$var1" = "sumit" ]);  echo $?
0

だから私はこれが私が望む場所をテストする正しい方法だと思います。

If [condition1] AND if ([condition 2] OR [condition 3] are true). 

しかし、私はその問題に苦しんでおり、それを明確にしようとしなければなりません。

ベストアンサー1

Bashで必要な操作を実行する最もきれいな方法は、[[ ]]より制限された構成ではなく構成を使用[ ]して条件を組み合わせることです。

if [ ! -z "${prev}" ] && [[ "$line" = "switchport access vlan $i" || "$line" =~ $regex ]];then

効果は期待どおりです。

$ var1=sumit; [ -z "var1" ] && [[ "$var1" = "sxxt" || "$var1" = "sumit" ]]; echo $?
1
$ var1=sumit; [ -n "var1" ] && [[ "$var1" = "sxxt" || "$var1" = "sumit" ]]; echo $?
0

これで、実際に( )サブシェルで実行されているテストを乱用して結果を調べることができますが、これは見苦しく、複雑で不要です。このパスを引き続き使用するには、少なくとも次のようにサブシェルおよび{ }グループコマンドを使用しないでください。

$ var1=sumit; [ -z "var1" ] && { [ "$var1" = "sxxt" ] || [ "$var1" = "sumit" ] ;}; echo $?
1
$ var1=sumit; [ -n "var1" ] && { [ "$var1" = "sxxt" ] || [ "$var1" = "sumit" ] ;}; echo $?
0

ただし、実際にbashを使用している場合[[ ]]POSIXシェルを使用している場合は、次のものを使用できます-o

$ var1=sumit; [ -z "var1" ] && [ "$var1" = "sxxt" -o  "$var1" = "sumit" ] ; echo $?
1
$ var1=sumit; [ -n "var1" ] && [ "$var1" = "sxxt" -o  "$var1" = "sumit" ] ; echo $?
0

おすすめ記事