例如,我需要检查字符串是否以单引号开头和结尾 '我的名字是莫扎特'
我拥有的是这个,它不起作用
if [[ $TEXT == '*' ]] ;
这不起作用
if [[ $TEXT == /'*/' ]] ;
但如果我将其改为
if [[ $TEXT == a*a ]] ;
它适用于像一个惊人的apa'这样的句子。所以我相信它与单引号有关。
关于如何解决它的任何想法?
答案 0 :(得分:8)
答案 1 :(得分:6)
我正在编写完整的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
将上述脚本另存为
matchCode.sh
现在将其运行为:
./matchCode
输出:
text1 not match
text2 match
问你是否有任何困惑。
答案 2 :(得分:3)
Cyrus' helpful answer解决了您发布的问题。。
但是,我怀疑您可能会对部分shell语法的引号感到困惑,而实际上部分字符串的引号 :
在类似POSIX的shell(例如Bash)中,'My name is Mozart'
是一个单引号字符串,其内容为文字My name is Mozart
- ,不含封闭的{{ 1}}。也就是说,封闭的'
字符是语法元素,它告诉shell 之间的所有是文字内容字符串。
相比之下,要创建一个内容实际包含在'
中的字符串 - 即具有嵌入式 '
实例,你必须使用像'
这样的东西。现在,封闭的"'My name is Mozart'"
实例是语法元素,它们包含了字符串内容。
"
字符串(双引号)会使内容受string interpolation的限制(嵌入式变量引用的扩展,算术和命令替换;在手头的情况下没有,但是),所以知道何时使用"..."
(文字字符串)与'...'
(插值字符串)非常重要。"..."
字符串中嵌入'
个实例,但在Bash,Ksh和Zsh中,还有另一种字符串类型允许您这样做:{{ 3}},'...'
,您可以将$'...'
转换为'
:\'
$'\'My name is Mozart\''
还会为您提供一个包含内容 "'"'My Name is Mozart'"'"
的字符串。'My Name is Mozart'
转义单个,不带引号的字符(意思是:既不是单引号也不是双引号字符串的一部分);因此,\
产生相同的结果。 Bash的\''My name is Mozart'\'
运算符在==
(条件)中的行为可能会增加混乱:
如果RHS(右侧 - 操作员[[ ... ]]
右侧的操作数)引用,Bash会将其视为 literal ;只有未加引号的字符串(或变量引用)被视为(类似于glob)模式:
==
匹配 literal '*'
,而*
(未引用!)匹配任何字符序列,包括无。
因此:
*
只会匹配单个字面字符[[ $TEXT == '*' ]]
。
*
,因为它为转义字符错误[[ $TEXT == /'*/' ]]
- 实际上是/
- 只会匹配 literal {{1} (\
实际上是不带引号的/*/
和单引号文字/'*/'
)的串联。
/
由于使用未加引号的 RHS,是实际执行模式匹配的唯一变体:任何以{{{}开头的字符串1}}和*/
结尾,包括[[ $TEXT == a*a ]]
(因为不带引号的a
代表任何字符序列)。
要验证Cyrus的命令是否与 content 包含在(嵌入式)单引号中的字符串一起使用,请尝试这些命令,这些命令在Bash,Ksh和Zsh上都应输出{{ 1}}。
a