检查字符串是否在多个数组中不存在

时间:2019-01-17 16:04:21

标签: bash shell ksh

尝试检查字符串值是否不是两个不同数组的成员。如果字符串值在任何一个中都不存在,那么我需要执行一条语句。我能够使用if语句来做到这一点。...

if [[ $REQ_FIELDS_LIST != *"$XFR_FIELD"* && $NON_INPUT_FIELDS_LIST != *"$XFR_FIELD"* ]];then

但是星号导致子字符串返回假阳性。不幸的是,删除“ *”和if语句根本不起作用。看来,检查此站点,在bash中唯一安全的方法是执行for循环。但是,对于两个不同的阵列,最有效的方法是什么。同样,字符串值是数组本身的成员。因此,我们已经遍历了一个数组。遍历字符串值数组,并针对每个字符串值检查该字符串是否不是其他两个数组的成员。如果是这样,请执行一条语句。

所以我需要...

for XFR_FIELD in $INPUT_FIELDS_LIST
do
    if XFR field is not a member of REQ_FIELDS_LIST AND is not a member of NON_INPUT_FIELDS_LIST then
        "return 0" 

3 个答案:

答案 0 :(得分:3)

有效的方法是使用bash 4.0的关联数组:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Requires bash 4.0+" >&2; exit 1;; esac

declare -A input_fields_list=( [one]=1 [two]=1 [three]=1 [four]=1 [five]=1 )
declare -A req_fields_list=( [one]=1 [six]=1 [seven]=1 [eight]=1 )
declare -A non_input_fields_list=( [two]=1 [three]=1 [seven]=1 [eight]=1 [nine]=1 )

for xfr in "${!input_fields_list[@]}"; do
  [[ ${req_fields_list[$xfr]} ]] && continue
  [[ ${non_input_fields_list[$xfr]} ]] && continue
  echo "$xfr not found" >&2
  exit 1
done

echo "All input fields are valid" >&2
exit 0

正如您在https://ideone.com/IhmVKy所看到的那样,此错误正确地以five not found退出。

答案 1 :(得分:1)

作为示例,您将像这样进行迭代:

#!/bin/bash

INPUT_FIELDS_LIST=( one two three four five)
REQ_FIELDS_LIST=( one six seven eight )
NON_INPUT_FIELDS_LIST=( two three seven eight nine )

for ifl in "${INPUT_FIELDS_LIST[@]}"
do

        for rfl in "${REQ_FIELDS_LIST[@]}"
        do
                myvar=0
                if [[ $ifl == "$rfl" ]]
                then myvar=1; break
                else continue
                fi
        done

        for nifl in "${NON_INPUT_FIELDS_LIST[@]}"
        do
                myvar2=0
                if [[ $ifl == "$nifl" ]]
                then myvar2=1; break
                else continue
                fi
        done

        if [[ $myvar == 1 ]] || [[ $myvar2 == 1 ]]
        then continue
        else echo "$ifl"
        fi

done

手动遍历辅助循环,然后将其“标记”为无效。

最后的if语句检查是否有一个值已匹配,如果有则继续进行下一个主迭代。

输出:

four
five

答案 2 :(得分:0)

您可以检查元素是否在具有这样的数组,没有循环且不受元素中的空格影响的情况中

#! /bin/bash
function elem_in_array() {
    local e="$1"
    shift
    local a=("$@")
    [[ $(printf '\x01%s\x01' "${a[@]}") =~ $(printf '\x01%s\x01' "$e") ]]
}

a1=(A B "C D" E F)
elem_in_array "A" "${a1[@]}" && echo Y || echo N
elem_in_array "B" "${a1[@]}" && echo Y || echo N
elem_in_array "C D" "${a1[@]}" && echo Y || echo N
elem_in_array "AB" "${a1[@]}" && echo Y || echo N