在 shell 脚本中使用字符串操作删除字符串的最后一个字符

在 shell 脚本中使用字符串操作删除字符串的最后一个字符

我想删除字符串的最后一个字符,我尝试了这个小脚本:

#! /bin/sh 

t="lkj"
t=${t:-2}
echo $t

但它打印“lkj”,我做错了什么?

答案1

使用bash4.2 及更高版本,您可以执行以下操作:

${var::-1}

例子:

$ a=123
$ echo "${a::-1}"
12

请注意,对于较旧的版本bash(例如,bash 3.2.5在 OS X 上),您应该在冒号之间和之后保留空格:

${var: : -1}

答案2

在 POSIX shell 中,语法的含义有所不同 - 它扩展为if is set 且非 null${t:-2}的值,否则扩展为 value 。要通过参数扩展修剪单个字符,您可能需要的语法是tt2${t%?}

注意ksh93, bashor zsh, ${t:(-2)}or ${t: -2}(注意空格)作为子字符串扩展是合法的,但可能不是您想要的,因为它们返回从末尾 2 个字符的位置开始的子字符串(即它删除了第一的i字符串的字符ijk)。

有关详细信息,请参阅 Bash 参考手册的 Shell 参数扩展部分:

答案3

使用 sed 它应该和

sed 's/.$//'

你单身回声就是那么echo ljk | sed 's/.$//'
使用此功能,1 行字符串可以是任意大小。

答案4

根据外壳的一些选项:

  • POSIX:t=${t%?}
  • 伯恩:t=`expr " $t" : ' \(.*\).'`
  • 兹什/亚什:t=${t[1,-2]}
  • bash/zsh:t=${t:0:-1}
  • ksh93/bash/zsh/mksh:t=${t:0:${#t}-1}
  • ksh93/bash/zsh/mksh:t=${t/%?}
  • ksh93:t=${t/~(E).$/}
  • es:@ {t=$1} ~~ $t *?

请注意,虽然所有的都应该去掉最后一个特点,你会发现一些实现(那些不支持多字节字符的实现)会去掉最后一个字节相反(如果最后一个字符是多字节,则可能会损坏它)。

expr变体假设$t不以多个换行符结尾。如果结果字符串最终为0(或者000甚至-0在某些实现中),它还将返回非零退出状态。如果字符串包含无效字符,也可能会产生意外结果。

相关内容