我正在将文件的最后一行读入变量。然后我想获取字符串变量的最后 X 个字符:
#!/bin/bash
someline="this is the last line content"
echo ${someline}
somepart=${someline: -5}
echo ${somepart}
运行:sh lastchars.sh
结果:
this is the last line content
line 4: Bad substitution
这可能出了什么问题?
答案1
听起来你根本没用。如果我使用而不是 ,bash
我只能重现你显示的错误:dash
bash
bash
:$ line="someline content" $ echo ${line} someline content $ lastchars=${line: -5} $ echo ${lastchars} ntent
dash
:$ line="someline content" echo ${line} lastchars=${line: -5} echo ${lastchars} $ someline content $ dash: 3: Bad substitution
你的舍邦线指向bash
,但您使用运行脚本sh
,因此shebang 被忽略。/bin/sh
在 Ubuntu 系统上实际上是dash
,一个不支持您尝试使用的语法的最小 shell。
当使用 shebang 行时,没有必要明确为脚本调用 shell,只需使其可执行(chmod a+x /path/to/script.sh
)并运行它而不指定解释器:
/path/to/script.sh
或者,只需使用正确的一个:
bash /path/to/script.sh
答案2
显然,使用某个 shell 的内置函数很好,但是您也可以使用标准 UNIX 命令完成任务,因此它可以在任何 shell 中运行:
String="This is some text"
StrLen=`echo ${String} | wc -c`
From=`expr $StrLen - 5`
echo $String | cut -c${From}-${StrLen}