Shell脚本在bash中工作,但不在'adb shell'上
下面的shell脚本在bash shell中工作得很好。但在android shell中产生错误。可能它必须对android使用的shell进行一些操作。但我该如何解决它?如果不是一个完美的解决方案,黑客也会为我做。Shell脚本在bash中工作,但不在'adb 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在机器人外壳,
root:/ # sample.sh
x - =
/system/bin/sample.sh[14]: [: =: missing second argument
A - S X - {x}
上bash外壳O/P(Linux)的:
PC:~$ ./sample.sh
x - =
A - S X - {x}
当的值$x
只是=
,它看起来像:
if [ = = " " -o -z = ]; then
它显然被=
弄糊涂了,应该是一个值而不是操作符。
将其更改为:
if [ "x${x}" = "x " -o "x${x}" = "x" ]; then
谢谢巴尔玛。我会在一段时间尝试它,并会回到你身边。 Bdw有没有一种方法可以找到Android shell的shell类型? –
不确定。从我所能找到的东西看,它看起来像是亚行特有的东西。 – Barmar
看来它是mksh shell。亚历克斯刚刚在问题的评论部分添加了一个链接。我会检查更多.. –
亚行外壳是BSD灰,这几许也是直系后裔。 更多的adb外壳recent android versions is mkshstandard shell of non-emulator builds on Android 4.0 and newer。
从错误文本很可能shell是一些mksh版本。
随着android系统的mksh是下重的变化和改进,我建议你把破折号为目标壳。它在大多数Linux发行版中都可用,并且是debian和衍生产品的默认系统shell。它具有较少的特征,但是在短跑中工作的东西在adb的mksh中不起作用是非常困难的。
{1:3:1}
特别地,此表达式:
x=${1:3:1}
在破折号没有意义(它的工作,但是,在mksh)。它可以用这个来代替:
x=${1#???}; x=${x%"${x#?}"}
的时间长一点,但得到的任何壳做的工作。
[
此外,还有与[…]
测试的问题,似乎有太多的“零件”是可靠的。将所述测试分成两个(或更多个,如果需要)是通常的补救:
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"
而且在仪表板,bash或mksh运行它,给:
x - =
A - S X - =
脚本是否以'#!/ bin/bash'开头? – Barmar
@Barmar是的。它以bash shell上的#!/ bin/bash和Android shell上的#!/ system/bin/sh开头 –
Android上bash的版本是什么? – Barmar