下面的shell脚本在bash shell中运行得非常好。但是在android shell中产生错误。也许它必须对android正在使用的shell做一些事情。但是我该如何解决呢?如果不是一个完美的解决方案,黑客也会为我做。
Shell脚本:
func()
{
local x
x=${1:3:1}
echo "x - $x"
if [ "${x}" = " " -o -z "${x}" ]; then
a="M"
else
a="S"
fi
echo "A - ${a} X - {x}"
}
func "abc=efg"
O / p在android shell中,
root:/ # sample.sh
x - =
/system/bin/sample.sh[14]: [: =: missing second argument
A - S X - {x}
bash shell上的O / p(Linux):
PC:~$ ./sample.sh
x - =
A - S X - {x}
答案 0 :(得分:2)
当count++
的值仅为$x
时,它看起来像:
=
它显然被if [ = = " " -o -z = ]; then
混淆了,它应该是一个值而不是一个运算符。
将其更改为:
=
答案 1 :(得分:2)
adb shell是BSD灰的直接后代,其中也是破折号。 更多recent android versions is mksh standard shell of non-emulator builds on Android 4.0 and newer。
中的adb shell从错误文本中,shell可能是某个mksh版本。
由于android中的mksh正在进行大量更改和改进,我建议您将dash作为目标shell。它在大多数Linux发行版中都可用,并且是debian和衍生版的默认系统shell。它的功能较少,但在dash中工作的东西很难在adb的mksh中起作用。
特别是这个表达式:
x=${1:3:1}
在破折号中没有任何意义(但是,它在mksh中有效)。它可以替换为:
x=${1#???}; x=${x%"${x#?}"}
稍长一点,但在任何 shell中完成工作。
此外,[…]
测试存在问题,似乎有太多“部件”可靠。将测试分成两部分(如果需要,可以更多)是通常的补救措施:
if [ "${x}" = " " ] || [ -z "${x}" ]; then
||
也是一个或(与&&
具有相同的偏好,和)。
这也适用于任何shell。
最后更改(变量x缺少$):
echo "A - ${a} X - ${x}"
我们将整个脚本视为:
func()
{
local x
x=${1#???}; x=${x%${x#?}}
echo "x - $x"
if [ "${x}" = " " ] || [ -z "${x}" ]; then
a="M"
else
a="S"
fi
echo "A - ${a} X - ${x}"
}
func "abc=efg"
在dash,bash或mksh中运行它,给出:
x - =
A - S X - =