매개변수의 모든 값을 식별하는 방법 -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"))