我需要检查字符串是否以单引号开头和结尾,例如"我的名字是莫扎特"
我拥有的是这个,但是没有用
if [[ $TEXT == '*' ]] ;
Run Code Online (Sandbox Code Playgroud)
这也不起作用
if [[ $TEXT == /'*/' ]] ;
Run Code Online (Sandbox Code Playgroud)
但如果我把它改成
if [[ $TEXT == a*a ]] ;
Run Code Online (Sandbox Code Playgroud)
它适用于像'a amazing apa'这样的句子.所以我相信它与单引号有关.
关于如何解决它的任何想法?
用正则表达式:
if [[ $TEXT =~ ^\'.*\'$ ]]
Run Code Online (Sandbox Code Playgroud)
使用globbing:
if [[ $TEXT == \'*\' ]]
Run Code Online (Sandbox Code Playgroud)
我正在编写完整的bash脚本,所以你不会有任何困惑:
#! /bin/bash
text1="'helo there"
if [[ $text1 =~ ^\'.*\'$ ]]; then
echo "text1 match"
else
echo "text1 not match"
fi
text2="'hello babe'"
if [[ $text2 =~ ^\'.*\'$ ]]; then
echo "text2 match"
else
echo "text2 not match"
fi
Run Code Online (Sandbox Code Playgroud)
将上面的脚本另存为
matchCode.sh
现在运行它:
./matchCode
输出:
text1 not match
text2 match
Run Code Online (Sandbox Code Playgroud)
问你是否有任何困惑.
赛勒斯的有用答案解决了您发布的问题。
但是,我怀疑您可能会对属于 shell 语法的引号与实际上属于字符串的引号感到困惑:
在类似 POSIX 的 shell(例如 Bash)中,'My name is Mozart'是一个单引号字符串,其内容是文字My name is Mozart-没有封闭的'. 也就是说,包围 '字符是一个语法元素,它告诉 shell它们之间的所有内容都是字符串的文字内容。
相比之下,要创建一个其内容实际上包含在其中的字符串'- 即具有嵌入的 '实例,您必须使用类似: 的字符串"'My name is Mozart'"。现在,封闭"实例是字符串内容的语法元素。
"..."字符串(双引号)会使内容受到字符串插值的影响(嵌入变量引用的扩展、算术和命令替换;但是,在当前的情况下没有),因此了解何时使用'...'(文字字符串)与"..."(内插字符串)。'实例'...',但在 Bash、Ksh 和 Zsh 中,还有另一种字符串类型允许您执行此操作:ANSI C 引号字符串, $'...',您可以在其中嵌入'转义为\':$'\'My name is Mozart\''"'"'My Name is Mozart'"'"的字符串。
类似 POSIX 的 shell 还允许您使用 ;转义单个不带引号的字符(意思是:既不是单引号字符串的一部分,也不是双引号字符串的一部分)。因此,产生相同的结果。 'My Name is Mozart'\\''My name is Mozart'\'Bash运算符(条件)==内部[[ ... ]]的行为可能会增加混乱:
如果 RHS(右侧 - 运算符右侧的操作数==)被引用,Bash 将其视为文字;只有不带引号的字符串(或变量引用)被视为(类似 glob)模式:
'*'匹配Literal *,而*(unquoted!) 匹配任何字符序列,包括无。
因此:
[[ $TEXT == '*' ]]只会匹配单个文字字符*。
[[ $TEXT == /'*/' ]],因为它错误地/认为转义字符 - 实际上是\- 只会匹配文字 /*/(实际上是不带引号和单引号文字/'*/'的串联)。/*/
[[ $TEXT == a*a ]],由于使用不带引号的RHS,是实际执行模式匹配的唯一变体:匹配以 开头a和结尾的任何字符串,包括(因为不带引号表示任何字符序列)。aaa*
要验证 Cyrus 的命令是否适用于内容包含在(嵌入的)单引号中的字符串,请尝试这些命令,这些命令 - 在 Bash、Ksh 和 Zsh 上 - 都应该输出yes.
[[ "'ab'" == \'*\' ]] && echo yes # pattern matching, indiv. escaped ' chars.
[[ "'ab'" =~ ^\'.*\'$ ]] && echo yes # regex operator =~
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14306 次 |
| 最近记录: |