条件表达式中的正则表达式的Bash问题

时间:2020-09-04 14:26:15

标签: regex bash

我正在尝试在Bash条件表达式中使用正则表达式,而Bash不喜欢我的语法。代码如下:

    declare -a sshkeys
    declare sshpath="$HOME/.ssh"
    if [[ -f "$sshpath/ssh_keys" ]]; then
        mapfile -t sshkeys <"$sshpath/ssh-keys"
    fi
    declare pattern="^(:alnum::alnum:*)(:blank:|#|$)"
    for i in {"$sshkeys[@]"}
    do
        if [[ [ "$i" ~= "$pattern" ] && [ -e "$sshpath/$BASH_REMATCH[1]" ] ]]; then
            ssh-add "$sshpath/$BASH_REMATCH[1]" </dev/null 1>&-
        fi
    done

Bash产生以下错误消息:

source .profile
bash: .profile: line 49: conditional binary operator expected
bash: .profile: line 49: syntax error near `"$i"'
bash: .profile: line 49: `        if [[ [ "$i" ~= "$pattern" ] && [ -e "$sshpath/$BASH_REMATCH[1]" ] ]]; then'

对于复杂的条件表达式中的正则表达式测试,Bash似乎不满意。谁能说我应该怎么做?

2 个答案:

答案 0 :(得分:2)

  • 似乎有错字(ssh_keys,然后是ssh-keys

  • 您在正则表达式中使用了不正确的字符类:它可能类似于

    ^([[:alnum:]]+)([[:blank:]]|#|$)
    
  • 要遍历数组元素,请使用

    for i in "${sshkeys[@]}"
    
  • 要与正则表达式进行比较的运算符是=~,而不是~=

  • 该模式必须在=~后用取消引用,否则它将被解释为文字字符串

  • 您不能在多个条件下执行此操作:

    [[ [ cond1 ] && [ cond2 ] ]]
    

    但必须使用此:

    [[ cond1 ]] && [[ cond2 ]]
    

    或者这个:

    [[ cond1 && cond2 ]]
    

    根据需要加上括号

  • 数组元素访问必须如下所示:

    ${BASH_REMATCH[1]}
    

答案 1 :(得分:-1)

这个问题原来是我的错字。我使用〜=代替=〜作为正则表达式运算符,并误解了诊断信息。