[英]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中不能使用破折号的东西起作用。
特别是,此表达式:
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.