我写了以下几行来获取字符串的最后一个字符:
str=$1
i=$((${#str}-1))
echo ${str:$i:1}
适用于abcd/
:
$ bash last_ch.sh abcd/
/
不适用于abcd*
:
$ bash last_ch.sh abcd*
array.sh assign.sh date.sh dict.sh full_path.sh last_ch.sh
列出当前文件夹中的文件。
答案 0 :(得分:172)
根据@perreal,引用变量很重要,但是因为我在评论中找到了一个更简单的方法来解决这个问题,所以我读了这篇帖子5次......
str='abcd/'
echo "${str: -1}"
输出:/
str='abcd*'
echo "${str: -1}"
输出:*
感谢参与上述活动的所有人;我已经在整个帖子中恰当地添加了+ 1!
答案 1 :(得分:58)
这是您需要引用变量的原因之一:
echo "${str:$i:1}"
否则,bash会扩展变量,在这种情况下会在打印之前进行通配。最好将参数引用到脚本中(如果您有匹配的文件名):
sh lash_ch.sh 'abcde*'
另请参阅bash reference manual中的扩展顺序。在文件名扩展之前扩展变量。
答案 2 :(得分:25)
我知道这是一个非常古老的主题,但没有人提到我这是最干净的答案:
echo -n $str | tail -c 1
注意-n
只是因为回声最后不包含换行符。
答案 3 :(得分:5)
尝试:
myString.replace(/[a-zA-Z]+/g, '5');
例如:
5
答案 4 :(得分:4)
单行:
${str:${#str}-1:1}
现在:
echo "${str:${#str}-1:1}"
答案 5 :(得分:3)
到目前为止,每个答案都暗示问题中的“shell”一词等同于Bash。
这是在标准Bourne shell中如何做到的:
printf $str | tail -c 1
答案 6 :(得分:2)
使用awk脚本的另一种解决方案:
最后1个字符:
echo $str | awk '{print substr($0,length,1)}'
最后5个字符:
echo $str | awk '{print substr($0,length-5,5)}'
答案 7 :(得分:0)
expr $str : '.*\(.\)'
或
echo ${str: -1}
答案 8 :(得分:0)
对于portability
您可以说"${s#"${s%?}"}"
:
#!/bin/sh
m=bzzzM n=bzzzN
for s in \
'vv' 'w' '' 'uu ' ' uu ' ' uu' / \
'ab?' 'a?b' '?ab' 'ab??' 'a??b' '??ab' / \
'cd#' 'c#d' '#cd' 'cd##' 'c##d' '##cd' / \
'ef%' 'e%f' '%ef' 'ef%%' 'e%%f' '%%ef' / \
'gh*' 'g*h' '*gh' 'gh**' 'g**h' '**gh' / \
'ij"' 'i"j' '"ij' "ij'" "i'j" "'ij" / \
'kl{' 'k{l' '{kl' 'kl{}' 'k{}l' '{}kl' / \
'mn$' 'm$n' '$mn' 'mn$$' 'm$$n' '$$mn' /
do case $s in
(/) printf '\n' ;;
(*) printf '.%s. ' "${s#"${s%?}"}" ;;
esac
done
输出:
.v. .w. .. . . . . .u.
.?. .b. .b. .?. .b. .b.
.#. .d. .d. .#. .d. .d.
.%. .f. .f. .%. .f. .f.
.*. .h. .h. .*. .h. .h.
.". .j. .j. .'. .j. .j.
.{. .l. .l. .}. .l. .l.
.$. .n. .n. .$. .n. .n.
答案 9 :(得分:0)
对于任何对纯 POSIX 方法感兴趣的人:
#!/usr/bin/env sh
string_fetch_last_character() {
length_of_string=${#string}
last_character="$string"
i=1
until [ $i -eq "$length_of_string" ]; do
last_character="${last_character#?}"
i=$(( i + 1 ))
done
printf '%s' "$last_character"
}
string_fetch_last_character "$string"
答案 10 :(得分:-1)
echo $str | cut -c $((${#str}))
是一种很好的方法