예를 들어 전화기에 디렉터리가 있는지 확인하고 싶습니다.
R=$(adb shell 'ls /mnt/; echo $?' | tail -1);
$ echo $R
0
$ if [ "$R" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi
: integer expression expected
Path exists
R에 무슨 문제가 있나요? 좋아요, 확실히 0인 다른 변수를 사용해 보세요.
$ x=0
$ if [ "$x" -ne 0 ]; then echo "Path doesn't exist"; else echo "Path exists"; fi
Path exists
$ echo "|$x|"
|0|
$ echo "|$R|"
|0
두 번째 파이프는 인쇄되지 않습니다. 0 뒤에 문자가 있나요? 가지치기를 시도해보세요:
$ R=$(adb shell 'ls /mnt/; echo $?' | tail -1 | xargs)
$ echo "|$R|"
|0
아이디어가 부족해요.
답변1
adb
개행 앞에 캐리지 리턴 문자(일명 0x0d
, Ctrl-M
등) 를 추가합니다. \r
아마도 Windows 소프트웨어에서 사용하기 쉽도록 소프트웨어에서는 줄이 LF가 아닌 CR-LF로 끝날 것으로 예상합니다.
hexdump
aka 를 사용하여 직접 확인할 수 있습니다 hd
. 예를 들면 다음과 같습니다.
$ printf "$R" | hd
00000000 30 0d |0.|
00000002
값(종료 코드)만 반환하면 되기 때문입니다. printf
대신 사용 echo
하고 모든 ls
출력을 Android 장치로 리디렉션하여 /dev/null
줄바꿈 인쇄를 방지할 수 있습니다. 그러면 adb가 CR을 추가하지 않습니다.
R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; printf $?')"
Android 기기에 해당 항목이 없거나 printf
Android 셸에서 하나 이상의 출력 줄을 반환해야 하는 경우 tr -d '\r'
또는 유사한 기능 dos2unix
을 사용하여 sed 's/\r$//'
CR을 제거할 수 있습니다.
dos2unix
LF 바로 다음 CR만 제거하고 줄의 다른 곳에 있을 수 있는 CR은 남겨두기 때문에 sed
여기보다 더 나은 옵션이 있습니다 .tr
$ R="$(adb shell 'ls /mnt/ > /dev/null 2>&1 ; echo $?' | dos2unix)"
$ printf "$R" | hd
00000000 30 |0|
00000001
답변2
또 다른 답변은 질문자가 어디에서 잘못되었는지를 아주 잘 설명합니다. 이야기의 교훈은 adb가 일부를 추가할 수 있으므로 문자 수를 세는 데 주의해야 한다는 것입니다.
나는 결국 이 일을 하게 되었다
R=$(adb shell 'ls /mnt && echo SUCCESS || echo FAIL' | egrep (SUCCESS|FAIL))
echo $R