如何获得一个shell中的string的最后一个字符?

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

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 

列出当前文件夹中的文件。

这就是为什么你需要引用你的variables的原因之一:

 echo "${str:$i:1}" 

否则,bash展开variables,在这种情况下,在打印出来之前进行通配。 引用参数到脚本(如果你有一个匹配的文件名)也更好:

 sh lash_ch.sh 'abcde*' 

另请参阅bash参考手册中的扩展顺序。 variables在文件名扩展之前展开。

Per @perreal引用variables很重要,但是因为我在阅读这篇文章之前已经阅读了5次,之后才发现了一个更简单的方法来处理评论中的问题。

 str='abcd/' echo "${str: -1}" 

输出: /

 str='abcd*' echo "${str: -1}" 

输出: *

感谢上面参与的所有人, 我已经在整个线程中适当地加了1个!

我知道这是一个非常古老的线索,但没有人提到我最清楚的答案:

 echo -n $str | tail -c 1 

注意-n只是回声不包括最后一个换行符。

另一个使用awk脚本的解决scheme

最后1个字符:

 echo $str | awk '{print substr($0,length,1)}' 

最后5个字符:

 echo $str | awk '{print substr($0,length-5,5)}' 

单线:

 ${str:${#str}-1:1} 

现在:

 echo "${str:${#str}-1:1}" 

到目前为止,每个答案都意味着问题中的“壳”这个词等同于Bash。

这是在一个标准的Bourne shell中可以这样做的:

 printf $str | tail -c 1 

尝试:

 "${str:$((${#str}-1)):1}" 

例如:

 someone@mypc:~$ str="A random string*"; echo "$str" A random string* someone@mypc:~$ echo "${str:$((${#str}-1)):1}" * someone@mypc:~$ echo "${str:$((${#str}-2)):1}" g 
 echo $str | cut -c $((${#str})) 

是一个好方法