数组中的值存在pt.2

时间:2018-04-09 08:37:02

标签: arrays bash

让我们有一个数组:

echo $run
CEADAPST CENIPT CEDAMT CEODST +ASM CEREMAFT 

让我们看一下数组中是否存在某些值(第二个和第四个值是正确的但是找不到它们):

for dbname in CEREMAF CEREMAFT CEREMAFg +ASM; do if [[ " ${run[@]} " =~ " ${dbname} " ]]; then echo "you're golden!"; else echo "nope"; fi; done
nope
nope
nope
nope

让我们删除空间扩展,整个想法是为了避免使用类似的单词而只是为了完全匹配:

for dbname in CEREMAF CEREMAFT CEREMAFg +ASM; do if [[ ${run[@]} =~ ${dbname} ]]; then echo "you're golden!"; else echo "nope"; fi; done
you're golden!
you're golden!
nope
nope

我们确实在最后一种情况下获得了一些匹配但第一次匹配是错误的正确(只是类似因为我们删除了空间扩展)而第四次仍未找到(可能是因为加号)。我明显误解了我在这里找到的概念,但是我无法让它工作和男人,我试过......为什么它不起作用?

2 个答案:

答案 0 :(得分:1)

尝试

for dbname in (whatever) \\+ASM; do ...
                         ^^

注意添加双斜杠。

来自help [[

  

当`=〜'使用运算符,运算符右侧的字符串匹配为正则表达式

那么正则表达式+ASM是什么意思?不,它格格不入。逃避加号,它就可以了。

答案 1 :(得分:1)

使用此函数来处理它,它使用namereferening和两个嵌套迭代来获得您想要的结果

run=( CEADAPST CENIPT CEDAMT CEODST +ASM CEREMAFT );

arrayIn() {
    local value=$1;
    local -n array=$2;

    local found=0;

    for val in "${array[@]}";do
        [[ "$val" != "$value" ]] && {
            found=0;
        } || {
            found=1;
            break;
        }
    done

    (( found == 0 )) && return 1;
    return 0;
}

for dbname in CEREMAF CEREMAFT CEREMAFg +ASM;do
    arrayIn $dbname run
    (( $? == 0 )) && { echo "yes"; } || echo "nope"
done

namereferencing