希望检查字符串是否不包含以下语法中的单引号,'text'(尽管它也可能是 'text','text','text')但无法正确转义引号允许打开一个while循环。代码:
while [[ -z "$projects" ]] || [[ "$projects" =~ *"\'" ]]; do
<reprompt user, read var, and reset variable>
done
Run Code Online (Sandbox Code Playgroud)
以上是我梦寐以求的最好的,但它只寻找结尾 ',甚至不能正常工作,因为使用“a”进行测试不会导致进入循环。当单引号起作用时,我应该如何测试格式错误的用户字符串?
=~运算符的右侧是正则表达式,而不是 glob/pattern。
如果你运行[[ "$projects" =~ *"\'" ]]; echo $?你会看到你得到一个 2 的返回码(这意味着模式错误)。你明白这一点是因为你不能用*.
你也并不需要或想逃避单引号内的双引号字符串(因为你不想字面\'你只是想单引号)。
您的模式仅匹配尾随单引号,因为您只允许在字符串开头使用通配符匹配。您也可以通过在模式末尾添加*(或.*为正则表达式运算符)来解决这个问题。
所以你要么想要
[[ "$projects" = *"'"* ]]
Run Code Online (Sandbox Code Playgroud)
对于此测试的模式匹配版本(或者*\'*)。
或者你想要
[[ "$projects" =~ "'" ]]
Run Code Online (Sandbox Code Playgroud)
对于此测试的正则表达式版本(再次替代\')。