thi*_*er3 112 string bash shell
我写了以下几行来获取字符串的最后一个字符:
str=$1
i=$((${#str}-1))
echo ${str:$i:1}
Run Code Online (Sandbox Code Playgroud)
它适用于abcd/:
$ bash last_ch.sh abcd/
/
Run Code Online (Sandbox Code Playgroud)
它不适用于abcd*:
$ bash last_ch.sh abcd*
array.sh assign.sh date.sh dict.sh full_path.sh last_ch.sh
Run Code Online (Sandbox Code Playgroud)
它列出了当前文件夹中的文件.
qui*_*tin 179
根据@perreal,引用变量很重要,但因为我在评论中找到一个更简单的方法来解决这个问题之前,我读过这篇文章5次...
str='abcd/'
echo "${str: -1}"
Run Code Online (Sandbox Code Playgroud)
输出: /
str='abcd*'
echo "${str: -1}"
Run Code Online (Sandbox Code Playgroud)
输出: *
感谢参与上述活动的所有人; 我已经在整个帖子中正确添加了+ 1!
per*_*eal 69
这是您需要引用变量的原因之一:
echo "${str:$i:1}"
Run Code Online (Sandbox Code Playgroud)
否则,bash会扩展变量,在这种情况下会在打印之前进行通配.将参数引用到脚本也是更好的(如果您有匹配的文件名):
sh lash_ch.sh 'abcde*'
Run Code Online (Sandbox Code Playgroud)
另请参阅bash参考手册中的扩展顺序.在文件名扩展之前扩展变量.
小智 30
我知道这是一个非常古老的线索,但没有人提到我这是最干净的答案:
echo -n $str | tail -c 1
Run Code Online (Sandbox Code Playgroud)
请注意,-n回声最后不包括换行符.
到目前为止,每个答案都暗示问题中的“shell”一词等同于 Bash。
这是在标准的 Bourne shell 中如何做到这一点的:
printf "%s" "$str" | tail -c 1
Run Code Online (Sandbox Code Playgroud)
使用 awk 脚本的另一个解决方案:
最后 1 个字符:
echo $str | awk '{print substr($0,length,1)}'
Run Code Online (Sandbox Code Playgroud)
最后 5 个字符:
echo $str | awk '{print substr($0,length-5,5)}'
Run Code Online (Sandbox Code Playgroud)
单线:
${str:${#str}-1:1}
Run Code Online (Sandbox Code Playgroud)
现在:
echo "${str:${#str}-1:1}"
Run Code Online (Sandbox Code Playgroud)
尝试:
"${str:$((${#str}-1)):1}"
Run Code Online (Sandbox Code Playgroud)
例如:
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
Run Code Online (Sandbox Code Playgroud)