shell
- 리눅스 운영체제의 명령어 해석기
- 해당 프로그램 실행, 리눅스 커널에 작업 요청
쉘 프로그래밍
- 시스템 관리작업 실시나 특정 작업을 한꺼번에 순차적으로 처리
-> 시스템에 필요한 환경변수 사전 설정
-> 응용 프로그램 실행에 필요한 설정 작업
(1) 쉘 개요
1) 쉘 개요
2) 리눅스 쉘
3) 프로그램 표준 스트림
4) 리눅스 쉘의 특수 기능
1) 쉘 개요
쉘 이란
- 사용자의 명령어를 시스템 커널에 전달 -> 명령어 해석기
- 사용자와 리눅스 사이 인터페이스 제공 프로그램
- 사용자가 shell을 통해 입력한 명령어들을 운영체제가 실행
- 리눅스는 여러 shell을 동시 사용 가능
- 커널 : 운영체제의 핵심
- X window : 사용자 그래픽 인터페이스
- ohter program : 사용자 응용프로그램
- csh, bash : 사용자가 입력한 명령어를 해석하여 필요한 작업 실행 또는 운영체제에 요청
유닉스 쉘
- sh Bourn shell : AT&T 의 스테판 본이 개발
- csh C shell : 버클리 대 빌 조이가 개발
- ksh korn shell : 데이비드 콘이 개발
- bash bourn-again shell : GNU 프로젝트 쉘
쉘 설정파일
- sh, ksh : ~/.profile
- csh : ~/.cshrc
- bash : ~/.bash_profile
- 쉘 사용에 필요한 각종 환경변수, 실행파일 탐색장소, 동작과 외형 등 제어하는 스크립트가 저장
2) 리눅스 쉘
- 리눅스 기본 쉘 : bash
- 리눅스 기본 쉘 지정 : /bin/sh -> link -> /bin/bash 가 실행
- 기본 쉘을 bash에서 csh로 변경시 -> link -> /bin/csh로 설정
bash 쉘 설정파일
- 환경변수, 쉘 명령어,, 쉘스크립트 등 포함
1. /etc/profile : 모든 bash 쉘 사용자에게 적용. 로그인 쉘에 적용
2. ~/.bash_profile : 특정 사용자에게만 적용
로그인 쉘
- 사용자가 로그인시 실행되는 쉘 프로그램
3) 프로그램 표준 스트림
표준 입력 스트림 -> 프로그램 -> 표준 출력 스트림
-> 표준 에러 스트림
- 표준 이름 스트림 stdin : 키보드
- 표준 출력 스트림 stdout : 모니터. 파일 디스크립터번호 1
- 표준 에러 스트림 stderr : 모니터. 파일 디스크립터번호 2
4) 리눅스 쉘의 특수기능
- redirection : 프로그램 입출력 스트림 방향을 파일로 변경
> 문자 : 표준 출력 스트림을 파일로 변경, 덮어쓰기
< 문자 : 표준 입력 스트림을 파일로 변경
>> 문자 : 표준 출력 스트림을 파일로 변경, 파일 끝에 추가
<< 문자 : 표준 입력 스트림을 스트림 리터럴로 변경 - 키보드 입력을 스트림으로 생성
<<< 문자 : 표준 입력 스트림을 문자열로 변경
pipe
- 프로그램 출력을 다른 프로그램 입력으로 사용
- 여러 개 프로그램을 파이프로 연결하여 작업 메모리 공간 절약
- 파이프로 연결된 2개 프로그램은 데이터 스트림이 가용상태면 동시에 실행 가능. 2개의 프로그램 사이 데이터 흐름 제어
- 파이프 연산자 | 로 사용
ex) $ program1 | program2 | program3
- 프로그램1의 출력을 프로그램2 입력으로 사용. 프로그램 2의 출력을 프로그램 3의 입력으로 사용
filter
- 파이프와 함께 사용됨. 표준 입력스트림을 처리하여 표준 출력스트림으로 출력
- sort : 정렬하여 출력
- uniq : 중복 라인 제거
- grep : 특정 문자열 패턴을 찾아 출력
- fmt : 포맷해서 출력
- tr : 대소문자, 파일형식 변환
- sed : 스트림 편집기 사용
- awk : 문자열 패턴 검색 및 조작에 사용
expansion
- 특수 문자를 사용하여 문자열 패턴 확장
- 글로빙 : 와일드 카드를 사용하여 문자열 패턴 확장
- * : 해당 위치에 있는 모든 크기 문자
- ? : 해당 문자에 있는 크기가 1인 모든 문자열
- [123] : 1또는 2또는 3 한문자를 포함하는 모든 문자열
- [^123] : 1,2,3을 포함하지 않은 모든 문자열
추가 확장
- Brace 확장 : a{1, 2, 3} -> a1,a2,a3 한 문자를 포함하는 3개의 문자열
- Tilt 확장 : 현재 사용자의 홈 디렉토리 이름. cd 시 홈으로 이동
- 파라미터 확장 : $AAA -> 쉘 환경변수 AAA 값으로 확장
- 산술 연산 확장 : $((2+2)) -> 4
- 명령어 확장 : $(명령어) or `명령어` : $echo $(ls a?b) -> afb
- single quote 확장 : '문자열' 문자열 유지. 문자열 내 확장 문자 있어도 무시
- double quote 확장 : "문자열" : 파라미터 확장, 산술연산 확장, 명령어 확장이 포함시 확장 적용. 나머지 확장은 무시
(2) 쉘 스크립트
1) 쉘 스크립트 개요
2) 쉘 스크립트 작성절차
3) 쉘 스크립트 디버깅
4) 쉘 스크립트 문법
1) 쉘 스크립트
쉘 스크립트
- 쉘이 실행할수 있는 명령어와 문법으로 만든 프로그램 파일
- 용도 : 사용자 입력/파일로 부터 읽은 데이터를 처리해 출력하는 작업. 반복적 작업 실행 자동화. 배치처리
- 실행 방법 : 쉘 스크립트 파일 직접 실행 or 파일 작성해서 순차적 실행
2) 쉘 스크립트 작성절차
- 문서 편집기 사용하여 편집
- 스크립트 파일 확장자 -> sh
- 스크립트 첫라인 첫 번째 문자 #! (쉬뱅)* // #!이 쉬뱅. 이는 스크립트 파일임을 알려줌
- 쉬뱅 다음에 스크립트를 실행할 해석 프로그램 지정
- 실행 성공을 표시하기 위해 마지막에 exit 0 추가
예시
#! /bash/sh
exit 0
실행 방법
1. 쉘 스크립트 직접 실행 sh 파일명
2. 실행 권한 설정 : 실행 권한 부여후 ./파일명
3. 스크립트 실행 경로 설정 : export PATH=$PATH:. -> ./파일명
3) 쉘 스크립트 디버깅
- 비교적 용이하여 별도 디버깅 툴 없음
- 에러 발생시 쉘은 에러를 포함하는 스크립트 라인번호 출력
- echo를 사용하여 변수값 출력하면서 코드 테스트
- 복잡한 에러 추적은 쉘 옵션 사용
-n : 명령어 실행하지 않고 문법만 검사
-v : 명령어 실행전 출력
-x : 실행시 자세한 인자, 명령어, 변수 출력
-u : 정의하지 않은 변수 사용시 에러 출력
-e : 오류 발생시 실행 중지
ex) sh -xv hello.sh
4) 쉘 스크립트 문법
변수 : 대소문자 구분, 문자열료 표현, 값 정의는 "=" 사용
- 변수값 참조시 변수명앞에 $사용
- 변수값 출력시 echo. 사용자 입력값을 변수에 할당시 "read" 명령어 사용
환경 변수
- 쉘 실행환경과 관련된 사전에 정의된 쉘 변수
- 쉘 스크립트 시작시 초기화
- 환경 변수 확인 -> "env" 명령어 사용
- 쉘 변수를 환경변수로 전환 : export 변수명
환경변수 예시
- $HOME : 홈디렉토리
- $PATH :명령어 탐색경로
- $PS1 : 명령어 프롬프트
- $IFS : 필드 구분자 리스트
- $0 : 쉘스크립트 파일이름
- $# : 쉘스크립트에 전달되는 파라미터 수
- $$ : 쉘스크립트의 process id
- $* : IFS 환경 변수의 첫번째 구분자를 사용하여 모든 파라미터를 1개의 변수로 표현
- $@ : IFS를 사용하지 않는 "$*"
Test 명령어
- 쉘에서 사용하는 조건 명령어
- "test" 또는 '[' ']' 사용
- 테스트 조건 등 검사한 후 그 결과를 참 또는 거짓값을 반환
- 아래는 foo.c 라는 파일의 존재 여부를 검사
if test -f foo.c
then
to do something
fi
if [ -f foo.c ]
then
to do something
fi
test 명령어로 사용할수 있는 조건 유형
- 문자열 비교 : string1 = string2/ -n string 문자열이 널이 아니면 참/ -z string 문자열이 널이면 참
- 수식 비교 : exp1 -eq ex2 두 표현식이 동일하면 참/ exp1 -gt exp2 exp1이 exp2보다 크면 참
- 파일 존재여부 : -d file 파일이 디렉토리인지 검사/ -e file 파일이 있으면 참 / -f file 파일이 일반파일이면 참 /
-g file에 그룹 id가 설정시 참 / -r file 파일을 읽을수 있으면 참 / -s file 파일 크기가 0이아니면 참
if 문
- 실행 조건을 테스트 해서 선택적 실행
- cond 에서는 test 명령어 사용
- if문 종료시 fi로 마침
if cond
then
task1
else
task2
fi
if 문을 사용한 예시
- if와 then을 같은 라인에서 사용시 ;(세미콜론)을 사용해서 if의 test와 then을 분리해야함
#!/bin/sh
echo "hello world ! who u are?"
read name
if [name="momo"]; then
echo "it's U"
else
echo "Not U"
fi
exit 0
for 문
- 변수 값이 지정된 범위 내에서 변수값을 바꿔가면서 반복 실행
- 문법
for var in values
do
task
done
- 예시
#!/bin/sh
for name in foo bar boo
do
echo $name
done
exit 0
while 문
- 실행 조건을 테스트해서 결과가 거짓이 될때까지 반복 실행
- 문법
while cond do
task
done
-사용 예
#!/bin/sh
echo "Enter name"
read myname
while ["$myname"!="momo"]; do
echo "Sorry, not myname"
read myname
done
exit 0
Until 문
- 조건을 테스트해서 결과가 거짓이 될때까지 반복.
- while과 반대
- 적어도 한번은 수행
- 문법
until cond
do
task
done
- 사용예
#!/bin/sh
echo "start!"
icnt=10
until [$icnt -eq 12]
do
echo $icnt
icnt=`expr $icnt+1`
done
exit 0
case 문
- 변수 패턴을 검사하여, 패턴에 따라 다른작업 실행
- 문법
case variable in
pattern [|pattern] ...)
statements;;
pattern [|pattern] ...)
statement;;
esac //case의 반대로
exit 0
- 사용예
#!/bin/sh
echo "Type your color"
read mycolor
case "$mycolor" in
green|g* ) echo "GREEN";;
red|r* ) echo "RED";;
* ) echo "OTHERS";;
esac
exit 0
List 문
- 문장 또는 명령어들을 직렬로 연결하여 사용
- AND 리스트 : 연산자 &&, 앞 명령어 성공시 뒷 명령어 실행
- OR 리스트 : 연산자 ||. 앞명령어 실패시 다음명령어 실행
- 사용 예
#!/bin/sh
...
if [ -f myfile ] && echo "hello"
then
echo "AND list"
fi
...
if [ -f myfile ] || echo "hello"
then
echo "OR list"
fi
...
exit 0
쉘스크립트의 함수
- 문장 그룹에 이름을 붙여 함수로 정의해 사용가능
- 함수를 사용하여 스크립트 구조화 가능
- 함수 파라미터 전달 : 쉘 스크립트 파라미터 전달과 동일.
첫번재 파라미터 $1, 파라미터 전체 문자 $@, 파라미터 수 $#
- 함수 리턴 값: return 명령어 사용
- 함수 호출에서 리턴값을 $?으로 참조
- 포맷
fname (){
task
}
function fname{
task
}
- 사용예
#!/bin/bash
myadd(){
sum=$(($1+$2))
return $sum
}
op1=10
op2=20
myadd $op1 $op2
echo "sum:$?"
exit 0
'컴퓨터과학 > 임베디드' 카테고리의 다른 글
ARM을 활용한 임베디드 시스템 설계 15 - 임베디드 시스템 개발 환경 (0) | 2020.05.04 |
---|---|
ARM을 활용한 임베디드 시스템 설계 14 - 소스 컴파일 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 7 - ARM 명령어 구조 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 6 - 레지스터 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 5 - 메모리 (0) | 2020.05.03 |