如何获取shell中字符串的最后一个字符?

时间:2013-07-09 07:55:22

标签: string bash shell

我写了以下几行来获取字符串的最后一个字符:

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

列出当前文件夹中的文件

11 个答案:

答案 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 方法感兴趣的人:

https://github.com/spiralofhope/shell-random/blob/master/live/sh/scripts/string-fetch-last-character.sh

#!/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}))

是一种很好的方法