2016-11-17 1 views
0

아래 쉘 스크립트는 bash 쉘에서 완벽하게 작동합니다. 그러나 안드로이드 셸에서 오류가 발생합니다. 안드로이드가 사용하고있는 쉘로 뭔가를해야 할 수도 있습니다. 그러나 어떻게 해결할 수 있습니까? 완벽한 솔루션이 아니라면 해킹이 나를 위해 할 것입니다.쉘 스크립트는 bash에서 작동하지만 'adb 쉘'에서는 작동하지 않습니다.

쉘 스크립트 : 안드로이드 쉘에서

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} 

bash 쉘에 O/P (리눅스) :

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

스크립트는'#!/bin/bash'로 시작합니까? – Barmar

+0

@Barmar 예. bash 쉘의 #!/bin/bash와 Android 쉘의 #!/system/bin/sh로 시작합니다. –

+0

Android의 bash 버전은 무엇입니까? – Barmar

답변

2

때의 값 $x은 단지 =이며, 모양은 다음과 같습니다.

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

그리고 분명히 연산자가 아닌 값이어야하는 =으로 혼란스러워하고 있습니다.

변경이로 :

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

Barmar에게 감사드립니다. 나는 얼마 동안 그것을 시도 할 것이고, 당신에게 되돌아 갈 것이다. Bdw는 우리가 안드로이드 셸의 셸 유형을 찾을 수있는 방법입니까? –

+0

확실하지 않습니다. 내가 찾은 것부터 ADB에 특유한 것 같습니다. – Barmar

+0

mksh 껍질 인 것 같습니다. Alex는 질문의 코멘트 섹션에 링크를 추가했습니다. 나는 더 많이 조사 할 것이다. –

2

아시아 개발 은행 쉘은 대시도있는 BSD 화산재의 직계 후손이었다. 더 많은 것에서 adb 포탄 recent android versions is mkshstandard shell of non-emulator builds on Android 4.0 and newer.

오류 텍스트에서 셸이 일부 mksh 버전 일 가능성이 큽니다.

android의 mksh가 크게 변경되고 개선 되었기 때문에 대상 쉘로 대쉬를 사용하는 것이 좋습니다. 대부분의 리눅스 배포판에서 사용 가능하며 debian 및 파생 상품의 기본 시스템 쉘입니다. 그것은 기능이 적지 만 dash에서 작동하는 것이 adb의 mksh에서 작동하지 않는다는 것은 매우 어렵습니다.

{1 : 3 : 1} 특히

,이 식 :

x=${1:3:1} 

이 (mksh에, 그것은하지만, 작업을 수행) 대시 의미가 없습니다. 조금 더

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

하지만 어떤 쉘에서 일을 가져옵니다 그것은이로 대체 할 수있다.

가 [

는 또한, […] 테스트에 문제가있는 것입니다, 신뢰할 수있는 너무 많은 "부분을"갖고있는 것 같아요.

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

||는 또한 또는 (&&의와 같은 기본 설정에 대한) : 두 (또는 필요한 경우 그 이상)로 테스트를 나누는 것은 일반적인 치료입니다.
어느 쉘에서도 작동합니다.

echo "A - ${a} X - ${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 - = 
관련 문제