检查while循环中的BASH字符串是否有单引号?

时间:2015-07-06 02:42:00

标签: bash

要查看字符串是否包含以下语法中的单引号,' text' (虽然它也可以是&text;' text' text',' text')但是还没有能够正确地转义引号以允许打开一个循环。 代码:

while [[ -z "$projects" ]] || [[ "$projects" =~ *"\'" ]]; do
    <reprompt user, read var, and reset variable>
done

以上是我梦寐以求的最好成绩,但它只是寻找一个结局,并且在使用&#34; a&#34;进行测试时甚至无法正常工作。不会导致进入循环。当单引号发挥作用时,我应该如何测试格式错误的用户字符串?

2 个答案:

答案 0 :(得分:4)

=~运算符的右侧是正则表达式而不是glob / pattern。

如果您运行[[ "$projects" =~ *"\'" ]]; echo $?,您将看到返回代码为2(表示模式错误)。你得到了,因为你不能用*开始正则表达式。

您也不需要或想要转义双引号字符串中的单引号 (因为您不希望文字\'只需要单引号)。

您的模式仅匹配尾随单引号,因为您只允许在字符串的开头匹配通配符。您可以通过将*(或正则表达式运算符的.*)添加到模式的末尾来解决此问题。

所以你想要

[[ "$projects" = *"'"* ]]

用于此测试的模式匹配版本(或*\'*)。

或者你想要

[[ "$projects" =~ "'" ]]

用于此测试的正则表达式版本(另外,也可以是\')。

答案 1 :(得分:2)

看起来我最终需要的是:

while [[ "$projects" != "'"?*"'" ]];do

这将捕获空值并确保单引号之间至少有一个字符。