如何识别参数中的所有值 -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"))