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