【问题标题】:How can I check the last character in a string in bash?如何在bash中检查字符串中的最后一个字符?
【发布时间】:2013-10-16 19:23:19
【问题描述】:

我需要确保字符串中的最后一个字符是/

x="test.com/"

if [[ $x =~ //$/ ]] ; then
        x=$x"extention"
else
        x=$x"/extention"
fi

目前,false 总是触发。

【问题讨论】:

    标签: regex bash shell command-line


    【解决方案1】:

    您通常可以使用 bash 子字符串 $(string:offset:length} 执行此操作 - length 是可选的

    #x是x的长度

    因此

    $n = 1       # 1 character
    last_char = ${x:${#x} - $n}
    

    供以后参考,

    $ man bash
    

    拥有所有的魔力

    ${参数:偏移量:长度}

    子字符串扩展。扩展到参数的最大长度字符 从 offset 指定的字符开始。如果长度是 省略,展开为参数的子字符串,从 由偏移量指定的字符。长度和偏移量是算术的 表达式...

    【讨论】:

      【解决方案2】:

      您可以在 Bash 中使用 ${var:index}${#var} 索引字符串以获取字符串的长度。负索引表示从字符串的末尾移动到开头,以便-1 是最后一个字符的索引:

      if [[ "${x:${#x}-1}" == "/" ]]; then
          # last character of x is /
      fi
      

      【讨论】:

      • 允许使用负索引,但您需要一个空格来区分子字符串扩展和默认值扩展:${x: -1}。您实际上并没有使用负索引,而是计算的正索引。
      【解决方案3】:

      您的情况有点不正确。当使用=~ 时,rhs 被认为是一种模式,所以你会说pattern 而不是/pattern/

      如果你说,你会得到预期的结果

      if [[ $x =~ /$ ]] ; then
      

      而不是

      if [[ $x =~ //$/ ]] ; then
      

      【讨论】:

        【解决方案4】:

        像这样,例如:

        $ x="test.com/"
        $ [[ "$x" == */ ]] && echo "yes"
        yes
        
        $ x="test.com"
        $ [[ "$x" == */ ]] && echo "yes"
        $ 
        
        $ x="test.c/om"
        $ [[ "$x" == */ ]] && echo "yes"
        $ 
        
        $ x="test.c/om/"
        $ [[ "$x" == */ ]] && echo "yes"
        yes
        
        $ x="test.c//om/"
        $ [[ "$x" == */ ]] && echo "yes"
        yes
        

        【讨论】:

        • 太棒了。星星代表什么?如果 x 有多个 /,这会得到误报吗?
        • @MildFuzz 星号 * 表示“任何字符”。所以你也可以做[[ "$x" == *m/ ]] && echo "yes",在这种情况下会说是,但不是在x="test.comp/", for example. For multiple /` 也可以,请查看我更新的示例。
        猜你喜欢
        • 1970-01-01
        • 2017-10-30
        • 2017-05-24
        • 2013-08-31
        • 2013-11-26
        • 2022-10-13
        • 2013-11-20
        • 2014-06-19
        相关资源
        最近更新 更多