我正试图在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]}
问题原来是我的打字错误。我使用~=而不是=~作为正则表达式运算符,并误解了诊断。