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

时间:2012-01-19 15:00:23

标签: bash shell

我试图从字符串中检索前5个字符,但是对于字符串操作行不断出现Bad substitution错误,我的teststring.sh脚本中有以下几行:< / p>

TESTSTRINGONE="MOTEST"

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

我已多次查看语法并且无法看到我做错了什么

由于

11 个答案:

答案 0 :(得分:58)

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

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)}'

答案 1 :(得分:52)

echo 'mystring' |cut -c1-5是您问题的替代解决方案。

更多关于unix cut program

答案 2 :(得分:40)

在这里工作:

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

你使用的是什么外壳?

答案 3 :(得分:7)

${variablename:0:5}的子字符串是bash功能,在基本shell中不可用。你确定你在bash下运行吗?检查shebang行(在脚本的开头),确保它是#!/bin/bash,而不是#!/bin/sh

答案 4 :(得分:6)

这可能对您有用:

 printf "%.5s" $TESTSTRINGONE

答案 5 :(得分:5)

适用于大多数炮弹

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

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

参数扩展应该有效(你有什么版本的bash?)

这是另一种方法:

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

原始语法适用于BASH,但不适用于DASH。在debian系统上你 可能会认为你正在使用bash,但可能会破坏。如果/ bin / dash /存在则 尝试暂时将短划线重命名为no.dash,然后创建soft a 链接,又名ln -s / bin / bash / bin / dash,看看是否能解决问题。

答案 10 :(得分:0)

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

因此,您的示例:

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