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


77

我正在尝试从字符串中检索前5个字符,但是Bad substitution在字符串操作行中不断出现错误,我的teststring.sh脚本中包含以下几行:

TESTSTRINGONE="MOTEST"

NEWTESTSTRING=${TESTSTRINGONE:0:5}
echo ${NEWTESTSTRING}

我已经遍历了很多次语法,看不到我做错了什么

谢谢


1
你有运气吗?您正在使用什么版本的bash?(bash -versionbash --version通常)
Alex L

4
@Mo。我也想鼓励您接受下面的答案,或者至少提供一些反馈。亚历克斯L的答案是非常好的恕我直言,它绝对值得一些假互联网点!
2016年

Answers:


68

根据您的外壳,您可能可以使用以下语法:

expr substr $string $position $length

因此,对于您的示例:

TESTSTRINGONE="MOTEST"
echo `expr substr ${TESTSTRINGONE} 0 5`

或者,

echo 'MOTEST' | cut -c1-5

要么

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


52

在这里工作:

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

您正在使用什么外壳?


好的,它在终端中工作正常,但是当我从.sh脚本运行时,它给出了错误
Mo.2012年

5
也许您的脚本不是由bash执行,而是由一些功能较弱的shell执行。

4
您是否尝试过添加#!/bin/bash或添加#!/bin/sh到第一行?
亚历克斯L

1
我打赌.sh#!/bin/sh激活Bash的“ POSIX遵从模式”。由于这种形式的字符串切片不是POSIX shell功能(它是Bash功能),因此会丢失。尝试明确设置上线#!/bin/bash没有 sh
Zac B

1
您正在使用哪个版本的Bash?Bash <4缺少很多好东西
sibaz

13

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


这是我尝试的第一件事,但仍然会出现相同的错误。
2012年

7

这可能对您有用:

 printf "%.5s" $TESTSTRINGONE

这是POSIX吗?在printf实用程序POSIX页面上遇到麻烦
Harold Fischer

6

适用于大多数外壳

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

1
在POSIX接受bashism之前,为可移植性,+ 1(即使此线程的标题指定bash)。我喜欢看到这些答案,以提高人们对世界并非重击的认识。
胡安

2

sed如果愿意,可以尝试-

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

我想你的意思是sed 's/\(.\{5\}\).*/\1/' <<<$TESTSTRINGONE
potong 2012年

是的,一开始我的弦被截断了。病态的更新……谢谢@potong
jaypal singh

2

你好亲密!这是最简单的解决方案:NEWTESTSTRING=$(echo ${TESTSTRINGONE::5})

因此,对于您的示例:

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

1

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

这是另一种方法:

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

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

1

原始语法适用于BASH,但不适用于DASH。在debian系统上,您可能会以为您正在使用bash,但可能是破折号。如果/ bin / dash / exist存在,则尝试将dash临时重命名为no.dash,然后创建一个软链接,也称为ln -s / bin / bash / bin / dash,看看是否能解决问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.