2016-11-17 2 views
0

Ниже сценария оболочки отлично работает в оболочке bash. Но вызывает ошибку в оболочке Android. Может быть, он должен что-то сделать с оболочкой, которую использует андроид. Но как я могу это решить? Если бы не идеальное решение, для меня тоже был бы взломан.Сценарий оболочки работает в 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} 

O/P на Баш оболочки (Linux):

PC:~$ ./sample.sh 
x - = 
A - S X - {x} 
+0

Сценарий начинается с '#!/Bin/bash'? – Barmar

+0

@ Бармар да. Он начинается с #!/Bin/bash на оболочке bash и #!/System/bin/sh на оболочке Android –

+0

Какая версия bash на Android? – Barmar

ответ

2

Когда значение $x всего лишь =, это выглядит так:

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

, и это, по-видимому, путается =, который должен быть значением, а не оператором.

Изменить это:

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

Спасибо, Бармар. Я попробую это через некоторое время и вернусь к вам. Bdw есть способ, которым мы можем найти оболочку типа оболочки Android? –

+0

Не уверен. Из того, что я смог найти, похоже, что это нечто специфическое для АБР. – Barmar

+0

Кажется, это оболочка mksh. Алекс только что добавил ссылку в разделе комментариев. Я проверю еще .. –

2

АБР оболочка была прямым потомком BSD золы, из которых тир тоже. Корпус adb больше recent android versions is mkshstandard shell of non-emulator builds on Android 4.0 and newer.

Из текста ошибки вероятно, что оболочка является некоторой версией mksh.

Поскольку mksh in android находится под сильными изменениями и улучшениями, я рекомендую вам использовать тире в качестве целевой оболочки. Он доступен в большинстве дистрибутивов Linux и является системной оболочкой по умолчанию для debian и производных. У него меньше возможностей, но очень сложно, что что-то, что работает в тире, не будет работать в mksh adb.

{1: 3: 1}

В частности, это выражение:

x=${1:3:1} 

не имеет никакого значения в тире (он работает, тем не менее, в МКШ). Он может быть заменен следующим образом:

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

Немного дольше, но получает работу в любой оболочки.

[

Кроме того, существует проблема с тестом […], это, кажется, слишком много «частей», чтобы быть надежным. Разделив тест на два (или более, если это необходимо) является обычным средством:

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

|| также или (с тем же самым, как предпочтение &&, тем и).
Которая также работает в любой оболочке.

С последним изменением (отсутствующей $ для переменной х):

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" 

И работает это в тире, Баш или МКШ, дает :

x - = 
A - S X - = 
Смежные вопросы