Сценарий оболочки в android дает [: не найден

У меня есть этот скрипт, который работает на моей Linux-машине

#!/bin/sh c=1 if [ $c == 1 ] then echo c is 1 else echo c is 0 fi 

Но когда я использую это в android следующим образом:

 #!/system/bin/sh c=1 if [ $c == 1 ] then echo c is 1 else echo c is 0 fi 

Это дает ошибку, например:

 [: not found 

РЕДАКТИРОВАТЬ

Есть ли какая-либо другая логика для проверки значения $c , является ли оно 1 или 0?

У оболочки Android есть проблема с [], если есть какой-либо другой способ проверить значение c?

Andriod shell sh на самом деле является ссылкой на busybox, и он вызывается как

 busybox sh 

Вам нужно настроить [апплеты вручную

 busybox ln -s /your_original_sh_path/busybox [ 

Если вы не знаете, где загружен busybox, попробуйте перечислить / system / bin / sh, которые вы даете

 ls /system/bin/sh busybox which busybox 

Обычно [ является псевдонимом для test ,

В Linux машинный тест на

 /usr/bin/test 

а также

 if [ $c == 1 ] 

Оценивается как

 if test "$c" = 1 

НО здесь, в Android, нет test

Поэтому, если с [] не будет работать в любом случае …

Я перейду скомпилировать тест для Android и проверить его …. !!!

Android не предоставляет полную среду UNIX, это не операционная система UNIX. У него есть некоторые общие черты, похожие на то, как Windows имеет некоторое сходство с UNIX. Некоторые Android-устройства и ПЗУ пытаются предоставить больше подобной UNIX-среде, чем другие, но вы не можете полагаться на большинство стандартных инструментов сценариев оболочки, которые устанавливаются, если вы думаете о совместимости между устройствами.

Например, если вы посмотрите на свою систему GNU / Linux, вы можете увидеть этот test и [ на самом деле программы. Попробуйте это: ls -l /usr/bin/[ . Большинство установок Android не включают test или [ . Это означает, что если вы хотите попытаться выполнить фактическое программирование с минимальной оболочкой Android, вы должны использовать множество нечетных трюков. Вы можете установить busybox для получения полной оболочки оболочки UNIX, или вы даже можете создать busybox в своем приложении. Я делаю это, когда мне нужно включить сценарии оболочки в приложение (например, Lil 'Debi и Commotion MeshTether ).

Вот пример написания killall в среде Android /system/bin/sh : http://en.androidwiki.com/wiki/Android_Shell_tips_and_tricks. Вы также можете использовать различные расширения параметров для создания некоторой логики, вы можете увидеть пример этого В сценариях Barnacle Wifi Tether .

Использовать bash:

#!/system/bin/bash

или

#!/system/xbin/bash

Вы можете проверить, где ваш двоичный файл sh указывает на вашу Linux-машину:

 ls -l /bin/sh 

редактировать

BTW, используйте:

 c=1 if [ $c -eq 1 ] then echo c is 1 else echo c is 0 fi 

Думайте, что вы используете неправильный арифметический оператор и есть синтаксическая ошибка отсутствующего «;»: try

 [ $c -eq 1 ]; 

Также ваше местоположение для Bash (sh) может быть неправильным в верхней части файла:

 #!/system/bin/sh 

Как насчет проверки того, что .sh-файл не содержит возврат каретки перед подачей строки.

Windows \ r \ n -> CR LF

Unix \ n -> LF

Use / system / bin / cmp для теста равенства. Если вам нужен численный тест, замените $ (($ c == 1)) на $ c

 #!/system/bin/sh echo $c >/tmp/a echo 1 >/tmp/b if cmp /tmp/a /tmp/b echo c is 1 else echo c is 0 fi 

Я столкнулся с этой проблемой и нашел решение (на другом сайте)

 if [[ $b -gt 0]] then echo 'Hooray it works' else echo 'still works' fi