Bash

bash + 如何驗證單詞是否在值列表中

  • April 12, 2018

如何辨識參數中的所有值 - var_general都在var_get

例如

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

根據此範例將獲得狀態 ok

另一個例子

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

我們將獲得狀態失敗(因為 sdj 不在 var_get 中)

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

此功能在我的測試中工作以完成此操作:

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

引用自:https://unix.stackexchange.com/questions/413118