Answers:
这就是您需要引用变量的原因之一:
echo "${str:$i:1}"
否则,bash会扩展变量,在这种情况下,会在打印出来之前进行球形调整。最好在脚本中引用参数(如果文件名匹配):
sh lash_ch.sh 'abcde*'
另请参见bash参考手册中的扩展顺序。在文件名扩展之前先扩展变量。
要获取最后一个字符,您应该仅将其-1
用作索引,因为负索引从字符串末尾开始计数:
echo "${str: -1}"
冒号(:
)后的空格是必需的。
没有空间,这种方法将行不通。
echo "${str:$((${#str}-1)):1}"
。这样,您还可以更改返回的尾随字符。在bash v4.1.0(1)中为我工作的内容
"${1:-1}
“行不通”!
每@perreal,引用变量很重要,但是因为我在类似的文章中读了5次,然后才找到一种更简单的方法来处理注释中的问题...
str='abcd/'
echo "${str: -1}"
输出: /
str='abcd*'
echo "${str: -1}"
输出: *
感谢以上参与此活动的每个人;我已在整个线程中适当添加了+1!
${std: -1}
,没有该空间将无法使用。我遇到了这个问题,发现它${std:~0}
也可以工作(带或不带空格)。虽然不确定这是否是记录在案的行为,但我没有费心去查找它。
.sh
尝试将检索到的字符分配给变量时,该解决方案在脚本中不起作用。例如,declare LAST=$(echo "${str: -1}")
这将导致讨厌的红色条显示语法错误,起始于:
${str:0-1}
我知道这是一个非常老的话题,但是没有人提到对我最干净的答案:
echo -n $str | tail -c 1
请注意,-n
只是这样,以便回显末尾不包含换行符。
单线:
${str:${#str}-1:1}
现在:
echo "${str:${#str}-1:1}"
echo "${str: -1}"
是够(介意之间的空间:
和-
)。
$((...))
。
到目前为止,每个答案都暗示问题中的“壳”一词等同于Bash。
这是在标准的Bourne shell中可以做到的方式:
printf $str | tail -c 1
echo -n
如user5394399所建议,当$str
包含特殊格式的字符时,可以避免出现问题。
-n
开关是一个bashism。它在标准的Bourne外壳中不能用作破折号等,这就是我的回答的重点。
printf "%s" "$str" | ...
改成:-)。
尝试:
"${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
"${1: -1}"
就足够了。