-
셸스크립트 - $, if, case, [, testLinux 2022. 12. 24. 01:43
$, if, case, [, test의 사용법에 대해 알아본다.
0. #!/bin/sh 와 #!/bin/bash의 차이
#!/bin/bash : bash 을 사용하겠다.
#!/bin/sh : /bin/sh에 링크된 쉘을 사용하겠다. 즉 심볼릭 링크 파일이다.
심볼릭 링크는 링크를 연결하여 원본 파일을 직접 사용하는 것과 같은 효과를 내는 링크를 뜻한다.
즉 여러 환경의 셸에서 동일한 셸을 쓰려면 #!/bin/bash 와 같이 명시하는 것이 좋다.
1. $
#!/bin/bash a=str b=ing echo $a echo $b echo ${a}ABC${b} c=${a}${b} echo $c --- 실행 화면 --- str ing strABCing string
= 의 좌우에는 공백이 있으면 안 된다.
변수명을 사용하려면 $, 문자열과 혼용하여 사용하려면 { } 으로 감싼다.
#!/bin/bash echo 1st argument is $1 echo 2nd argument is $2 echo The number of arguments is $# shift echo 1st argumnet is $1 --- 실행 화면 --- 1st argument is hello 2nd argument is world The number of arguments is 2 1st argumnet is world
파일 실행 시에 첫 번째 인수로 hello, 두 번째 인수로 world를 주었을 때 위와 같이 실행된다.
shift 명령어를 사용하면 $2는 $1이 되고 $3은 $2가 되며 인수가 하나씩 당겨진다.
while 문에서 인수를 당기며 $1을 계속 사용하는 방법이 일반적이다.
1.1 주요 특수 변수
$0 : 셸 스크립트 명
$n : n번째 인수
$* : 모든 인수 목록
$# : 인수 개수
$? : 직전에 실행한 명령어 상태 (반환 값)
$$ : 셸 스크립트 PID
$LINENO : 변수를 사용한 줄 번호
2. if
if else 는 리눅스에서 다음과 같이 사용한다.
#!/bin/bash if [ $1 = hello ] then echo Argument is hello elif [ $1 = world ] then echo Argument is world else echo No matching fi
조건 판정식은 [ ] 으로 감싼다. [ 는 명령어이고 ] 는 명령어 인수이므로
[ ] 의 좌우에는 한 칸 이상의 공백이 필요하다.
조건 판정 이후 참이면 then 이후 처리를 실행하고 if 문은 fi 로 끝난다.
3. case
if else 문을 case 문으로도 작성할 수 있다.
#!/bin/bash case $1 in hello) echo Argument is hello ;; world) echo Argument is world ;; *) echo No matching ;; esac
조건에는 문자열, 숫자, 정규식 패턴이 올 수 있다. 마지막 패턴을 *로 지정하여 일치하는 패턴이 없을 때 실행한다.
각 분기의 끝에는 ;; 를 붙여 분기의 끝을 구분한다.
case문은 esac 으로 끝난다.
4. test
조건 판정을 [ ] 뿐만 아니라 test 명령어로도 가능하다.
#!/bin/bash if test -f $1; then echo File $1 exists. fi
test는 문자열 판정 외에도 파일 존재여부, 숫자 크고 작음 여부 판정에도 사용한다.
명령어 끝에 줄 바꿈 대신 ; 을 사용할 수도 있다.
; 다음에는 공백문자가 필요하다.
5. [ 식 ] , test 식
조건 판정에 자주 사용하는 식으로 다음이 있다.
문자열
-n string : string 문자열 길이가 0이 아니면 참.
-z string : string 문자열 길이가 0이면 참
str1 = str2 : str1 문자열과 str2 문자열이 동일하면 참.
str1 != str2 : str1 문자열과 str2 문자열이 다르면 참.
숫자
n1 -eq n2 : 정수 n1과 정수 n2가 같으면 참.
n1 -ne n2 : 정수 n1과 정수 n2가 다르면 참.
n1 -gt n2 : 정수 n1이 정수 n2보다 크면 참.
n1 -ge n2 : 정수 n1이 정수 n2보다 크거나 같으면 참.
n1 -lt n2 : 정수 n1이 정수 n2보다 작으면 참.
n1 -le n2 : 정수 n1이 정수 n2보다 작거나 같으면 참.
파일
-b file : file 파일이 존재하고 블럭 디바이스 파일이면 참.
-s file : file 파일이 존재하고 파일 크기가 0이 아니면 참.
-S file : file 파일이 존재하고 소켓 파일이면 참.
-f file : file 파일이 존재하고 일반 파일이면 참.
-c file : file 파일이 존재하고 특수 디바이스 파일이면 참.
-e file : file 파일이 존재하면 (종류를 가리지 않고) 참.
-d file : file 파일이 존재하고 디렉터리이면 참.
-L file : file 파일이 존재하고 심볼릭 링크이면 참.
-r file : file 파일이 존재하고 읽기 가능하면 참.
-w file : file 파일이 존재하고 쓰기 가능하면 참.
-x file : file 파일이 존재하고 실행 가능하면 참.
file1 -nt file2 : file1 파일이 file2 보다 새로우면 참.
file1 -ot file2 : file1 파일이 file2 보다 오래됐으면 참.
복합식
expr1 -a expr2 : expr1 식과 expr2 식의 AND(&&)를 취함.
expr1 -o expr2 : expr1 식과 expr2 식의 OR (||) 를 취함.
!expr : expr 식을 반전시킴.
(expr) : 괄호 안의 expr 식 결과를 돌려줌. 여러식을 결합할 때 사용. ()는 back slach로 이스케이프 하거나 ''으로 감싸야함.
'Linux' 카테고리의 다른 글
셸스크립트 - 함수, bc, sed, awk (0) 2022.12.25 셸스크립트- for, seq, while, expr, getopts (0) 2022.12.24 echo, unset (0) 2022.12.24 xargs, ; (0) 2022.12.22 <, >, >>, >&, |, |&, tee (리다이렉션, 파이프) (0) 2022.12.22