2016-11-17 134 views
0

下面的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} 
+0

脚本是否以'#!/ bin/bash'开头? – Barmar

+0

@Barmar是的。它以bash shell上的#!/ bin/bash和Android shell上的#!/ system/bin/sh开头 –

+0

Android上bash的版本是什么? – Barmar

回答

2

当的值$x只是=,它看起来像:

if [ = = " " -o -z = ]; then 

它显然被=弄糊涂了,应该是一个值而不是操作符。

将其更改为:

if [ "x${x}" = "x " -o "x${x}" = "x" ]; then 
+0

谢谢巴尔玛。我会在一段时间尝试它,并会回到你身边。 Bdw有没有一种方法可以找到Android shell的shell类型? –

+0

不确定。从我所能找到的东西看,它看起来像是亚行特有的东西。 – Barmar

+0

看来它是mksh shell。亚历克斯刚刚在问题的评论部分添加了一个链接。我会检查更多.. –

2

亚行外壳是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 - =