尝试检查字符串值是否不是两个不同数组的成员。如果字符串值在任何一个中都不存在,那么我需要执行一条语句。我能够使用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"
答案 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