1. 출력 재지정 (Output Redirection)
가장 기본적인 재지정 방법은 명령어의 출력 결과를 파일로 보내는 것입니다. Bash 쉘에서는 > 기호를 사용하며, 형식은 command > inputfile 입니다. 예를 들어, date 명령어의 출력을 특정 파일에 저장하려면 다음과 같이 합니다.
$ date > current_date.txt
$ cat current_date.txt
2023년 11월 15일 수요일 14:30:45 KST
만약 파일이 이미 존재한다면, > 연산자는 기존 파일의 내용을 새 데이터로 덮어씁니다. 데이터를 덮어쓰지 않고 추가하려면 >> 연산자를 사용합니다.
$ date >> current_date.txt
$ cat current_date.txt
2023년 11월 15일 수요일 14:30:45 KST
2023년 11월 15일 수요일 14:31:02 KST
2. 입력 재지정 (Input Redirection)
입력 재지정은 출력 재지정과 반대입니다. 파일의 내용을 명령어로 전달하는 방식입니다. 입력 재지정 기호는 < 이며, 형식은 Command < inputfile 입니다. 아래는 wc 명령어와 함께 입력 재지정을 사용한 예시입니다. wc 명령어는 파일의 줄(line) 수, 단어(word) 수, 바이트(byte) 수를 계산합니다.
$ wc < test1.txt
5 20 150
또 다른 입력 재지정 방법으로 내부(inline) 입력 재지정이 있습니다. 기호는 << 이며, 파일을 사용하지 않고 명령어 라인에서 직접 입력 데이터를 지정합니다. 아래는 wc 명령어와 함께 내부 입력 재지정을 사용한 예시입니다.
$ wc << END
> 안녕하세요
> 리눅스 쉘 스크립트입니다
> END
2 4 31
3. 파이프 (Pipe)
파이프 기호는 수직선 하나(|) 입니다. 파이프는 두 명령어 사이에 위치하여, 첫 번째 명령어의 출력을 두 번째 명령어의 입력으로 전달합니다. 형식은 command1 | command2 입니다. 리눅스 시스템은 두 명령어를 동시에 실행하며, 내부적으로 연결하여 첫 번째 명령어에서 출력이 생성되는 즉시 두 번째 명령어로 전달합니다. 중간 파일이나 버퍼가 사용되지 않습니다. 예를 들어, yum으로 설치된 모든 패키지를 조회하고, 파이프를 통해 grep 명령어로 "mysql"이 포함된 항목만 필터링합니다.
$ yum list installed | grep mysql
mysql-community-common.x86_64 8.0.31-1.el8 @appstream
mysql-community-libs.x86_64 8.0.31-1.el8 @appstream
아래는 두 개의 파이프와 재지정을 함께 사용한 예시입니다. yum list 결과를 정렬하고, 페이지 단위로 보여줍니다. 또한 출력을 yum.list 파일에 저장하고, cat 명령어로 확인합니다.
$ yum list installed | sort | more
$ yum list installed | sort > yum.list
$ cat yum.list
4. 수학 연산 명령어 (Math Operations)
Bourne 쉘에서는 expr 명령어로 숫자 연산을 수행했습니다. Bash 쉘도 이를 지원하지만, 더 간편한 방법을 제공합니다. Bash에서 수학 표현식의 결과를 변수에 할당할 때는 달러 기호와 대괄호 ($[ operation ]) 를 사용합니다. 단, 연산은 정수(Integer)만 지원합니다.
$ echo $[ 10 + 20 ]
30
$ result=$[ 100 / 3 ]
$ echo $result
33
5. 부동소수점 연산 (Floating Point Solution)
Bash의 정수 연산 한계를 극복하는 여러 방법 중 가장 흔한 것은 내장 계산기인 bc를 사용하는 것입니다.
5.1 bc 기본 사용법
Bash 계산기는 일종의 프로그래밍 언어로, 명령어 라인에서 부동소수점 표현식을 입력하고 해석하여 결과를 반환합니다. bc는 숫자, 변수, 주석, 표현식, 프로그래밍 문(if-then) 등을 인식합니다. 명령어 라인에 bc를 입력한 후, 연산할 숫자 표현식을 입력하고 엔터를 누르면 결과가 출력됩니다.
$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10 + 20
30
10 / 3
3
scale 변수를 사용하여 소수점 이하 자리수를 지정할 수 있습니다. 먼저 4자리까지 표시하도록 지정합니다.
scale=4
10 / 3
3.3333
bc -q 옵션을 사용하면 배너 메시지가 표시되지 않습니다.
$ bc -q
scale=2
a=10
b=3
a / b
3.33
5.2 스크립트에서 bc 사용하기
명령어 치환(Command Substitution)을 사용하여 bc 명령어를 실행하고, 그 출력을 변수에 할당할 수 있습니다. 형식은 다음과 같습니다.
variable=$(echo "options; expression" | bc)
options에는 scale과 같은 변수를 설정하며, 여러 개일 경우 세미콜론(;)으로 구분합니다. expression은 bc가 실행할 수학 표현식입니다. 아래는 scale 변수를 4로 설정하고, 특정 연산을 수행하는 예시입니다.
$ result=$(echo "scale=4; 10 / 3" | bc)
$ echo $result
3.3333
스크립트 내에서 변수를 사용하여 부동소수점 연산을 수행하는 예시입니다.
#!/bin/bash
num1=10.5
num2=3.2
result=$(echo "scale=2; $num1 * $num2" | bc)
echo "결과: $result"
또 다른 방법으로 내부 재지정(Here Document)을 사용할 수 있습니다. 형식은 다음과 같습니다.
variable=$(bc << EOF
options
statements
expressions
EOF
)
6. 스크립트 종료 (Exit Script)
6.1 종료 상태 코드 확인하기
쉘에서 실행되는 모든 명령어는 종료 상태 코드(exit status)를 반환합니다. 이는 명령어가 정상적으로 완료되었음을 쉘에 알리는 0에서 255 사이의 정수 값입니다. 명령어가 종료될 때 이 값을 쉘에 전달하며, 스크립트 내에서 이 값을 사용할 수 있습니다.
리눅스는 $? 라는 특수 변수를 제공하여, 마지막으로 실행된 명령어의 종료 상태 코드를 저장합니다. 마치 디버깅을 위해 중단점을 사용하는 것과 유사합니다. 명령어가 성공적으로 완료되면 종료 코드는 0이고, 명령어에 오류가 있으면 양의 정수입니다.
$ ls /etc/passwd
/etc/passwd
$ echo $?
0
$ ls /etc/nonexist
ls: cannot access '/etc/nonexist': No such file or directory
$ echo $?
2
리눅스 종료 상태 코드 목록:
| 상태 코드 | 설명 |
|---|---|
| 0 | 명령어 성공적으로 완료 |
| 1 | 일반적인 알 수 없는 오류 |
| 2 | 부적합한 쉘 명령어 |
| 126 | 명령어를 실행할 수 없음 (권한 문제) |
| 127 | 명령어를 찾을 수 없음 |
| 130 | Ctrl + C 로 종료된 명령어 |
| 255 | 정상 범위를 벗어난 종료 상태 코드 |
참고: 종료 상태 코드 126은 사용자에게 명령어를 실행할 올바른 권한이 없을 때 발생할 수 있습니다. 종료 코드 1은 명령어의 인자가 잘못되었을 때 발생할 수 있습니다.
6.2 exit 명령어
기본적으로 쉘 스크립트는 스크립트 내 마지막 명령어의 종료 상태 코드로 종료됩니다. exit 명령어를 사용하면 이 기본 동작을 변경하고, 직접 종료 상태 코드를 반환할 수 있습니다. exit 명령어는 스크립트가 종료될 때 원하는 종료 상태 코드를 지정할 수 있지만, 최대 값은 255입니다.
#!/bin/bash
echo "스크립트가 정상적으로 실행되었습니다."
exit 10
위 스크립트를 실행한 후, echo $? 명령어로 종료 상태 코드 10을 확인할 수 있습니다.
$ ./myscript.sh
스크립트가 정상적으로 실행되었습니다.
$ echo $?
10