Shell脚本在bash中工作,但在'adb shell'上不起作用

时间:2016-11-17 04:18:20

标签: android linux bash shell adb

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

2 个答案:

答案 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中起作用。

{1:3:1}

特别是这个表达式:

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 - =