코딩/Linux
[Linux] 쉘 프로그래밍, 문자열 연산, 명령어 대입
낫띵온미
2022. 10. 21. 01:11
※ Linux Fundamentals 교재를 참고하였습니다!
쉘 프로그래밍 : 리눅스 명령어를 사용하여 일정 동작을 수행하도록 쉘 스크립트 작성
쉘 스크립트
- 리눅스 명령어 포함 소스파일
- shell에 의해 해석/실행
쉘 스크립트 작성
- vi 또는 gedit 으로 작성
- 작성한 스크립트파일에 실행 권한 추가 (chmod)
쉘 스크립트 실행
- $bash script-name : 쉘 프로그램 명시
- $ ./script-name : 절대경로명 입력
- exit 필요
- $ . ./script-name : . = 현재 shell 실행명령, 이후는 경로명(pwd)
- $ source script-name : 현재 dir, 현재 shell에서 실행
- 스크립트 파일 디렉토리를 PATH 환경병수에 추가
- $export PATH=$PATH:~/scripts
- 스크립트명에 해당하는 명령어가 없으면 PATH 탐색 후 실행
인용
- 작은 따옴표 : strong qoute : 내부 전혀 해석안함
- 큰 따옴표 : weak qoute : 일부 해석(변수)
- backslash(\) : 특수문자 출력
위치매개변수
$1, $2, $3 | 명령어 뒤 인자 순서대로 |
$0 | 스크립트명 |
$* | 모든 매개변수 (0제외), 공백 구분 str 전달 |
$@ | 모든 매개변수 (0제외), 독립 인자로 전달 |
$# | 매개변수 개수 |
함수
- funcname( ) { }
- function funcname{ }
- 스크립트와 달리 서브 프로세스에서 실행되지 않음
- declare -f : 정의된 함수 알아내기
우선순위
- Alias
- 키워드 (function, if, for)
- 함수
- 내장명령
- 스크립트파일, 바이너리 실행파일
- 동일명 함수 > 스크립트
함수의 위치매개변수
- 스크립트와 동일한 방법
- 스크립트 파일 만들면 함수 정의
- 실행명령을 스크립트파일에 명령하고 실행해야 함
함수 내 Local 변수
- local : 위치매개변수
- grobal : 다른 변수, 함수내부 정의 변수
- local var="Hello"
변수의 값
- ${varname} : 일반적인 표현
- $10 => $1, 0
- ${10} => $10
문자열 연산
문자열 연산 규칙
- { 변수 이름 + 연산자 + 매개변수 }
대입
${var:-word} | null인 경우 word 리턴 |
${var:=word} | null인 경우 var=word 지정 후 리턴 |
${var:?message} | null인 경우 변수명 출력, message 출력, 스크립트 수행 멈춤 |
${var:+word} | null이 아니면 word 리턴 null인 경우 null을 리턴 변수의 존재 체크 |
${var:offset:length} | var값의 offset부터 시작해서 legnth만큼 문자열 리턴 $count='forgfootman' ${count:4:4} => 'foot' |
패턴 매칭
${var#pattern} | 앞에서부터 매칭되는 가장 짧은 서브스트링 제거한 나머지 부분 리턴 |
${var##pattern} | 앞에서부터 매칭되는 가장 긴 서브스트링 제거한 나머지 부분 리턴 |
${var%pattern} | 뒤에서부터 매칭되는 가장 짧은 서브스트링 제거한 나머지 부분 리턴 |
${var%%pattern} | 뒤에서부터 매칭되는 가장 긴 서브스트링 제거한 나머지 부분 리턴 |
${var/pattern/string} | 매칭되는 첫번째 부분을 모두 string으로 치환 패턴 시작 #(앞부터), %(뒤부터) string이 null이면 매칭부분 삭제 |
${var//pattern/string} | 매칭되는 모든 부분을 모두 string으로 치환 |
- 대표적인 사용 예
- path = /home/cam/book/long.file.name
${path##/*/} | 앞, 가장 긴 문자열 | /home - book/ | long.file.name |
${path#/*/} | 앞, 가장 짧은 문자열 | /home/ | cam/book/long.file.name |
${path%.*} | 뒤, 가장 짧은 문자열 | .name | /home/cam/book/long.file |
${path%%.*} | 뒤, 가장 긴 문자열 | .file.name | /home/cam/book/long |
명령어 대입
변수 값 할당
- 명시적 변수 정의&할당 : $var=1
- 명령줄 매개변수 : $1, $2...
- 명령어 대입 : 명령어의 실행결과를 변수값인 것처럼 사용
- $(command)
- $(<alice) : alice 파일의 내용
- grep -l : 패턴 매칭 파일명만 출력
- double quote 내부에서 처리됨