Shell
사용자와 Unix 커널사이의 인터페이스 역할을 하는 프로그램.
사용자가 내린 명령어를 해석하여 커널에게 전달하는 역할을 한다
명령어 해석기로도 불린다.
shell 의 역할
- 입력을 읽고 해당 명령행을 분석
- 특수문자 평가
- 파이프, 리디렉션, 백그라운드 프로세스를 처리
unix 주요 shell
1.bash(bourne again shell) : 리눅스의 기본셀. 편리한 사용자 인터페이스 및 본셀과 비교하여 확장된 문법제공.
본셀과는 기본적으로 호환됨. 명령행 편집기능 제공. GNU 프로젝트에 의해 만들어지고 배포됨.
2. sh(bourne shell) : steven bourne 이 개발한 최초의 대중화 된 유닉스 셀
명령행 편집기능을 제공하지 않는다.
3.csh(c shell) : billy joy에 의해 개발된 셀로 프로그래머들이 선호하는 셀.
linux 의 기본셀인 본셀과는 호환되지 않는다.
4. ksh(korn shell) : david korn이 개발. 사용자 인터페이스가 뛰어나고 본셀과도호환되어 유닉스에서 가장 많이
사용하는 셀로 알려짐 명령행 편집기능 제공.
*. shell (login shell인경우)설정 파일.
bash shell
로그인 셀이 bash 인경우 로그인하면
/etc/profile => $HOME/.bash_profile => .bashrc => /etc/bashrc file이 실행된다.
login shell 을 끝낼때 => $HOME/.bash_logout 그리고 bash shell 사용기록을 저장하는
$HOME/.bash_history 라는 파일이 실행된다
* bash shell 변수
환경변수
- 주로 대문자만 사용
- 미리 정의되어 있다.
- shell 환경을 편리하게 사용할 수 있게 env 명령어로 볼수 있다.
- sub shell에서도 사용.
사용자정의변수
- 사용자가 필요할때마다 임시로 만들어서 사용
- 주로 소문자만 사용
- 현재셀에서만 사용가능
shell 내장변수
- shell 에 내장되어 있다.
- 변수명이 특수문자나 숫자로 되어 있다.
$0 $1 .... $n => 위치매개변수
$# => 인수의 갯수
$* => 모든 인수
$@ => 모든 인수
$? => return value
$$ => 현재 process id
조건 판단명령어
test - check file types and compare values
*. 아래는 참고사항입니다.
===============================================================
bash shell 문법
* 변수: 할당과 치환 a=375 hello=$a * 변수를 초기화 할 때, = 양쪽에는 빈 칸이 들어가면 안 됩니다. echo hello # 변수 참조가 아니고 그냥 "hello"란 문자열입니다. echo $hello echo ${hello} # 위와 똑같습니다. echo "$hello" echo "${hello}" echo hello="A B C D" echo $hello echo "$hello" echo '$hello' hello= # 널 값을 갖도록 세팅. 여러 변수들을 공백문자로 구분해서 한 줄에서 세트할 수 있습니다. 하지만 이렇게 하면 코드의 가독성이 떨어지고 다른 시스템으로 이식할 수가 없을 수도 있기 때문에 조심해서 써야 됩니다. var1=variable1 var2=variable2 var3=variable3 numbers="one two three" other_numbers="1 2 3" # 변수에 공백문자가 들어 있다면 쿼팅을 해줘야 합니다. echo "numbers = $numbers" echo "other_numbers = $other_numbers" echo "uninitialized_variable = $uninitialized_variable" # 초기화 안 된 변수는 널 값을 갖습니다(아무 값도 없습니다). for a in 7 8 9 11 do echo -n "$a 입니다." done # 'read' 문에서(역시 일종의 할당임) echo -n "a" 를 넣으세요." read a echo "a" 의 값은 이제 $a 입니다." a=`echo Hello!` # 'echo' 명령어의 결과를 'a' 로 할당 echo $a a=`ls -l` # 'ls -l' 명령어의 결과를 'a' 로 할당 echo $a $(...) 기법을 써서 변수 할당하기(역따옴표(backquotes)보다 새로운 방법) # /etc/rc.d/rc.local 에서 발췌 R=$(cat /etc/redhat-release) arch=$(uname -m)
연산자
문자열비교
[string] : string이 빈 문자열이 아니라면 참
["string1" = "string2"] : 두 문자열이 같으면 참
[“string1" != "string1" ] : 두 문자열이 같지 않으면 참.
[ -n "string" ] : 문자열이 null(빈 문자열) 이 아니라면 참.
[ -z "string" ] : 문자열이 null(빈 문자열)이라면 참
산술비교
[ expr1 -eq expr2 ] : 두 표현식 값이 같다면 참.
[ expr1 -ne expr2 ] : 두 표현식 값이 않다면 참.
[ expr1 -gt expr2 ] : expr1 이 expr2 보다 크다면 참
[ expr1 -ge expr2 ] : expr1 이 expr2 보다 크거나 같으면 참
[ expr1 -lt expr2 ] : expr1 이 expr2 보다 작다면 참
[ expr1 -le expr2 ] : expr1 이 expr2 보다 작거나 같으면 참
파일조건
[ -b file ] : file이 block device file이면 참
[ -c file ] : file이 character device file 이면 참
[ -d file ] : file이 directory file이면 참
[ -f file ] : file이 정규파일이면 참
[ -r file ] : file이 읽기권한이면 참
[ -w file ] : file이 쓰기권한이면 참
[ -x file ] : file이 실행권한이면 참
[ -L file ] : file이 symbolic link file이면 참
[ -e file ] : file이 존재하면 참
2. if 구문.
단순 if 문
if [ 조건 ]
then
실행문장
fi
if ~else 문
if [ 조건 ]
then
실행문장
else
실행문장
fi
if ~ else if 문
if [ 조건 ]
then
실행문장
elif [ 조건 ]
then
실행문장
fi
다중 if 문
if [ 조건 ]
then
if [ 조건 ]
then
실행문장
fi
fi
3. and list / or list
and list
실행문장 && 실행문장 && 실행문장 && ....
=> 참이 될 때까지 실행문장을 실행한다.
or list
실행문장 || 실행문장 || 실행문장 || ...
=> 실행문장이 거짓이 될 때까지 실행한다.
4. case 구문
case 변수 in
패턴 | 패턴 | ... )
문장 ;;
패턴 | 패턴 | ...)
문장;;
*) 문장 ;;
esac
5. while 구문
단순 while 문
while [ 조건 ]
do
실행문장
done
다중 while 문
while [ 조건 ]
do
while [ 조건 ]
do
실행문장
done
done
ex)
echo -n "input password : "
read password1
echo -n "retype password : "
read password2
while [ "$passowrd" != "$password2" ]
do
echo "password miss match try again"
read password2
done
ecoh "OK ! password Match complete"
6. until 구문
until [ 조건 ]
do
실행문장
done
ex)
until who | grep "$1" > /dev/null
do
sleep 5
done
echo "user $1 just logged in"
6 for 문
단순for 문
for 변수 in list
do
실행문장
done
다중 for 문
for 변수 in list
do
for 변수 in list
do
실행문장
done
done
ex)
for string in "hello" "unix" "world"
do
echo -n "$string "
done
7. select 문.
select 변수 in list
do
실행문장
done
8. 함수
함수명 () {
실행문장
[ return value ]
}
또는
function 함수명 {
실행문장
[ return value ]
}
break / continue
break 제어문이나 조건문의 루프를 빠져나갈 때 사용한다.
continue : 제어문이나 조건문의 처음으로 돌아가서 다시 수행한다.
: 의미 없는 명령. 논리 값 true를 대신해서 쓰기도 한다.
. 명령 - 스크립트를 실행. 스크립트 내에서 다른 파일을 include하는 경우에도 사용
exec - 현재 shell을 다른 shell 로 대체
exit n : 현재 shell 종료 시 리턴 값 n 반환
shift : shell의 인자를 오른쪽으로 하나 shift 한다.
ex)
echo $1
shift
echo $1
shift 3
echo $1
./script 1 2 3 4 5 6 7
1
2
5
정규표현식
정규표현식 정규 표현식이란 어떤 문자열의 집합을 표시하는 텍스트 스트링을 말하는 것으로 일반적으로 텍스트 형식 문서등에서 문자열을 찾아내고 치환하는데 많이 사용된다. 정규 표현식은 vi.ex,ed,sed,grep 등에서 사용되며 윈도우의 찾기 기능이나 바꾸기 기능과는 비교할 수 없는 편리함이나 강력한 기능을 갖고 있다. “[문자열]”의 의미 정규 표현식에서 문자열이 “[ ]"로 둘러싸여 있으면 이문자열들중 하나를 의미하게 된다. ex [0-9] [a-z] [A-Z] [a-Z] [Oo]wl "[ ]"안에서 “^”는 문자열중 ^이하를 포함하지 않는 문자열을 말한다. ex) [^0-9] : 숫자가 아닌 문자 하나를 의미한다. [-0-9] : 숫자 한 개 또는 - 기호를 의미한다. [^-0-9] : 숫자나 - 기호가 아닌 문자 하나를 의미한다 [^A-Z] : 대문자를 제외한 문자 c[a-z0-9]t : 두 번째 문자가 임의의 소문자나 숫자. “^”와 $의 의미 “^”는 라인의 시작 부분을 의미하는 것인 반면 “$”는 라인의 끝 부분을 의미한다. 만약 “new"로 시작하는 부분을 찾고 싶다면 ”^new"라고 표현한다. “\” 정규표현식에서는 특별한 의미를 지니고 있는 <>,()등의 기호들의 표현하기 위해 해당 문자의 바로 앞에 역슬래시를 사용하여 구분한다. ex) \$$ : $로 끝나는 라인을 의미한다. “.” : 아무문자나 한 개의 문자를 의미. ex) [0-9]* : 숫자가 들어 있거나 그렇지 않은 부분을 의미. 확장 정규식 + : + 기호 바로 이전의 글자나 정규식이 1회이상 반복 ex. abc+ (c가 1회이상 반복) ==> abc, abcc, abcc 등 ? : ? 기호 바로 이전의 글자나 정규식이 없거나 한번 존재 ex. abc? (c가 있거나 없거나) ==> ab,abc ( ) : 부분 정규식의 시작과 끝을 표시 ex. a(bc)* (bc가 0회 이상 반복) ==> a, abc, abcbc등 a(bc)+ (bc가 1회 이상반복) ==> abc,abcc등 a(bc)? (bc가 있거나 없거나) ==> a, abc 등 | ( ) 내의 단어들 중 최소 하나가 존재 ex. a(b|c) (b 또는 c가 최소 하나 존재 : ab, ac, abc, acb) *. 텍스트 조작 및 필터명령 grep(get regular expression) : 특정한 문자열을 포함하고 있는 라인을 찾기위해 사용한다. 자주사용되는 옵션 -v(invert) ; 찾고자 하는 문자열과 일치하는 라인을 제외한 모든 라인을 출력한다. -n(number) ; 문자열이나 패턴을 일치시키는 라인들의 라인번호를 표시해준다. -l(listfile) ; 특정한 패턴을 찾기위해 여러개의 파일을 검색할 때 편리하게 사용할 수 있다. 이 옵션은 패턴을 갖고 있는 줄을 찾아 보여주는 것이 아니라 그러한 줄이 발견된 파일명을 결과로 보여준다. egrep(Extended grep) : 확장 정규식을 사용해서 grep 명령어로 표현할 수 없는 다양한 패턴을 나타낼 수 있다. fgrep(Fixed grep) : grep, egrep 명령어와 달리 정규식을 전혀 사용하지 않는다. 모든 패턴의 문자를 그대로 인식하므로 *, +, ^, $, [ ] 등의 문자도 모두 단순 문자로서만 인식한다.