User ⇾ 바로 Kernel에 접근 불가능
user는 shell에서 system call을 통해 커널에 입력을 하면 커널이 반응결과를 쉘에 전달하고 쉘이 다시 출력을 user에게 전달한다.
커널 : 모든 차원을 초기화하고 통제한다.
⇾ 프로세스, 메모리, 파일, 디바이스를 관리
유저 프로그램 : 일반 사용자들이 사용하는 프로그램, 컴퓨터의 자원을 사용한다.
명령어를 커널에게 해석해주는 인터페이스
유닉스/리눅스 쉘 ⇾ command-line interfaces (CLIs)
| alias | 복잡한 명령어나 옵션을 사용하는 명령어에 별명을 붙여 사용할 수 있게 해줌 |
|---|---|
| echo | 주어진 인자 출력 |
| printf | 형식화 된 데이터 출력 |
| read | 값을 읽음 |
| exec | 프로그램을 실행 시킴 |
| bg | 프로그램을 백그라운드에서 실행 시킴 |
| cd | 디렉터리 변경 |
| pwd | 현재 디렉터리 체크 |
| exit | 쉘이 종료 |
| source | 파일 읽기와 실행 |
| set | 변수 설정 |
| export | 환경변수(global variable) 설정 |
$ read var_value
Linux is interesting // var_value에 Linux is interesting이 입력됨
$ echo $var_value // var_value에 입력된 값을 출력
Linux is interesting
$ read -p "Insert Name: " name_value
Insert Name: peterpan // Insert Name: 이 출력되면서 입력을 받음, peterpan이 name_value에 입력됨
$ echo $name_value // name_value에 입력된 값이 출력 됨
peterpan
| < | input, "a < b"는 b를 읽어서 a에 입력한다. Ex) sh < result : sh 프로그램이 result를 read |
|---|---|
| > | output, "a > b"는 a결과를 b에 쓴다. Ex) ls -l > result : result에 ls -l 결과를 쓴다. |
| >> | appending, "a >> b"는 a결과를 b에 추가한다. Ex) ps >> result : ps 명령어 결과 result에 추가 |
| >& | error, (ls -z > file) >& errfile은 ls -z > file에 error가 발생하면 errfile에 에러 내용이 저장 됨. 예시에서 ls -z는 잘못된 명령어이기 때문에 errfile에 저장됨 |
; : 순차적으로 실행해라 Ex) date; ls -l; whoami ⇾ date, ls -l, whomai 명령어를 순차적으로 실행
& : 백그라운드에서 동시에 실행해라 Ex) date &ls -l test1 & whoami ⇾ date, ls -l test1, whoami를 백그라운드에서 동시에 실행해라
변수 = 문자열
변수 = " 문자열 " // 문자열에 사이에 공백이 있으면 ""로 감싸줘야 함
변수를 사용할 때는 $를 앞에 붙여줘야 함 Ex) echo $value
변수 ⇾ 해당 쉘에서만 유효함, 다른 쉘에서는 사용 불가
환경 변수 ⇾ 모든 쉘에서 실행 가능
export 변수명 : 해당 변수를 환경변수로 변경 Ex) export value
| anyString | anyString을 보여줌 |
|---|---|
| \d | 주, 달, 일 |
| \H | 도메인 이름 |
| \h | 호스트 이름 |
| \u | 유저 이름 |
| \w | 현재 디렉터리의 절대 경로 |
| \W | 지난 디렉터리 이름 |
| \t, \T | HH:MM:SS (24시간제, 12시간제) |
| $ | UID가 0이면 #, 그렇지 않으면 $표시 |
현재 쉘에만 효과가 있음
PS1="$"
⇾ shell prompt를 바꿔라
PS1="u$"
⇾ username을 표시하고 shell prompt를 바꿔라
⇾ username$
PS1="u hi ts"
⇾ username hi HH:MM:SS(24H) $로 쉘 변경
영구적으로 바꾸고 싶으면? 구성파일 변경
vi ~/.bashrc로 내용수정
source ~/.bashrc로 수정내용 적용
명령어의 별명을 만들어줌
alias lf = "ls -F"
⇾ ls -F 별명으로 lf를 만들어줌 ⇾ lf 명령어 입력시 ls -F가 실행됨
unalias lf
⇾ lf 별명 삭제
영구적으로 바꾸고 싶으면? 구성파일 변경
vi ~/.bashrc로 내용수정
source ~/.bashrc로 수정내용 적용
| ${var_name} | var_name 변수 사용 |
|---|---|
| ${var_name:=value} | setup, 변수값이 null이면 대입, 아니면 전에 값 사용 |
| ${var_name:+value} | overwriting, 변수값이 null이면 empty String 대입, 아니면 value값 대입 (저장되지 않음⇾두번째 사용시에는 원래 값으로 돌아옴) |
| ${var_name:-value} | temporary setup, 변수값이 null이면 value값 대입 (저장되지 않음⇾두번째 사용시에는 원래 값으로 돌아옴) |
| ${var_name:?value} | 변수값이 null이면 스크립트를 끝내고 error리턴, 아니면 이전 값 사용 |
| ${#var_name} | $var_name의 길이 |
Ex) a = /home/silver/test
${var_name%pattern} : 값의 끝에서 부터 첫번째로 일치하는 패턴 찾기, 발견된 패턴(포함) 뒤에 문자열 없이 값을 반한
Ex) echo ${a%/*} ⇾ pattern=/test, /home/silver 출력
${var_name%%pattern} : 값의 끝에서 부터 마지막으로 일치하는 패턴 찾기, 발견된 패턴(포함)뒤에 문자열 없이 반환
Ex) echo ${a%%/*} ⇾ pattern=/home, 아무것도 출력X
${var_name#pattern} : 값의 헤드에서 부터 첫번째로 일치하는 패턴 찾기, 발견된 패턴(포함) 전에 문자열 없이 값을 반환
Ex) echo ${a#*/} ⇾ pattern=/, home/silver/test 출력
${var_name##pattern} : 값의 헤드에서 부터 마지막으로 일치하는 패턴 찾기, 발견된 패턴(포함) 전에 문자열 없이 값을 반환
Ex) echo ${a##*/} ⇾ pattern=silver/, test출력
'string' ⇾ string
"string" ⇾ String, $, `, 같은 특별한 문자열 작동
`string` ⇾ 명령어, $(command)와 동일 Ex) `pwd`, $(pwd)
export name : 해당 변수 환경변수로 설정
./쉘 코드 명 : 해당 쉘코드 실행
| Ex) ./test abc | |
|---|---|
| $ | PID, Ex) echo $$ ⇾ 4065 |
| ? | 가장 마지막 명령어의 변수 반환, Ex) echo $? ⇾ 0 |
| ! | 자식 프로세스의 PID, Ex) echo $! ⇾ 아무것도 출력X |
| # | argument 숫자, Ex) echo $# ⇾ 3 |
| 0 | 명령어 문자열, Ex) echo $0 ⇾ ./test |
| 1, 2, ... | 문자열 인자, Ex) echo $1 ⇾ a |
| * or @ | argument 배열, Ex) echo $* or echo $@ ⇾ a b c |
| _ | 마지막 인자 또는 마지막 인자가 없으면 명령어, Ex) echo $_ ⇾ c |
연산자 : +, -, *, /, %
정수형 기반 ⇾ 나눗셈 했을 때 소수점은 자름
공백 필요
Ex)
a=10
b=3
echo `expr $a + $b`
echo $(($a*$b))
If ⇾ start, fi ⇾ end
If [조건]; # true ⇾ command1
then
command1;
fi
If [조건]; # true ⇾ command1, false ⇾ command2
then
command1;
else
command2;
fi
If [조건 1]; # true ⇾ command1, false ⇾ pass
then
command1;
elif [조건 2]; # true ⇾ command2, false ⇾ command3
then
command2
else
command3
fi
| 조건 | 테스팅 | |
|---|---|---|
| 문자열 비교 | [string] | not empty ⇾ true |
| 문자열 비교 | [string1 = string2] | same ⇾ true |
| 문자열 비교 | [string1 != string2] | not same ⇾ true |
| 문자열 비교 | [-n string] | not null ⇾ true |
| 문자열 비교 | [-z string] | null ⇾ true |
| 산술 비교 | [expr1 -eq expr2] | expr1과 expr2가 같으면 true |
| 산술 비교 | [expr1 -ne expr2] | expr1과 expr2가 같지 않으면 true |
| 산술 비교 | [expr1 -gt expr2] | expr1 > expr2 ⇾ true |
| 산술 비교 | [expr1 -ge expr2] | expr1 >= expr2 ⇾ true |
| 산술 비교 | [expr1 -lt expr2] | expr1 < expr2 ⇾ true |
| 산술 비교 | [expr1 -le expr2] | expr1 <= expr2 ⇾ true |
| 산술 비교 | [!expr] | 만약 expr이 false이면 true |
| 산술 비교 | [expr1 -a expr2] | expr1 AND expr2가 true이면 true |
| 산술 비교 | [expr1 -o expr2] | expr1 OR expr2가 true이면 true |
| 조건 | 테스팅 |
|---|---|
| [-b FILE] | 블록 디바이스(디스크) ⇾ true |
| [-c FILE] | 캐릭터 디바이스(키보드) ⇾ true |
| [-d FILE] | 디렉터리 ⇾ true |
| [-e FILE] | exist ⇾ true |
| [-f FILE] | 파일 ⇾ true |
| [-h FILE] | 심볼릭 링크 파일 ⇾ true |
| [-r FILE] | 읽기 권한O ⇾ true |
| [-s FILE] | not empty ⇾ true |
| [-S FILE] | 소켓 디바이스(네트워크 소켓) ⇾ true |
| [-w FILE] | 쓰기 권한O ⇾ true |
| [-x FILE] | 실행 권한O ⇾ true |
| [-O FILE] | 현재 유저에게 파일 소유권있으면 true |
| [-G FILE] | 현재 유저와 파일의 그룹이 같으면 true |
com1 && com2 && com3
⇾ 순차적으로 false가 나올 때 까지 명령어 수행
com1 || com2 || com3
⇾ 순차적으로 true가 나올 때 까지 명령어 수행
[조건] && {com1 com2} || com3
⇾ 조건이 true이면 com1 && com2
⇾ 조건이 false이면 com3
case ⇾ start, esac ⇾ end
case var_name in
pattern1) command1;; # var_name = pattern1 ⇾ command1
pattern2) command2;; # var_name = pattern2 ⇾ command2
esac
for var_name in val1 val2 ...
do
command1
command2
done
for variable in 1 2 3 4 5 ... N
do
command1
command2
....
commandN
done
for variable in file1 file2 file3
do
command1 on $variable
command 2
...
commandM
done
# {start .. end}
#!/bin/bash
for i in {1 .. 5}
do
echo "Welcome $i times"
done
#{start..end..increment}
#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
do
echo "Welcome $i times"
done
while 조건
do
command # 조건이 true면 command 수행
done
until 조건
do
command # 조건이 false면 command 수행
done
break ⇾ 반복문 종료
continue ⇾ continue 이후 명령어 무시
쉘이 변수값들에 번호를 붙여서 물어보고 사용자로 부터 입력을 받음
select문은 계속 반복되기 때문에 break;를 넣어줘야 함
select var_name in val1 val2 ....
do
command
done
export 함수 : export -f 함수명
func()
{
statement
return value
}
# Example)
# !/bin/bash
user_print()
{
echo "user print done"
}
user_print
echo "user print is used"
set ⇾ 정의 된 함수를 보여줌