我想删除字符串的最后一个字符,我尝试了这个小脚本:
#! /bin/sh
t="lkj"
t=${t:-2}
echo $t
但它打印“lkj”,我做错了什么?
答案1
使用bash
4.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 。要通过参数扩展修剪单个字符,您可能需要的语法是t
t
2
${t%?}
注意ksh93
, bash
or 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
在某些实现中),它还将返回非零退出状态。如果字符串包含无效字符,也可能会产生意外结果。