我正在尝试在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似乎不满意。谁能说我应该怎么做?
答案 0 :(得分:2)
似乎有错字(ssh_keys
,然后是ssh-keys
)
您在正则表达式中使用了不正确的字符类:它可能类似于
^([[:alnum:]]+)([[:blank:]]|#|$)
要遍历数组元素,请使用
for i in "${sshkeys[@]}"
要与正则表达式进行比较的运算符是=~
,而不是~=
该模式必须在=~
后用取消引用,否则它将被解释为文字字符串
您不能在多个条件下执行此操作:
[[ [ cond1 ] && [ cond2 ] ]]
但必须使用此:
[[ cond1 ]] && [[ cond2 ]]
或者这个:
[[ cond1 && cond2 ]]
根据需要加上括号
数组元素访问必须如下所示:
${BASH_REMATCH[1]}
答案 1 :(得分:-1)
这个问题原来是我的错字。我使用〜=代替=〜作为正则表达式运算符,并误解了诊断信息。