在while循环中检查单引号的BASH字符串?

Kei*_*ron 2 bash

希望检查字符串是否不包含以下语法中的单引号,'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”进行测试不会导致进入循环。当单引号起作用时,我应该如何测试格式错误的用户字符串?

Eta*_*ner 5

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

如果你运行[[ "$projects" =~ *"\'" ]]; echo $?你会看到你得到一个 2 的返回码(这意味着模式错误)。你明白这一点是因为你不能用*.

你也并不需要或想逃避单引号的双引号字符串(因为你不想字面\'你只是想单引号)。

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

所以你要么想要

[[ "$projects" = *"'"* ]]
Run Code Online (Sandbox Code Playgroud)

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

或者你想要

[[ "$projects" =~ "'" ]]
Run Code Online (Sandbox Code Playgroud)

对于此测试的正则表达式版本(再次替代\')。

  • `=~` 进行子字符串匹配,所以 `=~ \'` 可以正常工作 (2认同)