Shell
- 사용자와 운영체제 사이에 존재하여 사용자의 명령을 운영체제가 이해하도록 하고, 사용자 명령의 실행 결과를 사용자에게 보여주는 사용자 인터페이스
- Steven Bourne이 개발한 Bourne Shell(sh)가 최초의 Shell 이다.
Bash Shell
- 1988년 1월 10일 Brian Fox가 개발
- GNU 시스템의 표준 Shell로 자리 잡았고 그 후 거의 모든 유닉스에서 사용됨
- 1989년 Chet Ramey가 합류하여 곧 공식적으로 bash의 유지보수를 맡게 되었다.
- Sh Shell의 기본기능에 csh와 ksh의 장점을 합하여 bash가 탄생하였다.
Bash 기본 설정 파일
- .profile : sh의 설정파일
- 대부분의 환경 설정이 이루어 지며 사용자가 시스템에 로그인할 때마다 실행된다.
- .bash_profile : bash의 .profile
- .bashrc : 서브Shell이 실행될 때 읽는다.
- 서브 Shell이란 로그인Shell에서 다시 bash가 실행되는 경우이다.
Shell script
- Script : Shell 명령어들을 담고 있는 파일로 Shell Program이라고도 부른다.
- .bash_profile, .bashrc 등은 모두 script이다.
문법
변수
- 처음 사용될 때 만들어진다. 즉, 미리 선언할 필요가 없다.
- 유닉스 명령과 마찬가지로 대소문자 구별이 있다.
- 기본적으로 데이터를 문자열로 저장한다. 수치를 입력해도 문자열로 저장한다.
- 계산이 필요한 경우에는 자동으로 수치로 변환하여 계산 후 다시 문자열로 저장된다.
- 변수의 값을 사용할 때는 변수 명 앞에 “$”를 붙여서 사용한다.
foo=”동영상은 tv팟” - 입력
echo $foo - 입력
동영상은 tv팟 - 출력결과
- 주의! 변수에 값 입력시 ! 가 들어갈시에는 작은따옴표(‘test’)로 입력한다.
환경변수
- Shell을 기동하고 나면 기복적으로 셋팅 되어 있는 변수. 필요한 경우 일반변수처럼 값을 얻어오거나 셋팅 할 수 있다.
- $0 – 실행된 쉘 스크립트 이름 b. $# - 스크립트에 넘겨진 인자의 개수 c. $$ - 쉘 스크립트의 프로세스 ID
인자변수
- 쉘 스크립트에 인자를 넘겨줄 때 그 인자들에 대한 정보를 가지고 있는 변수이다.
- $1 ~ $nnn – 넘겨진 인자들 b. $* - 스크립트에 전달된 인자들을 모아놓은 문자열 하나의 변수에 저장되며 IFS 환경변수의 첫번째 문자로 구분된다. c. $@ - $*와 같은 기능이지만 구분자가 IFS변수의 영향을 받지 않는다.
예제
-> ./vi test2.sh
echo "This Script Executable File : $0"
echo "Argument Count : $#"
echo "Process ID : $$"
echo "Argument List \$* : $*"
echo "Argument List \$@ : $@"
echo "Argument 1 : $1"
echo "Argument 2 : $2"
-> ./sh test.sh a b
This Script Executable File : ./test2.sh
Argument Count : 2
Process ID : 9308
Argument List $* : a b
Argument List $@ : a b
Argument 1 : a
Argument 2 : b
함수
- 함수는 스크립트 안의 스크립트이다 (a script-within-a-script)
- 함수는 쉘의 메모리에 저장되고, 실행 속도가 빠르다
- declare –F 명령어로 현재 자신의 로그인 세션에 정의되어 있는 함수들을 알 수 있다.
- 명령어 우선순위
- Alias (alias ls=’ls –l’) b. 예약어 (function, if , for, ….) c. 함수 d. bunlt-ins like cd and type e. 스크립트, 프로그램
함수 정의 방법
bash
function testfunc {
echo "test"
}
sh
testfunc() {
echo "test"
}
예제)
val1=$1
val2=$2
function testfunc {
echo "동영상은 tv팟"
echo $val1
echo $val2
}
testfunc
}
String 연산자
- ${varname:-word} : varname이 존재하고 null이 아니면 그 값을 리턴, 아니면 word리턴
- ${varname:=word} : varname이 존재하고 null이 아니면 그 값을 리턴, 아니면 varname에 word를 대입
- ${varname:?message} : varname이 존재하고 null이 아니면 그 값을 리턴, 아니면 varname을 출력하고 message를 출력
- ${varname:+word} : varname이 존재하고 null이 아니면 word를 리턴 아니면 null을 리턴
- ${varname:offset:leng(없으면 varname의 length)} : varname=daum tvpot이면 ${varname:4}의 값은 tvpot, ${varname:5:2}의 값은 tv
pattern and pattern matching
- ${#valiable} : valiable의 길이를 가져온다
- ${variable#pattern} : pattern이 variable의 앞부분이 일치하면 가장 짧은 부분을 제거하고 나머지를 리턴
- ${variable##pattern} : pattern이 variable의 앞부분과 일치하면 가장 긴 부분을 제거하고나머지를 리턴
- ${variable%pattern} : pattern이 variable의 뒷부분과 일치하면 가장 짧은 부분을 제거하고나머지를 리턴
- ${variable%%pattern} : pattern이 variable의 뒷부분과 일치하면 가장 긴 부분을 제거하고나머지를 리턴
- ${variable/pattern/string} : 일치하는 가장 긴 부분을 string으로 대체. 한번만 일어남
- ${variable//pattern/string} : 일치하는 가장 긴 부분을 string으로 대체. 모두 일어남
조건문
if / else
문법
if condition
then
statements
elif condition
then
statements
else
statements
fi
값 비교절
- [ string ] - string이 빈 문자열이 아니라면 참
- [ string1 = string2 ] - 두 문자열이 같다면 참 or string1 matches string2
- [ string1 != string2 ] - 두 문자열이 다르면 참 or string1 does not match string2
- [ -n string ] - 문자열이 null(빈 문자열) 이 아니라면 참
- [ -z string ] - 문자열이 null(빈 문자열) 이라면 참
- [ expr1 -lt expr2 ] – exp2가 exp1보다 크면 참 (‘Less than')
- [ expr1 -le expr2 ] – exp2가 exp1보다 크거나 같다면 참 (‘Less than or equal')
- [ expr1 -eq expr2 ] - 두 표현식 값이 같다면 참 (‘EQual')
- [ expr1 -ne expr2 ] - 두 표현식 갑이 같지 않다면 참 ('Not Equal')
-
[ expr1 -gt expr2 ] - expr1 > expr2 이면 참 ('Greater Then')
-
[ expr1 -ge expr2 ] - expr1 >= expr2 이면 참 ('Greater Equal')
- [ expr1 -ne expr2 ] - expr1 != expr2 이면 참 ('Not Equal')
- [ ! expr ] - expr 이 참이면 거짓, 거짓이면 참
- [ expr1 -a expr2 ] - expr1 AND expr2 의 결과 (둘다 참이면 참, 'And')
- [ expr1 -o expr2 ] - expr1 OR expr2 의 결과 (둘중 하나만 참이면 참, 'Or')
파일관련 비교절
- [ -d FILE ] - FILE 이 디렉토리이면 참
- [ -e FILE ] - FILE 이 존재하면 참
- [ -f FILE ] - FILE 이 존재하고 정규파일이면 참
- [ -r FILE ] – 파일 읽을 권한이 있다면 참
- [ -s FILE ] – 파일이 있고 빈파일 아니라면 참
- [ -w FILE ] – 파일 쓰기 권한이 있다면 참
- [ -x FILE ] – 실행권한이 있다면 참
- [ -O FILE ] – 파일의 주인(?)이라면 참
- [ -G FILE ] – 파일의 group ID와 사용자의 group ID가 같다면 참
- [ FILE1 -nt F - : FILE1이 FILE2 보다 새로운 파일이면 ( 최근파일이면 ) 참
- [ FILE1 -ot F - : FILE1이 FILE2 보다 오래된 파일이면 참
case
문법
case 변수 in
pattern 1 )
statements ;;
pattern 2 )
statements ;;
* )
statements ;;
esac
select
문법
select name [in list]
do
statements that can use $name …
done