我试图从字符串中检索前5个字符,但是对于字符串操作行不断出现Bad substitution
错误,我的teststring.sh
脚本中有以下几行:< / p>
TESTSTRINGONE="MOTEST"
NEWTESTSTRING=${TESTSTRINGONE:0:5}
echo ${NEWTESTSTRING}
我已多次查看语法并且无法看到我做错了什么
由于
答案 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