繁体   English   中英

Shell脚本可在bash中工作,但不能在“ adb shell”中工作

[英]Shell script works in bash but not on 'adb shell'

下面的shell脚本在bash shell中运行良好。 但是在android shell中产生一个错误。 可能与android正在使用的外壳有关。 但是我该如何解决呢? 如果不是完美的解决方案,那么黑客也可以为我服务。

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}

$x值为just = ,它看起来像:

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

并且显然被=应该混淆,应该是一个值而不是一个运算符。

更改为:

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

adb外壳是BSD灰的直接后代,连字符也是。 新的android版本中的adb shell 是mksh 非仿真器的标准shell,基于Android 4.0及更高版本构建

从错误文本来看,shell可能是某些mksh版本。

由于android中的mksh正在进行重大更改和改进,因此建议您将破折号作为目标shell。 它在大多数linux发行版中都可用,并且是debian和衍生产品的默认系统外壳。 它具有较少的功能,但是很难使在ADB的mksh中不能使用破折号的东西起作用。

{1:3:1}

特别是,此表达式:

x=${1:3:1}

在破折号中没有任何意义(但是在mksh中有效)。 可以替换为:

x=${1#???}; x=${x%"${x#?}"}

更长一点,但是可以在任何 shell中完成工作。

[

另外, […]测试存在问题,似乎有太多“零件”,其可靠性不足。 通常的解决方法是将测试分为两个(如果需要,可以进行多个测试):

if [ "${x}" = " " ] || [ -z "${x}" ]; then

|| 还是or(与&&和the相同)。
这也适用于任何外壳。

最后更改为(变量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 - =

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM