08 linux system Shell

Sisyphus·2022년 7월 16일

Ubuntu

목록 보기
9/9

리눅스 프로그램 계층

User ⇾ 바로 Kernel에 접근 불가능
user는 shell에서 system call을 통해 커널에 입력을 하면 커널이 반응결과를 쉘에 전달하고 쉘이 다시 출력을 user에게 전달한다.



커널과 유저 프로그램

커널 : 모든 차원을 초기화하고 통제한다.
⇾ 프로세스, 메모리, 파일, 디바이스를 관리

유저 프로그램 : 일반 사용자들이 사용하는 프로그램, 컴퓨터의 자원을 사용한다.



명령어를 커널에게 해석해주는 인터페이스
유닉스/리눅스 쉘 ⇾ command-line interfaces (CLIs)



쉘 명령어

  • 공백으로 나눠짐
  • 첫번째 단어 ⇾ 명령어
  • 그 다음 단어 ⇾ 옵션 또는 인자
  • built-in 명령어 : 쉘에 내장된 명령어
    Ex) echo, printf, read, cd, pwd, let, eval, set, unset


Built-in 명령어

alias복잡한 명령어나 옵션을 사용하는 명령어에 별명을 붙여 사용할 수 있게 해줌
echo주어진 인자 출력
printf형식화 된 데이터 출력
read값을 읽음
exec프로그램을 실행 시킴
bg프로그램을 백그라운드에서 실행 시킴
cd디렉터리 변경
pwd현재 디렉터리 체크
exit쉘이 종료
source파일 읽기와 실행
set변수 설정
export환경변수(global variable) 설정


read와 echo 예시

$ 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


Redirection

<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에 저장됨


Multiple commands

; : 순차적으로 실행해라     		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


PS1 쉘 변수 설정

anyStringanyString을 보여줌
\d주, 달, 일
\H도메인 이름
\h호스트 이름
\u유저 이름
\w현재 디렉터리의 절대 경로
\W지난 디렉터리 이름
\t, \THH: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 예시

명령어의 별명을 만들어줌 

alias lf = "ls -F"ls -F 별명으로 lf를 만들어줌 ⇾ lf 명령어 입력시 ls -F가 실행됨  

unalias lf  
⇾ lf 별명 삭제  
  
영구적으로 바꾸고 싶으면? 구성파일 변경 

vi ~/.bashrc로 내용수정  
source ~/.bashrc로 수정내용 적용  


쉘 프로그래밍

쉘 스크립트 파일

  • 첫 줄은 #!/bin/bash로  시작
  • chmod u+x로 실행권한을 부여하여 실행
  • 주석은 #를 앞에 붙임


변수

  • 타입이 없다.
  • 문자열이다.
  • 숫자나 특수문자로 시작하지 않는다.
  • $변수명을 사용하면 변수 값에 접근할 수 있다. Ex) echo $a


변수 할당

${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)


Exporting variable

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


expr

연산자 : +, -, *, /, %
정수형 기반 ⇾ 나눗셈 했을 때 소수점은 자름
공백 필요

Ex)  
a=10  
b=3  
echo `expr $a + $b`  
echo $(($a*$b))


If 문

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 문

case ⇾ start,     esac ⇾ end

case var_name in
    pattern1) command1;;	# var_name = pattern1 ⇾ command1
    pattern2) command2;;	# var_name = pattern2 ⇾ command2
esac


For 문

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 and Until 문

while 조건
do
    command    # 조건이 true면 command 수행
done
until 조건
do
    command    # 조건이 false면 command 수행
done

break ⇾ 반복문 종료
continue ⇾ continue 이후 명령어 무시



select 문

쉘이 변수값들에 번호를 붙여서 물어보고 사용자로 부터 입력을 받음
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 ⇾ 정의 된 함수를 보여줌

0개의 댓글