코딩/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 : 정의된 함수 알아내기

우선순위

  1. Alias
  2. 키워드 (function, if, for)
  3. 함수
  4. 내장명령
  5. 스크립트파일, 바이너리 실행파일
  • 동일명 함수 > 스크립트

함수의 위치매개변수

  • 스크립트와 동일한 방법
  • 스크립트 파일 만들면 함수 정의
  • 실행명령을 스크립트파일에 명령하고 실행해야 함

함수 내 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

 

 

 

 


명령어 대입

변수 값 할당

  1. 명시적 변수 정의&할당 : $var=1
  2. 명령줄 매개변수 : $1, $2...
  3. 명령어 대입 : 명령어의 실행결과를 변수값인 것처럼 사용
  • $(command)
    • $(<alice) : alice 파일의 내용
    • grep -l : 패턴 매칭 파일명만 출력
  • double quote 내부에서 처리됨