3

Вопрос по sh, shell, linux, android – Сценарий оболочки в 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

EDIT

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

Android shell have problem with [] in if so is there any other way to check the value of c ?

Кроме всего прочего, не используйте == в сравнениях оболочки, так как он не переносим.

от mirabilos

@mirabilos да, ты поднял хороший вопрос. С не переносимыми вещами следует обращаться с особой осторожностью. Благодарю.

от Jeegar Patel
8 ответов
1

Как насчет проверки того

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

Windows \ r \ n - & gt; CR & # xA0; Л.Ф.

Unix \ n - & gt; LF

1

Представьте

что вы используете неправильный арифметический оператор, и в синтаксической ошибке отсутствует пропущенный & quot ;; & quot ;: try

[ $c -eq 1 ];

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

#!/system/bin/sh
0

используйте / 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
4

в общем-то

[ это псевдоним дляtest,

в Linux машинный тест находится на

/usr/bin/test

а также

if [ $c == 1 ]

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

if test "$c" = 1

BUT here in android there is no test

так что если с [] не будет работать в любом случае ...

Я буду кросс-тест для Android и проверить его .... !!!

На самом деле,[ $c == 1 ] являетсяnot эквивалентноtest "$c" = 1 -- это было бы[ "$c" = 1 ], Версия без кавычек небезопасна, потому что[ ], В отличие от[[ ]], не обрабатывается оболочкой как специальный синтаксис, поэтому расширения без кавычек по-прежнему проходят через разбиение строк и расширение глобуса== небезопасно, потому что стандарт POSIX не гарантирует, что он будет работать - только= оператор гарантированно присутствует и действителен для сравнения строк.

от 
5

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

извините, я обновил пост, вы можете узнать, как использовать ls -l / system / bin / sh, чтобы увидеть, где он связан с

от 

Да, busybox, похоже, плохо настроен. Необходимо сделать много символических ссылок, чтобы сделать '[' '; и другие работают.

от 

/ system / bin / busybox, который не найден

от Jeegar Patel

Android не имеет / bin / busybox

от Jeegar Patel

@ Тед Я не получаю ваш ответ, пожалуйста, вы можете объяснить подробно

от Jeegar Patel
2

Android не обеспечивает полноценную среду UNIX

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

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

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

Более новые версии Android включают mksh как / system / bin / sh, который имеет [как встроенную утилиту, поэтому он будет работать там из коробки. (Кстати, mksh также понимает & # x201C; == & # x201D; как расширение POSIX & # x201C; = & # x201D ;.) Это просто неудача оригинального плаката, что его Android не был еще достаточно новый & # x2639;

от 
1

Используйте Bash:

#!/system/bin/bash

или же

#!/system/xbin/bash

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

ls -l /bin/sh

Edit

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

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

Android не имеет Bash, и ваш EDIT также дает [: не найдена ошибка. Я предполагаю, что если не понимает [] и условия. если я предоставлю какую-либо команду / исполняемый двоичный файл с именем if, тогда он будет работать как истина

от Jeegar Patel
0

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

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

Похожие вопросы