eas build 를 사용하여 android 빌드를 수행중, 공식문서에 기재된 아래 프로필 설정의 차이점이 궁금해서 정리해본다.

  • developmentClient to true (default)
  • distribution to internal
  • android.buildType to apk
  • android.gradleCommand to :app:assembleRelease, :app:assembleDebug or any other gradle command that produces .apk
{
  "build": {
    "development": {
      "developmentClient": true
    },
    "android-apk-distribution": {
      "distribution": "internal"
    },
    "android-apk": {
      "android": {
        "buildType": "apk"
      }
    },
    "android-apk-gradle-debug": {
      "android": {
        "gradleCommand": ":app:assembleDebug"
      }
    },
    "production": {}
  }
}

 

 

1. developmentClient to true (defaul)
apk 파일로 빌드하며, apk 다운로드 링크가 제공된다. apk 빌드완료 후 expo-dev-clinet 를 사용하여 개발머신의 안드로이드 에뮬레이터에 띄우는 것이 특징이다. 그래서 expo-dev-client 가 설치되어 있지 않으면 설치를 요구한다. 개발머신에서 npx expo start --dev-client 커맨드를 사용하여 서버를 구동해야 하며, 에뮬레이터에서 해당 서버를 선택하여 사용한다.(아래 이미지참고)

 

 

 

 

 

2. distribution to internal

빌드된 apk 파일을 다운로드 할 수 있는 QR과 링크가 생성되며, 이에 접속하면 손쉽게 팀원들에게 apk를 전달할 수 있다.

 

 

 

 

3. android.buildType to apk

apk 파일로 빌드되며, 다운로드 받을 수 있는 링크가 제공된다.

 

 

 

4. android.gradleCommand to :app:assembleRelease, :app:assembleDebug

gradle 을 사용해서 apk를 빌드한다. 마찬가지로 apk 다운로드 링크가 제공된다.(또다른 차이점은 모르겠음)

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

특수변수인 위치매개변수(Positional Parameter)의 의미에 대해 정리한다.

 

$0: 실행된 쉘 스크립트명

$1: 스크립트에 넘겨진 첫 번째 아규먼트

$2: 스크립트에 넘겨진 두 번째 아규먼트

${10}: 스크립트에 넘겨진 열 번째 아규먼트(두자릿 수 이상이면 curly bracket으로 감싸야 한다)

$#: 스크립트에 넘겨진 아규먼트의 개수

$$: 쉘 스크립트를 실행하는 Process Id

$*: 스크립트에 전달된 전체 인자 배열

$@: 스크립트에 전달된 전체 인자 배열($*와의 차이점은 https://secjong.tistory.com/21 참고)

$?: 실행 종료상태값(반환값)

$-: 현재 쉘이 호출될 때 사용한 옵션들

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

"매개변수 확장"(Parameter Expansion) 이라는 용어가 맘에 안들긴 하지만, 다들 그렇게 부르니 그렇게 정리한다.

 

1. ${name}

name 변수의 값으로 치환한다.

 

2. ${name:=james}

name 변수의 값으로 치환하되, name 변수가 null이면 james 문자열을 name 변수에 저장한 후 치환한다.

 

3. ${name:-james}

name 변수의 값으로 치환하되, name 변수가 null이면 james 문자열로 치환한다.(저장X)

 

4. ${name:+james}

name 변수의 값으로 치환하되, name 변수가 null이 아니면 james 문자열로 치환한다.(name 변수가 null이면 그대로 null로 치환된다.)

 

5. ${name:?james}

name 변수의 값으로 치환하되, name 변수가 null이면 error상태로 종료되며 james 문자열을 보여준다.

 

6. ${#name}

name 변수의 값의 문자길이를 반환한다.

 

7. ${name:3}

name 변수의 값에서 3만큼 앞부분을 삭제한 후의 값을 반환한다.

e.g. 

name=abcdefg
echo ${name:3} # defg

 

8. ${name:3:2}

name 변수의 값에서 3만큼 앞부분을 삭제한 후의 값에서 앞의 2개 문자열을 반환한다.

e.g.

name=abcdefg
echo ${name:3:2} # de

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

자주 쓰진 않지만, 인라인 커맨드를 사용하면서 알아두면 유용한 커서이동, 삭제 편집키를 정리한다.

 

1. 주요 커서 이동 키

ESC 후 b: 커서를 왼쪽으로 한 단어 이동(backward)

ESC 후 f: 커서를 오른쪽으로 한 단어 이동(forward)

Ctrl + a: 맨 왼쪽으로 이동

Ctrl + e: 맨 오른쪽으로 이동

 

2. 주요 삭제키

ESC 후 Backspace: 커서 왼쪽 한 단어 삭제

ESC 후 d: 커서 오른쪽 한 단어 삭제

Ctrl + u: 행 전체 삭제

Ctrl + y: 삭제 취소

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

스크립트 실행시 "-a" 와 같이 옵션을 줄 때, 이를 getopts로 받는 방법 예시

 

test.sh

#!/bin/bash

while getopts abc: arguments 2> /dev/null # 에러출력을 감춘다. "c:"는 c 옵션에는 인자가 필수라는 의미.
do
        case "$arguments" in
                "a")
                        echo "-a option used.";
                        ;;
                "b")
                 	echo "-b option used.";
                        ;;
                "c")
                        echo "-c option used.";
                        echo "OPTARG ===> $OPTARG."; # OPTARG 특수변수는 옵션의 인자로 넘어온 값을 담고있다.
                        ;;
                "?")
                        echo "Usage : opt4 [-ab] [-c argument]";
                        exit 1;
                        ;;
        esac
done
echo "the number of argument is $((OPTIND-1)) ..." # OPTIND 특수변수는 명령줄의 스크립트명(여기서는 ./test.sh)도 포함한 전체 인자의 갯수이다.
# ((OPTIND-1)) 은 산술연산을 의미하고, 이를 다시 변수참조로 받기 위해 $를 앞에 붙여준 듯.

 

./test.sh -a -b -c centos 실행결과

-a option used.
-b option used.
-c option used.
OPTARG ===> centos.
the number of argument is 4 ...

 

./test.sh -abc centos 실행결과

-a option used.
-b option used.
-c option used.
OPTARG ===> centos.
the number of argument is 2 ...

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

정확히는 bash 스크립트 디버깅 방법이다.

 

1. bash -n 스크립트파일

스크립트에 문법적 오류가 있는지 확인할 때 사용한다. 스크립트를 해석은 하지만, 실행하지는 않는다.

스크립트에 문법 오류가 있는 경우, 에러 내용을 출력해주고, 문법 오류가 없는 경우 아무런 메시지도 출력하지 않는다.

 

2. bash -x 스크립트파일

스크립트 전체를 디버깅하기 위해 일반적으로 사용되는 방법이다.

순서: 변수 치환 -> 실행되는 스크립트 각 라인 출력 -> 스크립트 실행결과 출력

실행되는 스크립트 각 라인 출력시 맨 앞에 "+" 기호가 붙는다.

 

3. 스크립트 내 set -x, set +x 사용

스크립트 중 일부분만 디버깅하기 위해 일반적으로 사용되는 방법이다.

스크립트 내 디버깅을 시작하고자 하는 부분에 set -x 를, 디버깅을 종료하고자 하는 부분에 set +x 를 삽입하고 일반적인 방법으로 스크립트를 실행하면 된다.

 

예시)

test.sh

#!/bin/bash

name="linux"
if [[ $name == "centos" ]]
then
        printf "Hello $name\n"
fi

set -x # 디버깅 시작지점
declare -i num=1
while (( num < 5 ))
do
        let num+=1
done
set +x # 디버깅 종료지점

printf "Total : %d\n" $num
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

조건문 사용시 정수 비교표현식을 많이 사용하는데, 이때 let과 test의 사용방법을 알아본다.

 

let은 (())와 같으며

test는 [[]]와 같다.

 

1. 스크립트 작성

test.sh

#!/bin/bash
x=5
y=7

(( x < y ))
echo $?

[[ x -lt y ]]
echo $?

 

2. 스크립트 실행

./test.sh

0
0

 

3. 정리

정수 비교연산시 let을 사용시에는 비교연산자로 기호(<, >, <=, >=, ==)를 사용하며,

test를 사용시에는 비교연산자로 비교문자(-lt, -gt, -le, -gt, -eq)를 사용하면 된다.

(이렇게 정리하는게 속편하다)

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

조건문을 사용할 때 문자열 비교 표현식 결과를 판단하기 위해서 싱글브라켓과 더블브라켓을 사용하는데, 그 차이를 정리한다.

참고로, 브라켓을 사용할 때는 시작 브라켓 다음에 반드시 공백이 있어야 한다. (문자열 비교시)싱글브라켓은 test와 같은 기능이다. "=" 와 "==" 는 둘다 동일비교이며, bash 버전에 따라 "=" 를 지원하지 않는다고 한다.(걍 문자열 비교는 무조건 == 를 쓰자) 표현식 판단결과가 0이면 true이며, 1이면 false이다.

참고로, "-eq" 는 문자열 비교시가 아니라 숫자 비교를 test를 사용하여 비교할 때 쓰는 비교문이다.

 

1. 테스트 스크립트

test.sh

#!/bin/bash
name=root

# 1. 정확한 문자열 매칭 테스트
# test, 싱글브라켓, 더블브라켓 모두 동일하다.
test $name = root
echo '$name = root >>> '$?

test $name == root
echo '$name == root >>> '$?

[ $name = root ]
echo '[ $name = root ] >>> '$?

[ $name == root ]
echo '[ $name == root ] >>> '$?

[[ $name = root ]]
echo '[[ $name = root ]] >>> '$?

[[ $name == root ]]
echo '[[ $name == root ]] >>> '$?



# 2. 패턴 매칭 테스트
# 싱글브라켓, test는 패턴매칭이 안된다.
# 더블브라켓은 패턴매칭이 된다.
test $name = [Rr]???
echo 'test $name = [Rr]??? >>> '$?

test $name == [Rr]???
echo 'test $name == [Rr]??? >>> '$?

[ $name = [Rr]??? ]
echo '[ $name = [Rr]??? ] >>> '$?

[ $name == [Rr]??? ]
echo '[ $name == [Rr]??? ] >>> '$?

[[ $name = [Rr]??? ]]
echo '[[ $name = [Rr]??? ]] >>> '$?

[[ $name == [Rr]??? ]]
echo '[[ $name == [Rr]??? ]] >>> '$?

 

2. 실행결과

./test.sh

$name = root >>> 0
$name == root >>> 0
[ $name = root ] >>> 0
[ $name == root ] >>> 0
[[ $name = root ]] >>> 0
[[ $name == root ]] >>> 0
test $name = [Rr]??? >>> 1
test $name == [Rr]??? >>> 1
[ $name = [Rr]??? ] >>> 1
[ $name == [Rr]??? ] >>> 1
[[ $name = [Rr]??? ]] >>> 0
[[ $name == [Rr]??? ]] >>> 0

 

3. 정리

test 명령어와 싱글브라켓은 기능이 동일하며, 더블브라켓은 패턴매칭까지 지원한다.

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

# 명령어 표현식

n=`date` # date 명령어의 실행 결과를 n 변수에 저장

n=$(date) # date 명령어의 실행 결과를 n 변수에 저장(위와 동일)

 

# 정수형 연산 표현식

declare -i n

n=10+20 # 또는 n="10 + 20" 띄어쓰기도 가능

 

# 정수현 연산 표현식

let n=10+20 # 또는 n="10 + 20" 띄어쓰기도 가능

 

# 정수현 연산 표현식

((n=10+20)) # let n=10+20 과 동일. 단, 띄어쓰기 불가능

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,

모든 위치파라미터를 저장한다는 점에서는 동일하나, 쌍따옴표(")로 둘러쌓이면 다른 의미를 갖는다.

기억하기 쉽게 설명하자면, "$*"는 모든 파라미터를 한개의 문자열로 퉁치고, "$@"는 인용문자(', ")의 의미를 살려 파라미터를 배열로 취급한다.

다음의 예제를 실행해보면 쉽게 알 수 있다.

 

코드

all.sh

#!/bin/bash
set "hong gildong" jangbogo janggilsan
declare -i cnt=0
for i in $* # 이 부분을 $*, $@, "$*", "$#" 네가지로 변경하며 실행하면 차이를 알 수 있음
do
        echo $cnt
        echo $i
        cnt+=1
done

 

실행

./all.sh

 

 

결과

$*, $@ 인 경우

0
hong
1
gildong
2
jangbogo
3
janggilsan

 

"$*" 인 경우

0
hong gildong jangbogo janggilsan

 

"$@" 인 경우

0
hong gildong
1
jangbogo
2
janggilsa
블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,