АБР оболочка была прямым потомком 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 - =
Сценарий начинается с '#!/Bin/bash'? – Barmar
@ Бармар да. Он начинается с #!/Bin/bash на оболочке bash и #!/System/bin/sh на оболочке Android –
Какая версия bash на Android? – Barmar