Shell 更改代码以使其在sh或ash中工作
我编写了一个函数,从配置文件中读取时间并计算为秒 配置文件中的行如下所示:Shell 更改代码以使其在sh或ash中工作,shell,scripting,sh,ash,Shell,Scripting,Sh,Ash,我编写了一个函数,从配置文件中读取时间并计算为秒 配置文件中的行如下所示: timeend=30h 该函数是为bash编写的,但在我使用的Linux发行版中没有bash可用,只有sh和ash 在sh和ash中,似乎我不能使用-1 我需要如何更改代码以使其在ash或sh中工作 getTimeEndFromConfig(){ case $timeend in *s ) echo ${timeend::-1};; *m ) zeit=${timeend::-1} TIMEEND=$(($zeit*6
timeend=30h
该函数是为bash编写的,但在我使用的Linux发行版中没有bash可用,只有sh和ash
在sh和ash中,似乎我不能使用-1
我需要如何更改代码以使其在ash或sh中工作
getTimeEndFromConfig(){
case $timeend in
*s )
echo ${timeend::-1};;
*m )
zeit=${timeend::-1}
TIMEEND=$(($zeit*60))
echo ${TIMEEND};;
*h )
zeit=${timeend::-1}
TIMEEND=$(($zeit*3600))
echo ${TIMEEND};;
esac
}
更新所以我改变了它,但现在我调用函数时总是出现一个
算术语法错误。${timeend::-1}
是一个bash扩展(实际上是一个相对较新的带有负偏移量的扩展)
:
在此上下文中,?
表示任何字符,%
表示从字符串末尾删除模式的最短匹配项
或者,您可以使用sed:
zeit=$(printf '%s' "$timeend" | sed 's/.$//')
这还会从字符串中删除最后一个字符
在不支持算术展开的旧shell中,我建议使用awk:
echo "$(printf '%d' "${timeend%?}" | awk '{print $1 * 3600 }')"
在这里,我在case
语句的最后一个分支中将子字符串提取和乘法结合起来。或者只是zeit=${timeend%?}
@tripleee没有意识到这在POSIX shell中是有效的,但是如果它意识到了,那么是的!确实如此。%%
变量是一个Bash扩展,但是普通的老%%
和它的姐妹#
肯定在POSIX中。如果我调用这个函数,在我更改它之后,我总是会得到一个算术语法错误。计算语法也不受支持吗?错误读取为算术语法错误
,这意味着shell理解$(…)
;它只是不明白里面是什么。我会更仔细地检查zeit
的结果值,以确保它实际上只是一个数字。您将其更改为什么?您使用哪个版本的sh
?
echo "$(printf '%d' "${timeend%?}" | awk '{print $1 * 3600 }')"