Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 更改代码以使其在sh或ash中工作_Shell_Scripting_Sh_Ash - Fatal编程技术网

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