パラメータのすべての値を識別する方法 -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"))