인자의 갯수는 '$#' 라는 변수
인자를 모두 지칭은 "$@" 라는 변수
쉘(shell)이란 우리가 예전에 알고 써왔던 Dos Shell과 같은 개념이다..즉, 명령어를 가져와서 해석하고 해석된 명령어를 실행하게끔 도와주는 명령처리기라고 할 수 있다. 즉 이들은 아래의 그림에서처럼 user와 kernel이 Communication을 할 수 있도록 해주는 역할을 한다. 유닉스/리눅스를 부팅을 하고 login을 하면 shell(shell prompt: $, #)이 뜨게 되고 사용자 명령이 내려기지까지 기다리게 된다.
만약, shell이 없다면 사용자는 로긴을 할 수 없다. 그래서 root 소유자가 /etc/passwd에서 사용자의 사용 shell, 보통 Linux에서는 /bin/bash를 사용하는데 이 부분을 지우면 그 사용자는 로긴을 할 수 없게 된다.
유닉스/리눅스에서는 일반적으로 Bourne Shell, C Shell을 지원한다. 가장 기본이 되는 것은 Bourne Shell로서 여기서 필요에 의해서 많은 변종 Shell들이 생겨났다.
리눅스에서 제공하고 있는 Shell은 Unix에서 사용하고 있는 Bourne Shell을 본 딴 bash(Bourne Again Shell)과 C Shell을 본 딴 tcsh이 기본적으로 제공되고 있으며, 그밖에 많은 Shell들이 있지만 여기서는 bash와 tcsh에 대해서만 살펴보기로 하자.
리눅스의 bash는 Unix의 Bourne Shell 문법을 모두 만족하며 그외에 더 나은 C Shell의 일부분도 포함을 하고 있는 보다 발전적인 Shell이라 할 수 있다. 그리고 bash는 기본적인 리눅스 쉘이며 root 쉘이기도 하다.
root쉘이란 root 계정 사용자가 사용하는 shell을 의미하는데 리눅스를 부팅하고 login을 한 상태에서 ps 명령을 쳐보면 현재 사용하고 있는 쉘의 종류를 알 수 있다.
아래를 보면, PID 6418번으로 root shell인 bash가 작동하고 있음을 볼 수 있다.
[root@bluestar bluesky]# ps
PID TTY TIME CMD
6417 ttyp2 00:00:00 su
6418 ttyp2 00:00:00 bash
6421 ttyp2 00:00:00 ps
[root@bluestar bluesky]#
리눅스의 tcsh는 유닉스의 C Shell을 본 딴 것으로서 bash와 유사하다. 그러나 bash의 문법으로 짜여져 실행된 Shell 프로그램은 tcsh에서도 실행이 가능하지만, tcsh에서 짜여진 Shell 프로그램은 bash에서는 실행되지 않는다. 이러한 단점이 있는 반면 그만큼 막강한 기능들이 있으므로 응용할 수 있으면 상당히 편리하다. 보통 대부분의 리눅스나 유닉스는 Bourne 쉘과 C 쉘을 모두다 가지고 있으므로 걱정할 일은 아니다.
현재 bash를 사용하고 있는데 tcsh로 바꾸고자 할 경우는 아래와 같이 하면 된다.
[bluesky@bluestar bluesky]$ exec tcsh <- 또는 그냥 tcsh만 해도 된다.
[bluesky@bluestar ~]$ exec bash
[bluesky@bluestar bluesky]$
간단히 말해서 키보드에서 들어오는 명령이 표준입력이라 하고 , 유저의 터미널, 콘솔로 보내지는 출력을 표준출력이라고 한다. 그 출력은 프린터, 파일로도 갈 수가 있는데 이에 대해서는 다음에 나오는 리다이렉션에서 알아보기로 할 것이다.
여기서 사용자의 터미널이라는 것은 아래와 같이 tty tty1 tty2 ....라고 디스플레이 된 것을 의미한다.
[bluesky@bluestar bluesky]$ ps
PID TTY TIME CMD
2863 ttyp2 00:00:00 bash
6450 ttyp2 00:00:00 ps
표준입력은 모든 명령을 받아들이는 입력의 가장 기본적인 스트림이다. 그러나 때에 따라서는 키보드가 아닌 다른 스트림을 통해서 표준입력으로 보낼수도 있다. 이 경우는 표준입력은 명령이 아닌 데이터스트림을 받아들이는 통로가 된다. 표준출력은 기본적으로 터미널로 가게되는 스트림이지만 가끔은 외부의 다른 네트워크를 통해서 다른 호스트의 표준입력으로도 전달할 경우도 있다.
여기서 잠깐, 디바이스 장치에 대해 조금 알아보자. 리눅스/유닉스에서는 프린터, 디스크 드라이브, 터미널 같은 디바이스 장치를 하나의 파일로 간주하기 때문에 각각마다 고유의 파일이름을 가지고 있다. 리눅스 디렉토리내에 보면 /dev라는 디렉토리가 있는데 거기에 모든 디바이스 파일들이 들어있다.
위에서 ps 명령에서 살펴보았듯이 유저 bluesky는 ttyp2라는 터미널(TTY)을 사용하고 있는데 이 역시 하나의 장치화일이며 이 역시 /dev에 있다. 아래를 보면 ttyp2라는 터미널 장치가 보일 것이다.
[bluesky@bluestar bluesky]$ cd /dev
[bluesky@bluestar /dev]$ ls -l ttyp*
crw-rw-rw- 1 root root 3, 0 Apr 5 21:04 ttyp0
crw------- 1 bluesky tty 3, 1 Apr 8 14:32 ttyp1
crw------- 1 bluesky tty 3, 2 Apr 9 16:10 ttyp2
crw-rw-rw- 1 root root 3, 3 Apr 9 12:09 ttyp3
crw-rw-rw- 1 root root 3, 4 Mar 30 03:31 ttyp4
crw-rw-rw- 1 root root 3, 5 Mar 30 04:01 ttyp5
crw-rw-rw- 1 root root 3, 6 Feb 19 09:33 ttyp6
crw-rw-rw- 1 root root 3, 7 Feb 19 09:34 ttyp7
...
즉, bluesky는 /dev에 있는 여러 터미널 장치들중 하나인 ttyp2를 사용하고 있는 것이다.
이제 표준입력/표준출력을 가장 잘 보여주는 예로 cat 명령을 살펴보기로 하자.
cat는 다음에 아규먼트가 붙으면 그 파일의 내용을 화면에 보여주지만, 아무런 아규먼트를 붙이지 않고 cat를 실행하면 표준입력인 키보드로부터 입력받은 내용을 표준출력인 사용자 터미널에 보여준다.
[bluesky@bluestar /dev]$ cat
표준입력인 키보드에서 내용을 입력하면 표준출력인 터미널에 표시된다 <- 키보드에서 입력
표준입력인 키보드에서 내용을 입력하면 표준출력인 터미널에 표시된다 <- 터미널에 표시
^D <- EOT(End Of Text)로 cat에게 "이제 그만 하겠다"고 알려준다.
[bluesky@bluestar /dev]$
이번에는 파이프와 리다이렉션에 대해 살펴보기로 하자.. 이것들은 앞에서 다룬 표준입력과 표준출력을 좀더 다양하게 다룰 수 있게 해준다. 다시말해, 표준입력으로 들어온 데이터를 가공할 수도 있고, (필터를 적용하여) 혹은 데이터를 다른곳으로 보낼수도 있고(파일로 저장하거나) 혹은 그냥 버리거나 표준에러와 같은 특수한 곳으로 보낼수도 있다. 이러한 것들을 잘 사용하면 작업을 훨씬 효율적으로 할 수 있으니 잘 익혀두기 바란다.
파이프는 "|" 문자를 말하는 것으로 한 프로세스의 표준 출력을 다른 프로세스의 표준입력으로 연결하는 방법을 말한다.
사용은 아래와 같이 한다.
command1 | command2 | command3
위의 경우는 command1의 명령의 결과는 파이프를 통해서 command2에 전달되어 처리되고, 다시 command2에 전달되어 처리된 데이터가 command3의 입력으로 전달되어 최종적으로 표준출력으로 나가게 된다.
가장 간단한 예를 들어보면 /dev 디렉토리에서 ls로 화일 목록을 보게되면 화일이 너무 많아 다 지나가 버리게 되는데..이때 파이프를 사용하여 이 ls의 결과를 more의 입력으로 하여 한줄씩 보려고 할 때 다음과 같이 ls | more라고하면 목록이 한 화면씩 보이게 된다.
[bluesky@bluestar /dev]$ ls |more
MAKEDEV
MAKEDEV.ibcs
MAKEFLOPPIES
X0R
arp
atibm
audio
audio1
aztcd
bpcd
capi20
capi20.00
capi20.01
capi20.02
capi20.03
capi20.04
capi20.05
capi20.06
capi20.07
capi20.08
capi20.09
capi20.10
--More--
위에서 보았듯이 이 pipe 응용하면 다양한 작업을 쉽게 할 수 있을 것이다.
방향재지정(Redirection:리다이렉션)이란 표준입력이나 표준출력을 꼭 키보드나 터미널로 하는 것이 아니라 임의로 방향을 바꿔 키보드가 아닌 파일로부터 입력을 받거나, 터미널로 출력하는 것이 아니라 파일로 출력하는 것을 말한다.
표준입력을 바꿀때는 < 또는 <<를 사용하고, 표준출력을 바꿀때는 > 또는 >>를 사용한다.
임의의 파일을 작성할때 사용하는 "cat > test"라는 명령을 예로들어 알아보자
원래 cat는 표준입력인 키보드로부터 입력받은 내용을 표준출력인 터미널로 보내는 명령인데 위의 경우는 표준출력을 터미널이 아닌 test라는 파일로 바꾼 경우이다(표준입력은 그대로 키보드이다).
즉 키보드에서 입력한 내용이 터미널(화면)에는 다시 표시되지 않고 test 파일속에 들어가는 것이다. 아래를 보라..
[bluesky@bluestar bluesky]$ cat > test
이것은 테스트 파일이다.
^D
[bluesky@bluestar bluesky]$ ls
Desktop hacking han.gif hanterm.gif mbox nsmail public_html test x.gif
[bluesky@bluestar bluesky]$ vi test
이것은 테스트 파일이다.
~
~
:q!
[bluesky@bluestar bluesky]$
이제 반대로 표준출력은 그대로 터미널로 하고 표준입력을 키보드가 아닌 파일로 하는 경우를 보자. 이는 보통 파일의 내용을 볼때 사용하는 "cat test"(test 파일의 내용을 보는 명령) 과 결과는 동일하다. 즉 "cat < test"는 표준 출력은 그대로 터미널이며 표준입력은 키보드가 아닌 test라는 파일이다. 그러므로 위와 같은 명령을 쓰면 test 파일의 내용이 터미널에 표시되는 것이다.
[bluesky@bluestar bluesky]$ cat < test
이것은 테스트 파일이다.
[bluesky@bluestar bluesky]$
여기서 한가지 주의할 것은 "cat > test" 명령에서 만약 test 라는 파일에 어떤 내용이 들어 있었다면 그 내용은 지워지고 새로운 내용이 들어가게 된다는 것이다. 이런 경우를 방지하려면 기존 내용은 그대로 두고 기존내용의 다음에 새롭게 추가되는 형식으로 명령을 주면되는데 이때에는 > 가 아닌 >>를 사용하면 된다.
이번에는 표준에러에 대해 알아보자.
[bluesky@bluestar bluesky]$ ttt
bash: ttt: command not found
[bluesky@bluestar bluesky]$
위를 보면 ttt라는 명령을 내렸는데..그런 명령은 없다고 한다. 이와 같은 에러 메시지를 표준에러(Standard error)라고 한다.
이런 에러 메시지를 화면상에는 보이지 않고 err라는 파일로 저장하려고 할 경우 아래와 같이 하면 된다.
[bluesky@bluestar bluesky]$ ttt 2> err
[bluesky@bluestar bluesky]$
위와 같이 하면 앞에서처럼 에러메시지가 화면상에는 보이지 않고, err라는 파일의 내용을 보면 거기에 에러 메시지가 있게 된다.
위에서 2가 표준에러를 의미하는 파일기술자(file descriptor)이다. '0'은 표준입력, '1'은 표준출력을 의미한다.
지금까지의 내용을 종합해서 /(root)아래에서 중간에 'linux'라는 단어를 포함하는 모든 화일을 찾아서 find라는 파일에 저장하고 에러메시지는 err라는 파일에 저장하려고 할 경우에 아래와 같이 한다.
[bluesky@bluestar bluesky]$ find / -name *linux* 1> find 2>err
화면상에는 아무런 내용도 보이지 않는다.
find의 내용을 보면 아래와 같이 결과가 보인다.
[bluesky@bluestar bluesky]$ vi find
/etc/rc.d/init.d/linuxconf
/etc/rc.d/rc0.d/K00linuxconf
/etc/rc.d/rc1.d/K00linuxconf
/etc/rc.d/rc2.d/S99linuxconf
/etc/rc.d/rc3.d/S99linuxconf
...
그리고 err의 내용을 보면 아래와 같은 접근거부의 에러메시지가 보일것이다..
[bluesky@bluestar bluesky]$ vi err
find: /etc/uucp: Permission denied
find: /tmp/kfm-cache-0: Permission denied
find: /var/lib/pgsql/base: Permission denied
find: /var/lib/nfs/sm: Permission denied
find: /var/lib/nfs/sm.bak: Permission denied
...
이제 마지막으로 표준에러 메시지를 파일이 아니고, 화면상에도 표시되지 않고 그냥 버려버리고 싶을 경우는 아래와 같이 한다.
[bluesky@bluestar bluesky]$ find / -name *linux* 1> find 2>/dev/null
위와 같이 하면 에러메시지는 /dev/null이라는 파일에 들어가는 것이 아니고 그냥 버려진다.
bourne 쉘과 c쉘에서의 입력과 출력방향전환 방법은 약간 차이가 있는데 아래와 같다.
기호
C shell
Bourne shell
>
표준출력을 새로운 파일로
표준출력을 파일로
>!-d
표준출력을 기존의 파일로
사용하지 않음
>>
표준출력을 기존의 파일에 덧붙임
표준출력을 기존의 파일에 덧붙이거나 새로운 파일로
<
표준입력을 파일에서
표준입력을 파일에서
>&
표준출력, 에러를 새로운 파일로
사용하지 않음
>&!
표준출력, 에러를 기준의 파일로
사용하지 않음
>>&
표준출력과 에러를 기존의 파일에 덧붙임
사용하지 않음
1>
사용하지 않음
표준출력을 파일로
2>
사용하지 않음
표준에러를 파일로
>&2
사용하지 않음
표준출력,표준에러를 결합하고, 결과를 표준출력으로
명령을 내려서 프로세스를 생성시키는 방법에는 두가지가 있다. 하나는 포그라운드이고, 다른 하나는 백그라운드이다.
쉘 프롬프트 상에서..그냥 명령을 입력하여 실행시키면 그 명령은 포그라운드(Foreground)로 프로세스를 실행하는 것이다.. 포그라운드로 명령을 내리면 쉘은 실행중인 프로세스가 종료가 되기까지 다른 명령을 실행할 수 없도록 쉘 프롬프트를 보여주지 않고 프로세스를 처리한다. 이렇게 포그라운드로 동작중인 프로세스를 강제로 종료시키려고 할 때는 'Ctrl+C' 키를 누르면 실행중인 프로세스가 종료된다. 그러나 어떤 작업을 하다보면 그 작업량이 처리시간이 길어서 오랜 시간 동안 기다려야 할 경우가 생기는데 이럴 경우 해당 작업이 끝날때까지 기다릴 필요없이 다른 작업을 할 수 있도록 해주는 것이 백그라운드인데 이렇게 프로세스를 백그라운드로 프로세스를 생성시키고자 할 경우에는 명령어 다음에 &(앰퍼센드)를 붙여주면 된다. 이렇게 되면 프로세스는 백그라운드로 동작을 하게되고 쉘 프롬프트가 다시 뜨게 되므로 사용자는 다른 작업을 할 수 있게 된다.
이제 실제로 프로세스를 백그라운드로 생성해보자..
[bluesky@bluestar bluesky]$ find / -name *linux* > find 2>/dev/null&
[1] 1033
위에서 [1]은 작업번호이고 "1033"은 PID(Process ID)이다.
이렇게 백그라운드로 동작중인 프로세스를 중지시키는 명령이 kill이다. 중지시키는 방법에는 두가지가 있는데 하나는 작업번호로 중지시키는 것이고, 다른 하나는 PID로 중지시키는 것이다.
그리고 백그라운드로 동작중인 프로세스가 잘 동작중인지 현재 어떤 작업들이 진행중인지를 보는 명령은 jobs이다.
이제 이들 예를 보기로 하자
[bluesky@bluestar bluesky]$ find / -name *linux* > find 2>/dev/null&
[1] 1086
[bluesky@bluestar bluesky]$ jobs
[1]+ Running find / -name *linux* >find 2>/dev/null &
[bluesky@bluestar bluesky]$ kill %1 <- job 번호로 kill 할 때는 kill %작업번호
[1]+ Terminated 1 find / -name *linux* >find 2>/dev/null
[bluesky@bluestar bluesky]$ jobs
진행중인 작업이 없다...
[bluesky@bluestar bluesky]$ find / -name *linux* > find 2>/dev/null&
[1] 1108
[bluesky@bluestar bluesky]$ ps
PID TTY TIME CMD
1014 ttyp1 00:00:00 bash
1108 ttyp1 00:00:02 find
1109 ttyp1 00:00:00 ps
[bluesky@bluestar bluesky]$kill 1108 <- PID로 kill 할때는 kill PID
[1]+ Terminated 1 find / -name *linux* >find 2>/dev/null
[작업전환]
1. 포그라운드로 현재 실행중인 프로세스를 백그라운드로 전환하려면 일단 'Ctrl+Z'키를 눌러 잠시 sleeping 상태로 만든 다음 'bg' 명령을 내리면 백그라운드로 동작하게 된다.
2. 백그라운드로 실행중인 프로세스를 포그라운드로 전환하기 위해서는 'fg' 명령을 이용하는데 그냥 'fg' 명령을 내리면 가장 최근 작업이 포그라운드로 전환이 된다. 어떤 특정 작업을 포그라운드로 전환하고 싶으면 'fg %[작업번호]' 의 명령을 내리면 된다.(작업번호는 jobs로 알아본다.)
1. 컴퓨터가 켜지면, POST 과정에 의해 시스템이 초기화된다.
2. Boot record나 하드인 경우 MBR(Master boot record)를 읽어 들인다.
3. LILO(Linux Loader)가 실행된다. 만일, 디폴트인 리눅스가 로딩되기 전에 Ctrl, Shift, Alt 중 하나를 누르고 있으면, LILO는 부팅할 운영체제를 물어 본다.
4. Kernel이 메모리로 로딩되며, 만일 커널이 압축되었다면 압축을 해제한다.
5. 커널은 하드, 플로피, 네트웍 어댑터 등을 검사하며, 디바이스 드라이버를 설정한다.
6. 리눅스는 프로세서를 보호모드로 전환시킨다. 화면상의 변화는 나타나지 않는다.
7. root 파일 시스템을 마운트시킨다. root 파일 시스템은 'rdev'나 LILO에 의해 설정되어 있으며, 파일 시스템의 형태는 자동적으로 검출된다.
8. 커널은 /etc/init을 백그라운드로 실행한다. 'init'는 'inittab' 파일의 내용에 따라 실행된다.
9. init는 /etc/rc를 실행한다.
10. 'rc'는 /etc/rc.local이나 /etc/rc.[0-9]등을 실행시킨다.
11. 'init' 프로그램은 가상 콘솔을 위해 /etc/gettytabs에 의해 설정된 직렬 라인으로 getty를 실행한다.
12. ID와 패스워드를 입력한다.
13. shell이 작동하고 bash shell이면 .bashrc를 , tcsh shell이면 .profile을 불러들인다.
14. 프롬프트가 표시된다.
또한 쉘은 시스템 환경변수를 그대로 사용할 수 있는데 시스템 환경변수는 env 명령으로 볼 수 있다. [bluesky@bluestar bluesky]$ env | more USERNAME=root ENV=/home/bluesky/.bashrc QT_HANFONT=*-kodig-medium-r-normal--12-*-ksc5601*,*-kodig-medium-r-normal--14-*- ksc5601*,*-kodig-medium-r-normal--16-*-ksc5601*,*-kodig-medium-r-normal--20-*-ks c5601*, QT_KEYBOARD=2 HISTSIZE=1000 HOSTNAME=bluestar.linuxnet.ac.kr LOGNAME=bluesky HISTFILESIZE=1000 MAIL=/var/spool/mail/bluesky TERMCAP=xterm|vs100|xterms|xterm terminal emulator (X Window System):Km=\E[M:ac= ++,,--..00``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~:u6=\E[%i%d;%dR:u7 =\E[6n:u8=\E[?1;2c:u9=\E[c:am:bs:km:mi:ms:xn:co#80:it#8:li#24:*6=\E[4~:@0=\E[1~: AL=\E[%dL:DC=\E[%dP:DL=\E[%dM:DO=\E[%dB:F1=\E[23~:F2=\E[24~:F3=\E[25~:F4=\E[26~: F5=\E[28~:F6=\E[29~:F7=\E[31~:F8=\E[32~:F9=\E[33~:FA=\E[34~:LE=\E[%dD:RI=\E[%dC: UP=\E[%dA:ae=^O:al=\E[L:as=^N:bl=^G:cd=\E[J:ce=\E[K:cl=\E[H\E[2J:cm=\E[%i%d;%dH: cr=^M:cs=\E[%i%d;%dr:ct=\E[3g:dc=\E[P:dl=\E[M:do=^J:eA=\E)0:ei=\E[4l:ho=\E[H:im= \E[4h:is=\E7\E[r\E[m\E[?7h\E[?1;3;4;6l\E[4l\E8\E>:k1=\EOP:k2=\EOQ:k3=\EOR:k4=\EO S:k5=\E[15~:k6=\E[17~:k7=\E[18~:k8=\E[19~:k9=\E[20~:k;=\E[21~:kD=\E[3~:kI=\E[2~: kN=\E[6~:kP=\E[5~:kb=^H:kd=\EOB:ke=\E[?1l\E>:kl=\EOD:kr=\EOC:ks=\E[?1h\E=:ku=\EO A:le=^H:md=\E[1m:me=\E[m:ml=\El:mr=\E[7m:mu=\Em:nd=\E[C:r2=\E7\E[r\E[m\E[?7h\E[? --More-- 이런 환경변수들도 아래와 같이 사용될 수 있다. [bluesky@bluestar bluesky]$ cat > envargs #!/bin/sh echo USER = $USERNAME echo TERMINAL = $TERM echo SHELL = $SHELL echo HOSTNAME = $HOSTNAME echo DISPLAY = $DISPLAY [bluesky@bluestar bluesky]$ chmod 755 envargs [bluesky@bluestar bluesky]$ envargs USER = root TERMINAL = xterm-color SHELL = /bin/bash HOSTNAME = bluestar.linuxnet.ac.kr DISPLAY = 192.168.1.10:0.0 [bluesky@bluestar bluesky]$ |
여기서 잠깐 single quotes, double quotes, backslash, back quotes들이 쉘 스크립트내에서 어떤식으로 사용되는지 잠깐 살펴보면, double quotes(" ") : 문자열을 표기, 변수에 사용하면 변수에 들어간 내용을 하나의 인자로 해석함. single quotes(' ') : 문자열을 표기, 변수에 사용하면 변수명 자체를 그냥 문자열로 표기 back slash(/ ) : 문자의 특수한 기능을 제거한다. 따라서 일반문자로 인식시켜 준다. back quotes(` `) : 명령어로 인식, 묶여진 문자열은 명령어로 인식되고, 변수에는 명령어의 결과값이 들어간다. |
형식 | 의미 |
문자열 = 문자열 | 두 문자열이 같으면 참 |
문자열 != 문자열 | 두 문자열이 같지 않으면 참 |
문자열 | 문자열이 널(null)이 아니면 참 |
-l 문자열 | 문자열의 길이를 계산 |
정수1 -eq 정수2 | 정수1이 정수2와 같으면 참 |
정수1 -ne 정수2 | 정수1이 정수2와 같지 않으면 참 |
정수1 -gt 정수2 | 정수1이 정수2 보다 크면 참 |
정수1 -ge 정수2 | 정수1이 정수2 보다 크거나 같으면 참 |
정수1 -lt 정수2 | 정수1이 정수2 보다 작으면 참 |
정수1 -le 정수2 | 정수1이 정수2 보다 작거나 같으면 참 |
!표현식 | 표현식이 참이면 거짓, 거짓이면 참 |
표현식 -a 표현식 | 양쪽 표현식이 모두 참일 때만 참(and) |
표현식 -o 표현식 | 양쪽 표현식 중 하나 이상만 참이면 참(or) |
\( 표현식 \) | 표현식에 괄호를 사용 |
형식 | 의미 |
-b 파일명 | 파일이 블록 접근 형태의 파일이면 참 |
-c 파일명 | 파일이 문자 접근 형태의 파일이면 참 |
-d 파일명 | 파일이 디렉토리 형태의 파일이면 참 |
-f 파일명 | 파일이 일반 형태의 파일이면 참 |
-g 파일명 | 파일이 set-group-id 파일로 존재하면 참 |
-h 파일명 | 파일이 심볼릭 링크 형태의 파일이면 참 |
-n 문자열 | 문자열이 하나 이상의 길이를 가진다면 참 |
-p 파일명 | 파일이 파이프로 존재하면 참 |
-r 파일명 | 파일이 읽을 수 있는 권한을 가지면 참 |
-s 파일명 | 파일이 하나 이상의 문자를 가지면 참 |
-t 파일기술자 | 파일 기술자(description)가 터미널과 연관되어 있으면 참 |
-u 파일명 | 파일이 set-user-id 파일로 존재하면 참 |
-w 파일명 | 파일이 수정될 수 있는 권한을 가지면 참 |
-x 파일명 | 파일이 실행할 수 있는 권한을 가지면 참 |
-z 파일명 | 파일이 문자를 가지지 않으면 참 |
case문의 분기조건은 변수만 사용되는 것은 아니다. 필요에 따라서는 다른 프로세스의 리턴값이 그래도 사용될 수도 있다. case `find -name data.txt` in 0) echo find it!!;; *) echo can\'t find...;; esac 위의 예는 find의 수행결과가 case의 분기조건으로 사용되고 있는데, 프로세스들은 성공하면 0을 리턴한다. |
첫댓글 좋은 글 잘 봤습니다.^-^/
잘 봤습니다. ^^