[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

댓글

이 블로그의 인기 게시물

[유니티] 오류 사례 "Moving file failed", "Temp"

[유니티 사례] 비주얼 스튜디오(Visual Studio) 실행 오류

[유니티] 구글 지도 출력 샘플