패스워드 관련 설정파일

1. /etc/passwd

cut -d ":" -f 1,2 /etc/passwd

/etc/passwd 파일의 2번째 열 값이 encrypted password 를 의미하며, "x" 인 경우, 실제 encrypted password 는 /etc/shadow 파일에 저장되어있음

 

2. /etc/shadow

cat /etc/shadow

test:$6$2i(...생략):20158:0:99999:7:10:20239:
  • 2번째 열 값: encrypted password
    이 값에 "*", "!" 가 들어가는 경우는 로그인 불가 계정을 의미하며, 아래와 같다.
    • *: 시스템 계정
    • !: 잠긴 계정 또는 아직 패스워드를 설정하지 않은 계정
  • 3번째 열 값: date of last password change
    패스워드가 마지막으로 수정된 날짜. 1970.01.01 기준으로 지난 일 수.
  • 4번쨰 열 값: minimum password age
    수정된 패스워드를 사용해야하는 최소 일 수(기본값: /etc/login.defs 의 PASS_MIN_DAYS 값)
    즉, 3번째 열 값 + 4번째 열 값 날짜까지 수정된 패스워드를 사용해야 한다.
    passwd -n {일수} {유저명}
    으로 수정 가능
  • 5번째 열 값: maximum password age
    수정된 패스워드를 사용할 수 있는 최대 일 수(기본값: /etc/login.defs 의 PASS_MAX_DAYS 값)
    즉, 3번째 열 값 + 5번째 열 값 날짜까지 수정된 패스워드를 사용할 수 있다.(273년으로 사실상 영구라고 봐도 됨)
    passwd -x {일수} {유저명}
    으로 수정 가능
  • 6번째 열 값: password warning period
    패스워드 만료 경고를 알릴 일 수(기본값: /etc/login.defs 의 PASS_WARN_AGE 값)
    즉, 3번째 열 값 + 5번째 열 값 - 6번째 열 값 일 부터 경고를 띄운다.(maximum password age 에 도달하기 전 경고를 띄울 일 수)
    password -w {일수} {유저명}
    으로 수정 가능
  • 7번째 열 값: passowrd inactivity period
    패스워드 만료일이 지난 후 계정이 비활성화 되기까지의 일 수(패스워드 변경을 하지 않을시)
    즉, 3번째 열 값 + 5번째 열 값 + 7번째 열 값 일 부터 계정이 비활성됨.
    (패스워드 만료일이 지나가면 로그인 시 강제로 패스워드를 수정하게 유도되는데, 계정이 비활성화되면 아예 로그인이 제한됨.)
  • 8번째 열 값: account expiration date
    (패스워드 만료일과 관계 없는)계정 만료일
    useradd -e {YYYY-MM-DD} {유저명}
    으로 설정 가능
  • 10번째 열 값: reserved field
    예약된 필드(빈값)

e.g.

passwd -x 30 -w 5 -n 1 -i 10 test

=> test 계정에 대해 오늘을 기준으로 최소 1일, 최대 30일 후 까지 현재 패스워드를 사용할 수 있게 하되, 만료 5일 전 부터 경고를 띄우며, 만료일이 지나도 10일 동안 패스워드를 변경하지 않으면 계정을 비활성화한다.

 

3. /etc/login.defs

계정생성, 패스워드 할당시 default 로 적용되는 값

cat /etc/login.defs

ENCRYPT_METHOD SHA512 # password 를 암호화 할 때 쓰인 알고리즘

PASS_MAX_DAYS 99999 # password 최대 유효 일 수(만료까지의 일 수)
PASS_MIN_DAYS 0 # password 최소 유지 일 수
PASS_WARN_AGE 7 # password 만료 전 경고를 띄울 일 수

UID_MIN  1000 # uid 최소값
UID_MAX 60000 # uid 최대값

GID_MIN  1000 # gid 최소값
GID_MAX 60000 # gid 최대값

USERGROUPS_ENAB yes # 유저계정 삭제시 primary group 도 값이 삭제할지 여부

 

ENCRYPT_METHOD 암호화 알고리즘 별로 encrypted password 의 시작하는 값이 아래와 같다.

  • SHA256: $5$
  • SHA512: $6$ 
  • MD5: $1$

 

 

패스워드 관리 명령어

1. passwd

특정 계정에 패스워드를 할당하거나 패스워드 정책을 수정

Options:
  -d, --delete: 패스워드 삭제
  -e, --expire: 로그인할 때 새로운 패스워드를 설정하도록 유도. date of last password change 을 0 으로 세팅
  -i, --inactive {일수}: 패스워드 만료 후 계정 비활성화 유예 일 수 세팅
  -l, --lock: 패스워드 잠금(로그인 불가)
  -n, --mindays {일수}: 현재 패스워드 사용 최소 일 수 세팅
  -u, --unlock: 패스워드 잠금 해제
  -w, --warndays {일수}: 패스워드 만료 전 경고를 띄울 일 수 세팅
  -x, --maxdays {일수}: 현재 패스워드 사용 최대 일 수 세팅

 

2. chage

패스워드 만료 정책 수정

Options:
  -E, --expiredate {YYYY-MM-DD}: 계정 만료 일 세팅
  -I, --inactive {일수}: 패스워드 만료 후 계정 비활성화 유예 일 수 세팅
  -l, --list: 패스워드 만료 관련 정보 출력
  -m, --mindays {일수}: 현재 패스워드 사용 최소 일 수 세팅
  -M, --maxdays {일수}: 현재 패스워드 사용 최대 일 수 세팅
  -W, --warndays {일수}: 패스워드 만료 전 경고를 띄울 일 수 세팅

 

e.g.

chage -M 90 -m 0 -W 7 -I 20 test

=> test 계정에 대해 오늘을 기준으로 최소 0일, 최대 90일 후 까지 현재 패스워드를 사용할 수 있게 하되, 만료 7일 전 부터 경고를 띄우며, 만료일이 지나도 20일 동안 패스워드를 변경하지 않으면 계정을 비활성화한다.

 

3. usermod

계정 정보 수정, 패스워드 만료 정책 수정

Options:
  -e, --expiredate {YYYY-MM-DD}: 계정 만료 일 세팅
  -f, --inactive {일수}: 패스워드 만료 후 계정 비활성화 유예 일 수 세팅
  -L, --lock: 패스워드 잠금(로그인 불가)
  -U, --unlock: 패스워드 잠금 해제
블로그 이미지

망원동똑똑이

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

,

리눅스 배포판마다 조금씩 다르므로, 본 포스팅에서는 데비안 계열을 기본으로 합니다.(필요시 코멘트 달았음)

 

1. /etc/passwd 설명

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

 

":" 을 구분자로 7개의 필드로 이루어져 있으며, 각 필드는 아래와 같은 데이터를 지님

{유저이름}:{암호화된패스워드}:{numeric uid}:{numeric gid}:{use name or comment}:{home directory}:{login shell}

  • 암호화된패스워드: x 로 숨겨져있으며, 실제 값은 /etc/shadow 파일에 존재한다.
  • numeric uid:
    • 0: root
    • 1~999: system account(데비안 계열인 경우)
    • 1000~60000: local user(사용자 계정)
    • 60000~65535: system account
  • numeric gid: 기본적으로 user 마다 개인그룹이 생성되며, numeric uid 와 동일한 숫자를 가짐
  • login shell: nologin 인 경우 시스템 계정으로, 로그인이 차단된 계정이다.

 

2. /etc/shadow 설명

root:*:20007:0:99999:7:::
daemon:*:20007:0:99999:7:::
bin:*:20007:0:99999:7:::

 

2번째 필드가 패스워드를 의미하며, *, ! 가 들어있는 경우는 login lock 걸린 유저임.(로그인 불가)

 

3. /etc/group 설명

root:x:0:
daemon:x:1:
bin:x:2:
sample:x:3:test1,test2,test3

 

 

":" 을 구분자로 4개의 필드로 이루어져 있으며, 각 필드는 아래와 같은 데이터를 지님

{그룹명}:{그룹패스워드}:{gid}:{본 그룹을 추가그룹으로 가지는 유저들}

 

4. 계정 추가

useradd[ options] {유저명}

 

자주 사용하는 옵션 설명

  • -u: uid 지정
  • -g: gid 지정. 지정하지 않으면 1000번부터 auto increment 로 uid 가 할당됨
  • -c: 코멘트 작성
  • -d: home directory 지정
  • -e: 로그인 가능한 최대 날짜 지정
  • -G: 추가그룹 지정. 여러개 지정시 "," 로 구분자 사용
  • -m: home directory 자동 생성(레드헷 계열에서는 옵션을 지정하지 않아도 자동생성됨)
  • -o: uid 중복가능하도록 함
  • -p: 패스워드 지정. 지정 안할시 로그인 불가능 유저로 생성됨
  • -r: 시스템 계정임을 명시
  • -s: login shell 지정. 기본값 /bin/sh

 

5. 패스워드 지정

passwd {유저명}

 

패스워드를 지정하면 로그인 가능한 계정이 된다.

/etc/shadow 파일에 암호화된 패스워드가 추가된다.

 

6. 계정 정보 변경

usermod[ options] {유저명}

 

기본적으로 useradd 와 동일한 옵션을 가지며, 아래 옵션이 추가적으로 존재한다.

  • -a: 추가그룹 추가(새로 지정이 아닌 추가임. -G 옵션과 항상 같이 쓴다.)
  • -l: 유저명 수정
  • -L: 계정 잠그기. /etc/shadow 의 패스워드 앞에 "!" 문자가 추가된다.
  • -U: 계정 잠금 풀기

 

7. 계정 삭제

userdel[ options] {유저명}

 

  • -r: 메일 사서함과 home directory 까지 지우기

 

8. 그룹 추가

groupadd[ options] {그룹명}

 

  • -g: gid 지정

 

9. 그룹 변경

groupmod[ options] {그룹명}

 

  • -g: gid 변경

 

10. 그룹 삭제

groupdel {그룹명}

 

추가그룹만 삭제 가능하며, 해당 그룹을 추가그룹으로 가지고 있던 계정에게서 해당 추가그룹이 삭제된다.

 

블로그 이미지

망원동똑똑이

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

,

파일을 압축할 때는 한개의 파일씩 압축할 수 있다.

그러므로, 여러개의 파일 또는 여러개의 파일이 포함된 디렉토리를 압축하고자 할 때는, 먼저 한개의 파일로 합쳐야 한다.

이때, 한개의 파일로 합치는 작업을 archiving 이라고 하고, 압축하는 작업을 compression 이라고 한다.

 

1. 파일 및 디렉토리 archiving 하기

  • 명령어: tar -cf {결과파일명}.tar {대상파일명1}[ {대상파일명2} [...{대상파일명n}]]
  • 설명: 여러개의 디렉토리나 파일을 하나의 파일로 합치는 명령어로, 파일 권한이나 생성, 수정 날짜 모두 유지된다.
  • 예시:
    log_1.log log_2.log 파일을 log.2025-03-01.tar 으로 합치기.
tar -cvf log.2025-03-01.tar log_1.log log_2.log


2. archiving 된 파일 내용 확인하기

  • 명령어: tar -tvf {대상파일명}.tar
  • 설명: 합쳐진 tar 파일의 내용을 출력한다.
  • 예시:
tar -tvf log.2025-03-01.tar

 

3. archiving 된 파일 복구하기

  • 명령어: tar -xvf {대상파일명}.tar
  • 설명: 합쳐진 tar 파일의 내용을 합치기 이전으로 복구한다.
  • 예시:
tar -xvf log.2025-03-01.tar

 

4. 파일 compression 하기

파일 compression 에는 gzip, bzip2, xz, zip 유틸리티 중 하나가 사용된다.

gzip, bzip2, xz 는 파일 단위로만 압축 가능하다.(따라서, 여러개의 파일을 압축하고자 할 때는 archiving 을 먼저 해줘야 한다.)

 

  • gzip 명령어: gzip {대상파일명}
    => {대상파일명}.gz 으로 압축됨.
    => 원본파일이 삭제됨.
    => 파일 단위로만 압축 가능함.

 

  • bzip2 명령어: bzip2 {대상파일명}
    => {대상파일명}.bz2 으로 압축됨.
    => 원본파일이 삭제됨.
    => 파일 단위로만 압축 가능함.

 

  • xz 명령어: xz {대상파일명}
    => {대상파일명}.xz 으로 압축됨.
    => 원본파일이 삭제됨.
    => 파일 단위로만 압축 가능함.

 

  • zip 명령어: zip {압축파일명}.zip {대상파일명}
    => {대상파일명}.zip 으로 압축됨.
    => 원본파일 유지됨.
    => 디렉토리 압축 가능함.(-r 옵션 필요)

 

5. compression 된 파일 내용 확인

gzip, bzip2, xz, zip으로 compression 된 압축파일의 내용을 압축을 풀지 않고도 확인할 수 있다.

 

  • zcat 명령어: zcat {대상파일명}.gz
    => gzip 압축파일 내용 확인

 

  • bzcat 명령어: bzcat {대상파일명}.bz2
    => bzip2 압축파일 내용 확인

 

  • xzcat 명령어: xzcat {대상파일명}.xz
    => xz 압축파일 내용 확인

 

  • unzip 명령어: unzip -l {대상파일명}.zip
    => zip 압축파일 내용 확인

 

6. compression 된 파일 압축 풀기

gzip, bzip2, xz, zip 로 compression 된 압축파일을 푼다.

 

  • gunzip 명령어: gunzip {대상파일명}.gz
    => gzip -d {대상파일명}.gz 와 동일
    => 압축파일이 삭제됨.

 

  • bunzip2 명령어: bunzip2 {대상파일명}.bz2
    => bzip2 -d {대상파일명}.bz2 와 동일
    => 압축파일이 삭제됨.

 

  • unxz 명령어: unxz {대상파일명}.xz
    => xz -d {대상파일명}.xz 와 동일
    => 압축파일이 삭제됨.

 

  • unzip 명령어: unzip {대상파일명}.zip
    => zip -d {대상파일명}.zip 와 동일
    => 압축파일 유지됨.

 

요약

  압축 명령어 압축파일 확장자 원복파일 삭제 여부 압축파일 내용보기 명령어 압축풀기 명령어 압축파일 삭제 여부 디렉토리 압축가능 여부
gzip gzip {대상파일} gz O zcat {대상파일}.gz gunzip {대상파일}.gz

gzip -d {대상파일}.gz
O X
bzip2 bzip2 {대상파일} bz2 O bzcat {대상파일}.bz2 bunzip2 {대상파일}.bz2

bzip2 -d {대상파일}.bz2
O x
xz xz {대상파일} xz O xzcat {대상파일}.xz unxz {대상파일}.xz

xz -d {대상파일}.xz
O X
zip zip[ -r] {압축파일}.zip {대상파일 or 디렉토리} zip X unzip -l {대상파일}.zip unzip {대상파일}.zip

zip -d {대상파일}.zip
X O

 

7. archiving + compression

tar 커맨드의 옵션을 주어 archiving 과 compression 을 한번에 할 수 있다.

  • tar + gzip 커맨드: tar -czvf {압축파일명}.tar.gz {대상디렉토리명}
  • tar + bzip2 커맨드: tar -cjvf {압축파일명}.tar.bz2 {대상디렉토리명}
  • tar + xz 커맨드: tar -cJvf {압축파일명}.tar.xz {대상디렉토리명}

 

8. decompression + unarchiving

tar 커맨드의 옵션을 주어 decompression 과 unarchiving 을 한번에 할 수 있다.

  • tar + gzip 커맨드: tar -xzvf {대상파일명}.tar.gz
  • tar + bzip2 커맨드: tar -xjvf {대상파일명}.tar.bz2
  • tar + xz 커맨드: tar -xJvf {대상파일명}.tar.xz
블로그 이미지

망원동똑똑이

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

,
VAR="AAA"
VAR2="BBB"
if [  ]

1. 문자열, 숫자 동일여부 비교시 "=" 보다는 "==" 를 사용한다.

VAR="AAA"
if [ "AAA" == "$VAR" ]; then
	echo "권장되는 방법"
fi

 

2. 다중 비교시 "-a" 보다는 "&&"을, "-o" 보다는 "||" 을 사용한다.

3. 다중 비교시 단일 대괄호("[", "]") 보다는 쌍 대괄호("[[", "]]") 를 사용한다.

VAR1="AAA"
VAR2="BBB"
if [[ "AAA" == "VAR1" && "BBB" == "VAR2" ]]; then
	echo "권장되는 방법"
fi

 

  • "[": (single bracket)는 POSIX 표준의 일부로, 전통적인 조건문 구문임.
  • "[[" (double bracket)는 Bash의 확장 기능으로, 더 강력하고 유연한 조건문을 제공함. 패턴 매칭(=~* 등)을 지원.
블로그 이미지

망원동똑똑이

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

,

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
블로그 이미지

망원동똑똑이

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

,