【问题标题】:Performing string comparison with carriage return in bash在bash中使用回车执行字符串比较
【发布时间】:2013-12-21 03:18:30
【问题描述】:

为什么以下代码在 bash 中失败?请注意,我正在尝试执行更复杂的比较,例如“somestring\r”;这只是一个简化的例子。

我可以确认回车“ascii 13”正在进入脚本。但我无法将其与常规字符串比较进行比较。

对于肯定匹配,预期结果为“1”。

命令行:

echo -e "\r" | ./test.sh

脚本:

ord() {
   printf '%d' "'$1"
}

read a
echo "1st char: $(ord ${a:0:1})"

left="${a:0:1}"

if [ "$left" = "\r" ]; then
   echo 1
fi

exit 0

【问题讨论】:

    标签: string bash shell sh


    【解决方案1】:

    以下将说明如何确定字符串是否包含回车:

    read a
    if [[ $a =~ $'\r' ]]; then
      echo 1;
    fi
    

    通过说执行它:

    echo -e "something\r" | bash foo
    

    会回来

    1
    

    编辑:如果你想知道字符串的最后一个字符是否包含回车,你可以说:

    if [[ ${a: -1} = $'\r' ]]; then
      echo 1;
    fi
    

    【讨论】:

    • 一个很好的尝试,但我想要的是对子字符串执行完全匹配的比较。
    • 只需将=~ 替换为=$'...' 语法对于正则表达式匹配并不特殊;它只是构造字符串的一种方式,其中某些转义字符具有特殊含义。
    • @Zhro chepner 已经在评论中提到。但是,请参阅上面的编辑。
    • 谢谢你,chepner,这似乎有效。为了确认,如果我还想包含 bash 变量扩展,我必须像这样构造它:"test"$'\r' 以匹配 test\r,对吗?我现在想起了“$”的语法,但我很少使用它,以至于忘记了!
    猜你喜欢
    • 2015-08-30
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多