bash +単語が値のリストにあるかどうかを確認する方法

bash +単語が値のリストにあるかどうかを確認する方法

パラメータのすべての値を識別する方法 -var_general存在するvar_get

例えば

var_general="sdb sdc sdd sde sdf sdg"
var_get="sdb sdc sdd sde sdf sdg sdh sdi"

この例では定常状態になります。

他の例

var_general="sdb sdj sdd sde sdf sdg"
var_get="sdb sdc sdd sde sdf sdg sdh sdi"

ステータスは失敗としてマークされます(sdjがvar_getにないため)。

答え1

bash+comm+tr解決策:

var_general="sdb sdc sdd sde sdf sdg"
var_get="sdb sdc sdd sde sdf sdg sdh sdi"

if [[ $(comm -23 <(tr ' ' '\n' <<<"$var_general" | sort) <(tr ' ' '\n' <<<"$var_get" | sort)) ]]; then 
    echo "status: Fail"
else 
    echo "status: Ok"
fi

  • tr ' ' '\n' <<<"$var_general"- スペースを改行/改行に変換
  • comm -23 FILE1 FILE2- ファイルを比較し、一意の行を印刷しますFILE1。ファイルにFILE1一意のエントリが含まれていない場合は、ファイルのサブセットとして許可されます。FILE2

答え2

この機能は、このタスクを実行するためにテストで機能しています。

are_in () {
    local match_list="$1"
    local compare_list="$2"
    until [[ -z "$match_list" ]]; do
        if ( grep -q  "$(awk '{print $1}' <<<"$match_list")" <<<"$compare_list" ); then
            match_list="$(awk '{$1=""; print $0}' <<<"$match_list")"
        else
            echo "Fail" && return 1
        fi
    done
    echo "Okay" && return 0
}

使用:

$ var_general="sdb sdc sdd sde sdf sdg"
$ var_get="sdb sdc sdd sde sdf sdg sdh sdi"
$ are_in "$var_general" "$var_get"; echo $?
Okay
0
$ var_general="sdb sdj sdd sde sdf sdg"
$ var_get="sdb sdc sdd sde sdf sdg sdh sdi"
$ are_in "$var_general" "$var_get"; echo $?
Fail
1

その機能がない場合は、本質的に次のようになります。

t_var="$var_general"
until [[ -z "$t_var" ]]; do
    if ( grep -q  "$(awk '{print $1}' <<<"$t_var")" <<<"$var_get" ); then
        t_var="$(awk '{$1=""; print $0}' <<<"$t_var")"
    else
        echo "Fail" && return 1
    fi
done

答え3

awkを使う

awk -v b="ok" -v RS=' |\n' 'NR==FNR{a[$0];next}!($0 in a){b="ko";exit}END{print b}' <(echo $var_get)  <(echo $var_general)

答え4

安全でない方法(変数が参照されないため)

comm -23 <(sort <(printf "%s\n" $var_general)) <(sort <(printf "%s\n" $var_get))

より安全な方法

comm -23 <(sort <(xargs -n1 <<< "$var_general")) <(sort <(xargs -n1 <<< "$var_get"))

関連情報