如何获得一个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})) 
是一个好方法