본문 바로가기

모바일/보안

안드로이드 쉘 스크립트 : 작성방법

안드로이드에서 스크립트 작성

안드로이드에서는 기본적으로 vi 명령어가 없기 때문에 외부에서 쉘스크립트를 작성 후 adb push 로 올려야 한다. 

외부에서 작성 후 업로드하고 스크립트를 실행하려하면 쉘이 파일이나 디렉터리를 찾을 수 없다고 하는 경우가 있다.

1) 외부에서 작성 후 push 

에러를 발생시켜보면 sh 프로그램이 /system/bin/sh 위치에 있는걸 확인할 수 있는데 

그에 맞춰서 첫줄을 #!/system/bin/sh 로 작성해야 한다.

또한 윈도우(CRLF)와 리눅스(LF)의 개행문자가 다르기 때문에 에디터에서 작성할 때 변경해줘야 한다. (맥은 CR)

2) 내부에서 작성

cat 명령어와 Redirect를 통해 vi처럼 사용할 수 있다. 

# cat > test.sh   명령어를 사용하면 test.sh 파일에 앞으로 입력할 데이터를 넣을 수 있다. 

# cat >> test.sh   처럼 >>를 사용한다면 append모드로 입력할 수 있다.

입력이 끝나면 Ctrl+C 키를 이용해서 종료하면 된다. 

 

 

문법

변수 및 특수기호

$# : 입력받은 인자의 수 (=argc)

$0 : 실행한 스크립트의 경로 (=argv[0])

$1~$9 : 첫번째 인자~9번째 인자 (최신 쉘에서는 그 이상도 가능 ${10}으로 중괄호 사용 필수)

 

~ : 홈 디렉터리를 나타냄

$ : 변수의 값을 표출

${변수명} : 변수의 값을 표출

& : 백그라운드 작업을 실행

# : 주석

*, ? : 와일드카드 문자 (전체, 한자리)

\ : 다음문자 일반문자화

( ) : 하위쉘 시작, 끝

! : NOT

/ : 디렉터리 경로 구분자

; : 쉘 명령 구분자

< : 입력 리다이렉션

> : 출력 리다이렉션 (덮어쓰기)

>> : 출력 리다이렉션 (이어쓰기)

`cmd` : 명령 내 명령을 실행하는 경우 

| : 명령의 출력값을 다음명령의 입력값으로 사용

[ ] : 문자집합의 시작과 끝 ex) #ls [a-i]*.sh  : a~i로 시작하는 .sh 파일

 

' ' : 싱글쿼터로 감싸진 모든 특수문자는 일반문자화 된다.

" " : 더블쿼터로 감싸진 $, `, \를 제외한 특수문자는 일반문자화 된다. 

i=100    # 선언하고 대입할땐 $를 붙이지 않는다.
echo $i  # 변수에 접근할 땐 $를 붙여서 접근하고 출력
echo "Args: $i"   # 더블쿼터 문자열 안에 있어도 $로 접근할 수 있다. 
echo 'Args: $i'   # 싱글쿼터 문자열 안에 있으면 $로 접근할 수 없다.
echo "Args: \$i"   # \문자는 다음문자를 일반문자로 변경한다. 
echo "Pwd: `pwd`"  # 명령 속 명령 실행
echo "test${i}"

# 100
# Args: 100
# args: $i
# args: $i
# Pwd: /data/local/tmp
# test100

 

 

 

 

조건문

if else문. 물론 if문만 사용해도 된다.

if [ $# eq 0 ]
then
    exit
elif [ $# eq 3 ]
then
    exit $0
else
    exit $1
fi

 

case문. $arg 변수에 들어가 있는게 -a 인지, -b인지에 따라 분기가 나눠진다.

case $arg in
-a) aflag=1 ;;
-b) bflag=1 ;;
*) echo "Usage test.sh [-a|-b]
esac

 

반복문

전달받은 인자를 모두 출력.

shift는 가장 앞에있는인자($1)를 인자스택에서 pop 하는 명령어이다.

while문 안에서는 $1만 출력하고 있지만, shift 명령으로 $2 -> $1 로 이동되었기 때문에 다음 while에서 $1을 출력하면 두번째 인자가 출력된다. 인자의 수($#) 이 0이 될때까지 반복된다.

#!/system/bin/sh

echo Argument number: $#
while [ $# -gt 0 ]
do
    echo $1
    shift
done

while은 조건이 참일동안, until은 참이 될때까지 (거짓인동안) 이다. 

 

for i in [문자열 목록]
do
    명령들
done

 

반복문은 전부 break, continue 사용가능