2014-04-13 3 views
0

오케이, 그래서 저는 Bash 스크립팅을 처음 접했지만 다른 언어에서는 약간의 경험이 있습니다.if 문에서 문자열 비교에 이상한 문제가 발생했습니다.

내 스크립트는 USB 디버깅이 가능한 Android 전화가 연결된 Linux 컴퓨터에서 실행됩니다.

제 스크립트가 작동하는 방식은 ./myscript.sh APP_NAME_WITHOUT_EXTENSION으로 실행하는 것입니다. 예를 들어 ./myscript.sh SystemUI을 실행하고 모든 앱의 목록을 가져온 다음 $1.apk이 해당 목록에 있는지 확인합니다. 여기

내가 내 안드로이드 휴대 전화에서 시스템 응용 프로그램의 목록을 얻고있다 방법입니다 : 이것은 잘 작동 나는이 할 경우

# Get list of files in system app directory 
app_list=($(adb shell ls $app_path)) 

: 다음

for file in ${app_list[@]}; do 
    echo $file 
done 

그것을 모든 파일을 출력 예상대로 이름.

found=false 
for file in ${app_list[@]}; do 
     # This is ALWAYS resulting in false, even if the strings in fact match 
     if [ "$1.apk" == "$file" ] || [ "$1.jar" == "$file" ]; then 
     echo "TEST" 
     found=true 
     break 
    fi 
done 

내가 구문 오류의 일종을 만들고있어 확신 해요,하지만 난 단지 그것을 알아낼 수 없습니다,이 날 운전 너트 :

지금 나는이 있습니다. 모든 종류의 예제를 살펴 보았고 코드에 문제가있는 것을 발견 할 수 없습니다.

+1

'test' ('[') 명령에서'=='대신'='를 사용하십시오. –

+0

Do to new 나는 내 자신의 질문에 대답 할 수 없다. 그러나 나는 그것을 알아 냈다. 단지 입력을 위생적으로해야했다. 8 시간 후에 조금 더 자세하게 질문에 대답 할 것이다. – Tory

답변

0

그럼 내가 내 질문을 게시 거의 직후에 그것을 알아 냈하지만, 새로운 인에 일은 내가 내 자신의 질문에 대답하기 전에 8 시간 기다려야했다 . 어쨌든, 여기 솔루션입니다. 나는이 질문을 게시 한 후

은, 갑자기 생각이 나에게 와서 "무엇 ls 명령은 파일 이름에 인쇄 할 수없는 문자를 추가하는 것처럼?"그래서 나는이 결과 입력을 살균하기로 결정

for file in ${app_list[@]}; do 
    file=${file//[^a-zA-Z0-9_. ]/} # This strips any non-printable characters 
    # Thanks to naab for pointing out the regex conditional :) 
    if [[ $file =~ "$1."("apk"|"jar") ]]; then 
     found=true 
     break 
     fi 
done 

이제 작동합니다! B)

0

당신은 하나 개의 조건에서 두 경우 모두를 테스트 할 수 있습니다 :

if [[ $file =~ "${1}"\.(apk|jar) ]]; then 
    echo "TEST" 
    found=true 
    break 
fi 
+0

== Bash 문서에 따라 =에 대한 별칭입니다. 조건부에서 사용되는 경우 – Tory

+0

한 문장으로 2 개의 조건문을 지적 해 주셔서 감사합니다. 그 사실을 알지 못했습니다. – Tory

관련 문제