Part 2. 기초 단계
- 차례
- 3. 종료와 종료 상태(Exit and Exit Status)
- 4. 특수 문자
- 5. 변수와 매개변수 소개
-
- 5.1. 변수 치환(Variable Substitution)
- 5.2. 변수 할당(Variable Assignment)
- 5.3. Bash 변수는 타입이 없다(untyped)
- 5.4. 특수한 변수 타입
- 6. 쿼우팅(quoting)
- 7. 테스트
-
- 7.1. 테스트(Test Constructs)
- 7.2. 파일 테스트 연산자
- 7.3. 비교 연산자(이진)
- 7.4. 중첩된 if/then 조건 테스트
- 7.5. 여러분이 테스트문을 얼마나 이해했는지 테스트 해보기
- 8. 연산자 이야기(Operations and Related Topics)
-
- 8.1. 연산자(Operators)
- 8.2. 숫자 상수(Numerical Constants)
고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 | ||
---|---|---|
3장. 종료와 종료 상태(Exit and Exit Status)
exit 명령어는 C 프로그램에서처럼 스크립트를 끝낼 때 씁니다. 또한, 스크립트의 부모 프로세스에게 어떤 값을 돌려 줄 수도 있습니다.
모든 명령어는 종료 상태( exit status (가끔은 리턴 상태( return status )라고도 하는)를 리턴합니다. 명령어가 성공시에는 0을 리턴하고 실패시에는 에러 코드로 해석될 수 있는 non-zero를 리턴합니다. 예외가 있기는 하지만, 유닉스 관례를 잘 따르는 명령어, 프로그램, 유틸리티는 성공했을 때 0을 리턴합니다.
비슷하게, 스크립트의 함수나 스크립트 자신도 종료 상태를 리턴합니다. 스크립트 함수나 스크립트에서 가장 마지막에 실행된 명령어가 종료 상태를 결정합니다. 스크립트에서 exit nnn 이라고 하면 nnn이라는 종료 상태를 쉘에게 전달해 줍니다(nnn은 0에서255 사이의 십진수여야 합니다).
참고: 매개변수 없이 그냥 exit로 끝났을 경우에는, 마지막에 실행된 명령어(exit 자신은 빼고)의 종료 상태가 스크립트의 종료 상태가 됩니다.
$? 는 제일 마지막 명령어의 종료 상태를 보여줍니다. 함수가 리턴한 다음에 $?라고 하면 함수의 마지막 명령어의 종료 상태를 알려줍니다. bash에서는 이렇게 해서 함수의 "반환값"을 돌려 줍니다. 스크립트가 종료한 다음에는 명령어줄에서 $?로 스크립트 마지막 명령어의 종료 상태를 알 수가 있는데 관습적으로 0은 성공을 나타내고 1에서 255까지의 숫자는 에러를 나타냅니다.
예 3-1. 종료/종료 상태
고급 Bash 스크립팅 가이드: Bash를 이용한 쉘 스크립팅 완전 가이드 | ||
---|---|---|
4장. 특수 문자
쉘 스크립트에서 쓰이는 특수 문자들
- #
- 주석. #으로 시작하는 줄(#!만 빼고)은 주석입니다.명령어 끝에 주석이 나올 수도 있습니다.줄 첫부분에 나오는 공백문자뒤에도 주석을 쓸 수 있습니다.참고: 당연한 이야기지만, echo 문에서 이스케이프된 #은 주석의 시작을 나타내지 않습니다. 비슷하게 몇몇 매개변수 치환이나 산술 상수 확장에 나오는 #도 주석을 나타내지 않습니다.몇몇 패턴 매칭 연산자도 #을 사용합니다.
- ;
- 명령어 구분자. [세미콜론] 두 개 이상의 명령어를 한 줄에서 같이 쓸 수 있게 해줍니다.";"는 가끔 이스케이프 시킬 필요가 있습니다.
- ;;
- case 옵션 종료자. [이중 세미콜론]
- .
-
또다른 문맥에서는 그냥 ls 라고 쳤을 때, 보이지 않는 "숨김" 파일을 나타내는 파일명 접두어로도 쓰입니다.
- "
- 부분 쿼우팅(partial quoting). [이중 쿼우트] "문자열" 이라고 하면 쉘이 문자열에 들어 있는 거의 대부분의 특수 문자를 해석하지 못하도록 막아줍니다. 6장을 참고하세요.
- '
- 완전 쿼우팅(full quoting). [단일 쿼우트] '문자열' 이라고 하면 쉘이 문자열에 들어 있는 모든 특수 문자를 해석하지 못하도록 막아줍니다. "보다 더 강한 형태의 쿼우팅입니다. 6장을 참고하세요.
- ,
- 콤마 연산자. 콤마 연산자 는 연속적인 산술 연산을 하려고 할 때 쓰입니다. 모든 계산이 이루어진뒤, 마지막에 계산된 결과만 리턴됩니다.
- \
- 이스케이프(escape). [역슬래쉬] \X라 고 하면 X 문자를 "이스케이프" 시키고, 'X' 라고 "쿼우팅" 시키는 것과 동일한 효과를 갖습니다. \는 "나 '이 문자 그대로 해석되도록 쿼우트 할 때 쓰일 수도 있습니다.이스케이프된 문자들에 대한 설명이 6장에 자세하게 되어 있습니다.
- /
- 파일명 경로 구분자. [슬래쉬] 파일명에 등장하는 각 요소들을 구분해 줍니다(/home/bozo/projects/Makefile 처럼).나누기 산술 연산자도 됩니다.
- `
- 명령어 치환(command substitution). [백틱(backticks)] `명령어` 라고 하면 명령어의 결과를 변수값으로 설정할 수가 있습니다. 다른 말로 backticks나 역쿼우트(backquote)라고도 합니다.
- :
- 무한 루프:if/then 테스트 문의 Placeholder:here document가 나올 곳의 placeholder를 제공. 예 17-8 참고.재지향 연산자인 >과 같이 써서 특정 파일의 퍼미션 변경 없이 크기를 0으로 만들어 줍니다. 파일이 없었다면 새로 만들어 냅니다.역시 재지향 연산자인 >>과 같이 쓰면 파일의 억세스/변경 시간을 업데이트 해 줍니다(: >> new_file). 파일이 없었다면 새로 만들어 냅니다. touch와 같습니다.참고: 보통 파일에만 사용하고 파이프나 심볼릭 링크, 특수 파일에는 사용하지 마세요.권장하는 방법은 아닙니다만, 주석의 시작을 나타낼 때 쓸 수도 있습니다. 주석에 #을 쓰게 되면 그 줄의 나머지 부분에 대해서 에러 확인을 안 하기 때문에 어떤 문장도 올 수 있지만 :의 경우는 다릅니다.":"는 또한 /etc/passwd와 $PATH 변수에서 필드 구분자로도 쓰입니다.
- !
- 다른 상황에서는 간접 변수 참조의 의미로도 쓰입니다.
- *
-
이중 별표, **, 는 수학의 누승(累乘, exponentiation) 연산자입니다.
- ?
- 와일드 카드(하나의 문자). [물음표] ? 문자는 확장 정규 표현식에서 한 문자를 나타내는 것과 마찬가지로 글로빙(globbing)에서 파일명 확장을 나타내는 한 문자짜리 "와일드 카드"의 역할을 합니다.
- $
- ${}
- $*, $@
- ()
- 명령어 그룹.중요: 소괄호로 묶인 명령어들은 서브쉘에서 동작합니다.스크립트의 다른 곳에서는 소괄호 안의 서브쉘에 들어 있는 변수들을 볼 수가 없습니다. 부모 프로세스인 스크립트는 자식 프로세스(서브쉘)에서 만들어진 변수를 읽을 수가 없습니다.배열 초기화.
- {xxx,yyy,zzz,...}
- 중괄호 확장.
- {}
- 코드 블럭. [중괄호] "인라인 그룹"이라고도 부르는 중괄호 한 쌍은 실제로 익명의 함수를 만들어 냅니다만 보통의 함수와는 달리 코드 블럭 안의 변수들을 스크립트의 다른 곳에서 볼 수가 있습니다.중괄호로 묶인 코드 블럭은 I/O 재지향되거나 재지향을 받을 수 있습니다.예 4-1. 코드 블럭과 I/O 재지향예 4-2. 코드 블럭의 결과를 파일로 저장하기
- {} \;
-
참고: ";" 는 find 명령어의 -exec 옵션이 여러개 나올 때 끝을 나타내기 때문에 쉘이 해석하는 것을 막기 위해서 이스케이프 시켜줘야 됩니다.
- [ ]
- 테스트.[ ] 사이의 테스트문. [는 쉘 내장 명령인 test와 동의어로서, 외부 명령어인 /usr/bin/test의 링크가 아닙니다.
- [[ ]]
- 테스트.[[ ]] 사이의 테스트문(쉘 키워드).더 자세한 사항은 [[ ... ]]을 참고하세요.
- (( ))
- 정수 확장.(( ))에 들어 있는 정수 표현식을 확장하고 평가해 줍니다.더 자세한 설명은 (( ... ))를 참고하세요.
- > >& >> <
- 재지향.scriptname >filename 은 scriptname의 결과를 filename으 로 재지향시킵니다. 이 때, fielname이 이미 있다면 덮어 써집니다.command >&2는 command의 결과를 표준에러로 재지향 시킵니다.scriptname >>filename은 scriptname의 결과를 filename 으로 덧붙입니다. 이 때, filename이 없다면 새로 만듭니다.프로세스 치환(process substitution).(command)><(command)
- <<
- here document에서 쓰이는 재지향.
- |
- 파이프. 여러 명령어들을 연결하는 방법으로써, 한 명령어의 출력을 다음 명령어나 쉘에게 전달.명령어의 출력이나 명령어 자체를 스크립트로 파이프를 걸 수도 있습니다.
- >|
- 강제 재지향(noclobber 옵션이 켜 있더라도). 파일이 이미 존재하더라도 강제로 덮어 쓰게 합니다.
- &
- 작업을 백그라운드로 돌리기. 명령어 뒤에 &를 붙여 주면 백그라운드로 실행됩니다.
- -
- 표준입력(stdin)과 표준출력(stdout) 서로간의 재지향. [대쉬]여기서 쓰인 "-"는 Bash 연산자가 아니고, tar나 cat 같은 몇몇 유닉스 유틸리티들이 인식해서 표준출력으로 쓰도록 해주는 옵션임에 주의하세요.파일명이 나와야 할 곳에 -이 나오면 표준출력으로 결과를 재지향하든지(tar cf에 서 가끔 쓰죠), 실제 파일에서 입력을 받지 않고 표준입력에서 받도록 재지향 하게 해 줍니다. 주로 파일을 다루는 유틸리티들을 파이프에서 필터로 쓸 때 이 방법을 씁니다.- 는 표준출력을 다른 명령어로 파이프 시키는데 쓰일 수 있습니다. 이렇게 하면 파일의 앞쪽에 줄을 삽입하기같은 묘기도 부릴 수 있습니다.diff를 써서 섹션을 가진 두 파일을 비교해 보기 바랍니다.grep bash file1 | diff file2 -마지막으로, tar에 -를 쓴 현실적인 예제입니다.예 4-3. 최근 하루동안 변경된 파일들을 백업하기
- -
- 바로 전 작업 디렉토리. [대쉬] cd - 라고 하면 $OLDPWD 환경 변수를 이용해서 바로 전 작업 디렉토리로 옮겨갑니다.
- -
- 빼기. 산술 연산에서 쓰이는 빼기 부호.
- =
- Equals. 할당 연산자
- +
- 더하기. 덧셈 산술 연산자.
- %
- ~
- 홈 디렉토리. [틸드] 이 문자는 $HOME 내부 변수에 해당합니다. ~bozo 는 bozo의 홈 디렉토리를 나타내고ls ~bozo 는 그 홈 디렉토리의 내용을 보여줍니다. ~/ 은 현재 사용자의 홈 디렉토리를 나타내고, ls ~/ 는 그 홈 디렉토리의 내용을 보여줍니다.
- ~+
- 현재 작업 디렉토리. 이 문자는 $PWD 내부 변수에 해당합니다.
- ~-
- 바로 전 작업 디렉토리. 이 문자는 $OLDPWD 내부 변수에 해당합니다.
- 제어 문자
- 터미널이나 텍스트 디스플레이의 동작을 변경. 제어 문자는 CONTROL + key 조합으로 나타낼 수 있습니다.
- 공백문자(whitespace)
- 명령어나 변수의 구분자 역할. 공백문자는 빈칸, 탭, 빈줄들의 어떠한 조합들로 이루어져 있습니다. 변수 할당같은 상황에서 공백문자를 쓰면 문법 에러가 납니다.빈줄은 스크립트 동작에 아무 영향도 주지 않기 때문에 기능별로 구분시켜서 보기 좋게 하는데 쓸 수 있습니다.특수 변수인 $IFS는 어떤 명령어의 입력 필드를 구분해 주는데 이 변수의 디폴트값은 공백문자입니다.