检查一个字符串是否不存在于多个数组中
Check if a string does not exist in multiple arrays
正在尝试检查字符串值是否不是两个不同数组的成员。如果其中任何一个都不存在字符串值,那么我需要执行一条语句。我能够用 if 语句来完成....
if [[ $REQ_FIELDS_LIST != *"$XFR_FIELD"* && $NON_INPUT_FIELDS_LIST != *"$XFR_FIELD"* ]];then
但是星号导致子字符串 return 误报。不幸的是,删除“*”和 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"
例如,您可以这样迭代:
#!/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
手动迭代次级循环,然后"Flag"它们无效。
末尾的 if 语句检查是否匹配了任一值,如果匹配则进入下一个主迭代。
输出:
four
five
有效的方法是使用 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
退出。
你可以检查一个元素是否在一个数组中,像这样,没有循环并且不受元素中空格的影响
#! /bin/bash
function elem_in_array() {
local e=""
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
正在尝试检查字符串值是否不是两个不同数组的成员。如果其中任何一个都不存在字符串值,那么我需要执行一条语句。我能够用 if 语句来完成....
if [[ $REQ_FIELDS_LIST != *"$XFR_FIELD"* && $NON_INPUT_FIELDS_LIST != *"$XFR_FIELD"* ]];then
但是星号导致子字符串 return 误报。不幸的是,删除“*”和 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"
例如,您可以这样迭代:
#!/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
手动迭代次级循环,然后"Flag"它们无效。
末尾的 if 语句检查是否匹配了任一值,如果匹配则进入下一个主迭代。
输出:
four
five
有效的方法是使用 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
退出。
你可以检查一个元素是否在一个数组中,像这样,没有循环并且不受元素中空格的影响
#! /bin/bash
function elem_in_array() {
local e=""
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