条件表达式中正则表达式的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似乎对复杂条件表达式中的正则表达式测试不满意。有人能说我应该怎么做吗?

  • 似乎有一个打字错误(ssh_keys,但随后是ssh-keys(

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

    ^([[:alnum:]]+)([[:blank:]]|#|$)
    
  • 要在数组元素上循环,请使用

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

  • 该模式必须在=~之后不加引号,或者它被解释为文字字符串

  • 你不能在多种情况下这样做:

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

    但必须使用这个:

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

    或者这个:

    [[ cond1 && cond2 ]]
    

    根据需要使用括号

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

    ${BASH_REMATCH[1]}
    

问题原来是我的打字错误。我使用~=而不是=~作为正则表达式运算符,并误解了诊断。

最新更新