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

标签 bash

正在检查字符串是否不包含以下语法中的单引号,'text'(尽管它也可能是'text','text','text')但未能转义正确引用以允许打开 while 循环。 代码:

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

上面是我想象的最好的,但它只寻找结尾的 ',甚至不能正常工作,因为用“a”测试不会导致进入循环。当单引号起作用时,我应该如何测试格式错误的用户字符串?

最佳答案

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

如果你运行 [[ "$projects"=~ *"\'"]]; echo $? 你会看到你得到一个返回代码 2(这意味着模式错误)。你得到它是因为你不能用 * 开始正则表达式。

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

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

所以你要么想要

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

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

或者你想要

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

对于此测试的正则表达式版本(同样是 \')。

关于bash - 检查 while 循环中的 BASH 字符串是否有单引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31237094/

相关文章:

bash - 参数内的主目录扩展 (~)

linux - 以普通用户身份执行程序(同时是 root)

linux - 使用 bash 脚本从文件中读取行

Bash 无意中分割命令

bash - 如何测试 rm 的 GNU 或 BSD 版本?

android - [Android]如何将进程号传递给cmd line "adb shell kill "

linux - 从 shell 脚本解析文件中的键/值的代码

linux - 如何获取此内容中的所有 ipv4 地址

bash - 使用 sed 取消注释代码

Linux Bash 如何在需要从标准输入/文件输入的程序上使用 xargs?