Shell脚本Bash,检查字符串是否以单引号开头和结尾

时间:2016-10-29 09:01:48

标签: bash shell

例如,我需要检查字符串是否以单引号开头和结尾 '我的名字是莫扎特'

我拥有的是这个,它不起作用

if [[ $TEXT == '*' ]] ;

这不起作用

if [[ $TEXT == /'*/' ]] ;

但如果我将其改为

if [[ $TEXT == a*a ]] ;

它适用于像一个惊人的apa'这样的句子。所以我相信它与单引号有关。

关于如何解决它的任何想法?

3 个答案:

答案 0 :(得分:8)

使用regex

if [[ $TEXT =~ ^\'.*\'$ ]]

使用globbing

if [[ $TEXT == \'*\' ]]

答案 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的限制(嵌入式变量引用的扩展,算术和命令替换;在手头的情况下没有,但是),所以知道何时使用"..."(文字字符串)与'...'(插值字符串)非常重要。
    • 在类似POSIX的shell中实际上根本不支持在"..."字符串中嵌入'个实例,但在Bash,Ksh和Zsh中,还有另一种字符串类型允许您这样做:{{ 3}},'...',您可以将$'...'转换为'\'
    • 另一个选择是使用字符串连接:在类似POSIX的shell中,您可以使用不同的引用样式(包括不带引号的标记)直接将子字符串放在彼此旁边为了形成一个字符串:$'\'My name is Mozart\''还会为您提供一个包含内容 "'"'My Name is Mozart'"'"的字符串。
      类似POSIX的shell还允许您使用'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