要查看字符串是否包含以下语法中的单引号,' text' (虽然它也可以是&text;' text' text',' text')但是还没有能够正确地转义引号以允许打开一个循环。 代码:
while [[ -z "$projects" ]] || [[ "$projects" =~ *"\'" ]]; do
<reprompt user, read var, and reset variable>
done
以上是我梦寐以求的最好成绩,但它只是寻找一个结局,并且在使用&#34; a&#34;进行测试时甚至无法正常工作。不会导致进入循环。当单引号发挥作用时,我应该如何测试格式错误的用户字符串?
答案 0 :(得分:4)
=~
运算符的右侧是正则表达式而不是glob / pattern。
如果您运行[[ "$projects" =~ *"\'" ]]; echo $?
,您将看到返回代码为2(表示模式错误)。你得到了,因为你不能用*
开始正则表达式。
您也不需要或想要转义双引号字符串中的单引号 (因为您不希望文字\'
只需要单引号)。
您的模式仅匹配尾随单引号,因为您只允许在字符串的开头匹配通配符。您可以通过将*
(或正则表达式运算符的.*
)添加到模式的末尾来解决此问题。
所以你想要
[[ "$projects" = *"'"* ]]
用于此测试的模式匹配版本(或*\'*
)。
或者你想要
[[ "$projects" =~ "'" ]]
用于此测试的正则表达式版本(另外,也可以是\'
)。
答案 1 :(得分:2)
看起来我最终需要的是:
while [[ "$projects" != "'"?*"'" ]];do
这将捕获空值并确保单引号之间至少有一个字符。