尝试从bash错误中的字符串中检索前5个字符?

尝试从bash错误中的字符串中检索前5个字符?,bash,shell,Bash,Shell,我试图从字符串中检索前5个字符,但字符串操作行不断出现错误替换错误,我的teststring.sh脚本中有以下几行: TESTSTRINGONE="MOTEST" NEWTESTSTRING=${TESTSTRINGONE:0:5} echo ${NEWTESTSTRING} 我已经检查了很多次语法,看不出我做错了什么 谢谢在这里工作: $ TESTSTRINGONE="MOTEST" $ NEWTESTSTRING=${TESTSTRINGONE:0:5} $ echo ${NEWTEST

我试图从字符串中检索前5个字符,但字符串操作行不断出现
错误替换
错误,我的
teststring.sh
脚本中有以下几行:

TESTSTRINGONE="MOTEST"

NEWTESTSTRING=${TESTSTRINGONE:0:5}
echo ${NEWTESTSTRING}
我已经检查了很多次语法,看不出我做错了什么

谢谢

在这里工作:

$ TESTSTRINGONE="MOTEST"
$ NEWTESTSTRING=${TESTSTRINGONE:0:5}
$ echo ${NEWTESTSTRING}
MOTES

您使用的是什么shell?

根据您的shell,您可以使用以下语法:

expr substr $string $position $length
以你为例:

TESTSTRINGONE="MOTEST"
echo `expr substr ${TESTSTRINGONE} 0 5`
$ TESTSTRINGONE="MOTEST"
$ NEWTESTSTRING=$(echo ${TESTSTRINGONE::5})
$ echo $NEWTESTSTRING
MOTES

或者

echo 'MOTEST' | cut -c1-5


如果愿意,您可以尝试
sed
-

[jaypal:~/Temp] TESTSTRINGONE="MOTEST"
[jaypal:~/Temp] sed 's/\(.\{5\}\).*/\1/' <<< "$TESTSTRINGONE"
MOTES
[jaypal:~/Temp]TESTSTRINGONE=“MOTEST”

[jaypal:~/Temp]sed的/\(.\{5\}\)./\1/'这可能适合您:

 printf "%.5s" $TESTSTRINGONE

该参数扩展应该可以工作(您有什么版本的bash?)

以下是另一种方法:

read -n 5 NEWTESTSTRING <<< "$TESTSTRINGONE"

read-n5newteststring带有
${variablename:0:5}
的子字符串是bash功能,在基本shell中不可用。你确定你在bash下运行这个吗?检查shebang行(在脚本的开头),确保它是
#/bin/bash
,而不是
#/bin/sh
。请确保不要使用
sh
命令(即
sh scriptname
)运行它,因为这会覆盖shebang。

echo'mystring'| cut-c1-5
是解决您的问题的另一种方法

echo $TESTSTRINGONE|awk '{print substr($0,0,5)}'

更多关于

的信息原始语法将与BASH一起使用,但与DASH不一起使用。在debian系统上,您可以 可能认为您正在使用bash,但可能改用dash。如果/bin/dash/存在,则 尝试暂时将dash重命名为no.dash,然后创建一个软名称 链接,又名ln-s/bin/bash/bin/dash,看看这是否解决了问题。

在大多数shell中都有效

TESTSTRINGONE="MOTEST"
NEWTESTSTRING=${TESTSTRINGONE%"${TESTSTRINGONE#?????}"}
echo ${NEWTESTSTRING}
# MOTES

你太接近了!下面是最简单的解决方案:
NEWTESTSTRING=$(echo${TESTSTRINGONE::5})

以你为例:

TESTSTRINGONE="MOTEST"
echo `expr substr ${TESTSTRINGONE} 0 5`
$ TESTSTRINGONE="MOTEST"
$ NEWTESTSTRING=$(echo ${TESTSTRINGONE::5})
$ echo $NEWTESTSTRING
MOTES

好的,它在终端中工作正常,但当我从.sh脚本运行它时,它会给出错误。可能您的脚本不是由bash执行的,而是由一些功能较差的shell执行的。您是否尝试添加
#/bin/bash
#/bin/sh
到您的第一行?我打赌
.sh
#/bin/sh
激活Bash的“POSIX合规模式”。因为这种形式的字符串切片不是POSIX shell特性(它是Bash特性),所以它会丢失。尝试将顶行显式设置为
#/bin/bash
,而不是
sh
。您使用的是哪个版本的bash?Bash我想你的意思是
sed's/\(.\{5\}\)./\1/'是的,我的字符串一开始就被截断了。我会更新它…谢谢@potongIt是我尝试的第一件事情之一,它仍然会给出相同的错误。你运气好吗?您使用的是什么版本的bash?(
bash-version
bash--version
),通常是@Mo。我还想鼓励您接受下面的答案,或者至少给出一些反馈。Alex L的回答非常好,绝对值得一些假互联网积分!在POSIX接受bash之前,+1表示可移植性(即使该线程的标题指定了bash)。我喜欢看到这样的答案来提高人们的意识,世界不是bash。这是POSIX吗?摸索
printf
实用程序POSIX页面时遇到问题