bash + 如何验证单词是否在值列表中

bash + 如何验证单词是否在值列表中

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

相关内容