[Linux] 쉘스크립트(sell script)
- 쉘 스크립트
- 명령어들을 연속적으로 실행하는 인터프리터 환경 제공
- 제어문과 변수 선언 등이 가능한 프로그래밍 언어와 유사
- 컴파일 과정이 없고 인터프리터가 소스 파일에서 명령문을 판독하여 각각의 명령을 수행
- 쉘 스크립트 언어 기본
- 일반적으로 ‘.sh’라는 확장자를 가짐
- 01 : #!/bin/bash
기본 시작을 지정함
- 02 : echo Hello Linux
- 01 : #!/bin/bash 는 해당 스크립트를 실행하기 위한 쉘의 경로
- 02 : 실제 명령
- 스크립트 파일에 실행 권한을 부여해야 실행 가능
- chmod u+x myscript.sh
- './파일명''으로 실행 (예: ./myscript.sh)
- 예, 현제디렉토리의 목록을 홈디렉토리에 myeir.txt에 넣어라, 그걸 more형식으로 출력하라
- vi mydir 로 파일을 편집 (i로 입력모드, <Esc>로 명령모드, ZZ)
- #!/bin/bash
- ls –l > ~/mydir.txt
- cat ~/mydir.txt | more
- 실행권한 부여
- chmod 'u+x,g+x' mydir 또는 chmod +x mydir
- 실행
- ./mydir
- 리다이렉션
- 리다이렉션은 입력, 출력을 파일로 지정
- 표준입력(stdin), 표준출력(stdout), 표준에러(stderr)
- 표준입력을 파일로 지정 : < 또는 << 사용
- 표준출력을 파일로 지정 : > 또는 >> 사용
- 예: ls -l > list_l.txt
- 표준에러를 파일로 지정
- 예: grep abc * 2> grep_errors.txt
- 표준출력을 표준에러로 보내기
- 예: grep abc * 1>&2
- 변수
- 쉘 프로그램에 전달됨, 명령 행 인수(argument) 등(예 : ls –l ${1} > ~/mydir.txt)
- ${?}, ${인수번호} 등
- 조건문
#!/bin/bash
if [ ${1} -lt 1 ]; then
echo "Less than 1"
elif [ ${1} -gt 3 ]; then
echo "Greater than 3"
else
if [ ${1} -eq 1 ]; then
echo "one"
elif [ ${1} -eq 2 ]; then
echo "two"
elif [ ${1} -eq 3 ]; then
echo "three"
fi
fi
- 조건 비교 연산의 종류
- A –eq B : A와 B의 값이 같다
- A –ne B : A와 B의 값이 같지 않다
- A –gt B : A가 B보다 크다
- A –lt B : A가 B보다 작다
- A –ge B : A가 B보다 크거나 같다
- A –le B : A가 B보다 작거나 같다
- 문자열 비교
- string1 = string2 (또는 string1 == string2) : string1과 string2가 같음
- string1 != string2 : string1과 string2가 같지 않음
- string : string이 정의되어 있고 NULL 이 아님
- -z string : string이 정의되어 있지 않거나 NULL 임
- 파일 검사
- -e file : file이 존재함
- -f file : file이 존재하며 일반 파일이고 디렉터리가 아님
- -d dir : dir이 존재하며 디렉터리임
- -r file : file이 존재하며 읽기 가능
- -w file : file이 존재하며 쓰기 가능
- -x file : file이 존재하며 실행 가능
- 논리 연산자
- !condition : NOT
- condition1 -a condition2 : AND
- condition1 -o condition2 : OR
- 조건 검사
- 조건문이나 순환문에서는 'test condition' 또는 '[ condition ]'으로 조건을 검사할 수 있다. 비교 연산자, 검사 연산자, 논리 연산자를 이용하여 표현식의 조합이 가능하다. 조건 검사의 예는 다음과 같다. if test $a -eq $b (변수 a의 값이 변수 b의 값과 같으면)
if [ $1 = unix ] (첫 번째 명령행 인수가 'unix'이면)
if [ $1 = unix -a $2 = system ] (첫 번째 명령행 인수가 'unix'이고 두 번째 명령행 인수가 'system')
while test $A -lt 0 (변수 A의 값이 0보다 크면)
while [ -e test.txt ] (test.txt 파일이 존재하면)
- 논리 연산자
- 'test condition' 또는 '[ condition ]'는 다음 논리 연산자로 조합이 가능하다.
! : NOT
&& : AND
|| : OR
- 'test condition' 또는 '[ condition ]'를 논리 연산자로 조합한 예는 다음과 같다. if [ $# -gt 0 ] && [ $# -lt 4 ] ( if [$# -gt 0 -a $# -lt 4 ]의 의미와 동일함)
- 산술 연산자 및 논리 연산자[expr]
- expr 명령은 'expr expression' 형태로 사용되며 'expr expression'의 결과값은 expression을 평가한 값이다. 쉘 명령 프롬프트에서 다음과 같은 명령을 수행할 수 있다.
expr 1 + 2 (더하기 연산의 결과인 3이 출력됨)
expr 1\* 2 (곱하기 연산의 결과인 2가 출력됨), 곱샘인식을 위해 \*(*는 리눅스에서 모든으로 인식)
expr 1 < 2 (비교 연산 <의 결과가 참이므로 1이 출력됨)
expr 1 > 2 (비교 연산 >의 결과가 거짓이므로 0이 출력됨)
- 산술 연산자 + : 더하기
- : 빼기
* : 곱하기 (wildcard 문자와 혼돈을 피하기 위해 *로 표현)
/ : 나누기
% : 나머지
- 비교 연산자
= : 같다
!= : 같지 않다
< : 작다 (redirection 문자와 혼돈을 피하기 위해 <로 표현)
> : 크다 (redirection 문자와 혼돈을 피하기 위해 >로 표현)
<= : 작거나 같다(redirection 문자와 혼돈을 피하기 위해 <=로 표현)
>= : 크거나 같다(redirection 문자와 혼돈을 피하기 위해 >=로 표현)
- 논리 연산자
& : AND
| : OR
- 산술식
쉘 스크립트에서는 '$( )' 기호를 이용하여 '$( )' 자리를 expr 명령의 결과값으로 치환하여야 산술식의 값을 구할 수 있다. 쉘 스크립트 내에서 사용 예는 다음과 같다. 참고로 변수에 expr 명령의 결과값을 대입하기 위해서는 'sum=$('와 같이 '변수명', '=', '$', '(' 사이에 공백을 두어서는 안 된다.
sum=$( expr $a + $b )
sub=$( expr $a - $b )
mul=$( expr $a \* $b )
div=$( expr $a / $b )
mod=$( expr $a % $b )
- 특수문자
- '…' : 안의 내용을 해석하지 않음
- 예 : echo ' " $PATH " ' (" $PATH " 가 그대로 출력됨)
- "…" : 안의 특수 문자를 일반 문자로 취급
- $, \, ` 등의 특수 문자는 해석함
- 예 : echo " ' $PATH ' " (겹따옴표 안에 있으므로 홑따옴표 문자가 그대로 출력되고 $ 문자는 해석되므로 홑따옴표로 둘러싸인 PATH 환경변수 값이 출력됨)
- `…` 또는 $(…) : 안의 내용을 실행함. 둘러싸인 내용을 실행하는 것을 command substitution라고 함
- 예1 : echo " Today is `date` " ('Today is' 문자열에 이어 date 명령이 실행결과가 출력됨)
- 예2 : echo $( expr 3 \* 7 ) (expr 명령이 실행되어 21이 출력됨)
- 순환문의 종류
- do ~ done 사이의 구문을 지정한 조건만큼 반복
- 순환문의 종류 : for, while, until
- for 문 : 각 원소에 대해 구문을 수행
- while 문 : 조건이 참인 동안 구문을 수행
- until 문 : 조건이 거짓인 동안 구문을 수행
- for 문 형식
for 변수 in list1 ... listn 또는 for ((초기값; 조건; 증가식))
do
문장(들)
done
- for 문 조건의 예
- 예1 : for num in 1 2 3 4 5 6 7 8 9
- 예2 : for (( num=1; num<=9; num++ ))
- while 문
while 조건
do
문장(들)
done
- while 문 조건의 예
- 예1 : while [ $num –le 9 ]
- 예2 : while test $num –le 9
- until 문 형식
until 조건
do
문장(들)
done
- until 문 조건의 예
- 예1 : until [ $num –gt 9 ]
- 예2 : until test $num –gt 9
- 함수
function 함수명
{
문장(들)
}
- 함수 호출 형식 : 함수명 또는 함수명 인자(들)
- 함수 호출 예 : 명령행 인수가 있으면 해당 단의 구구단을 출력하고 인수가 없으면 사용법을 출력하는 쉘 스크립트이다. mult $1 으로 첫 번째 명령행 인수를 mult 함수에 인수로 넘겨준다.
#!/bin/bash
function mult
{
for ((i=1; i<=9; i++))
do
echo " $1 * $i = $( expr $1 \* $i ) "
done
}
if [ $# -eq 0 ]
then
echo "Usage: $0 integer_number"
else
mult $1
fi
- 디버깅
- 쉘 스크립트의 첫 번째 행에 -x를 추가
- #!/bin/bash -x
댓글
댓글 쓰기