[구름 k8s] TIL 1-3-4

Peppie·2022년 8월 19일
0

1. shell 환경 설정

shell

Linux Kernel과 사용자 간 상호 작용을 위한 인터페이스 역할 수행 application

기능

명령 해석 및 실행 기능

  • 사용자와 Linux Kernel 사이에서 명령을 해석하고 전달하는 해석기 (interpreter) 와 번역기 (translator) 기능
  • Login Shell : Linux booting 후 기본 사용 shell
    • login shell 지정 -> /etc/passwd 파일에 저장
    • /etc/passwd : 현재 Linux에 등록된 사용자 정보 저장파일, 실제 password 저장 X


      사용자 이름:x:UID:GID:사용자 설명:홈디렉토리:login shell

    • /etc/shadow : password 저장 파일, passwd 명령
    • /etc/group : group 정보 저장 파일, chgrp (그룹 변경) , addgrp (그룹 추가) 명령
    • /etc/gshadow : group password 저장
  • 프롬프트 (prompt) : 사용자로부터 명령 입력을 기다릴 때 표시되는 내용

프로그래밍 기능

자동화 (반복적인 동작 자동 수행)

  • 반복적으로 수행하는 작업을 프로그램 형태로 작성해서 일괄 실행하는 기능 -> 반복 동작 자동화

shell 프로그램 => shell script

  • shell에서 사용하는 명령을 모아놓은 파일
  • shell script를 실행함으로써 명령들을 자동 실행

사용자 환경 설정 기능

환경설정 파일 (초기화 파일) : 사용자 환경을 설정할 수 있는 파일

  • 명령 검색 경로
  • 파일 생성시 기본 권한
  • 환경 변수 설정

shell 종류

본 쉘 (Bourne shell)

  • UNIX V7에 처음 적용
  • 표준 shell이라고도 함
  • 본 쉘 이름 : sh
  • 단순하고 처리 속도가 빠른 장점, 시스템 관리 작업 수행시 현재도 많이 사용
  • history, alias, 작업 제어 등의 편의 기능 미약

C shell

  • BSD UNIX에 처음 적용
  • C shell 이름 : csh
  • Bourne shell에 없던 history, alias와 같은 편의 기능 추가
  • shell script 형식이 C 언어와 같기 때문에 C shell이라고 함

콘 쉘 (Korn shell)

  • AT&T에서 개발
  • UNIX SVR 4에 처음 적용
  • 콘 쉘 이름 : ksh
  • 본 쉘과의 호환성을 유지하면서 사용자 편의 기능과 C shell의 특징을 모두 제공, 빠른 속도

★ 배시 쉘 (bash shell, bourne again shell) ★

  • 본 쉘 기반으로 개발
  • 본 쉘과 호환성 유지하면서 csh, ksh 기능 포함
  • 본 쉘 이름 : bash
  • GPL license 기반 open source
  • Linux 기본 쉘로 제공

대시 쉘 (dash shell)

  • 본 쉘 기반으로 개발
  • POSIX 표준 준수 및 크기가 작게 개발
  • 대시 쉘 이름 : dash
  • Ubuntu에서는 bash 대신 dash 사용

chsh

로그인 쉘 변경 명령 ; chsh [옵션][사용자명]

  • -s shell : 지정한 쉘(쉘의 절대경로)로 login shell 변경
  • -l : 지정가능한 shell 출력, /etc/shells 파일 저장 내용, Ubuntu 2004에선 지원 X

로그인 쉘과 서브 쉘

  • 현재 프롬프트 상에서 다른 쉘을 실행하면 해당 쉘은 서브 쉘
  • 서브 쉘은 현재 쉘과 별개의 다른 쉘 진행
  • 서브 쉘 종료 방법은 exit 명령, ctrl+d 입력
  • 서브 쉘이 종료되면 이전 쉘 환경으로 복귀
  • 로그인 쉘을 종료하면 logout 상태

    logout : 현재 사용자 사용 종료, Linux booting 후 login 화면으로 전환
    Linux 종료 : 일명 shutdown이라고 하면 Linux를 완전히 종료한다는 의미

shell 명령

shell 내장 명령

별도의 실행 파일 존재 X

type 명령

명령 종류 확인 ; type <명령>

shell 일반 명령

별도의 실행 파일 존재, 실행시 메모리에 로드 후 실행되는 과정을 거침
사용자 작성 프로그램 또한 shell 일반 명령으로 볼 수 있음

echo

문자열 또는 변수 내용 출력; echo [옵션] <출력할 문자열 or $변수명>

  • -n : 줄바꿈 X
    ex) echo -n 'hello ' ; echo 'world' 또는 echo -n hello ; echo -n ' ' ; echo world
  • 문자열은 ' ' (따옴표), " " (이중 따옴표)로 묶거나 직접 문자열만 표기 가능
  • 변수 (variable) : 메모리 공간에 부여한 이름, 메모리 공간에 값을 저장할 때 사용
    • 변수명만 표기하면 변수 내용이 아닌 변수명을 문자열로 인식
    • 변수 내용은 $변수명 형식 사용

특수문자

shell 환경에서 사용하는 문자열을 표현하는 특수문자

  • ' ' (따옴표) : 문자열을 감싸서 표현, 문자열 안의 특수문자 기능은 모두 해제
  • " " (이중 따옴표) : 문자열을 감싸서 표현, 문자열 안의 특수문자 중 $ , ` (백틱) , /를 제외한 특수문자 기능은 모두 해제
  • ` (백틱) : 표현식 또는 명령에 대한 기능 수행 결과
    ex) echo "current directory - pwd"
  • \ (백슬래시) : 제어문자 효과 배제
    • 제어문자 : 특정 문자에 기능을 적용

      \n : 줄바꿈
      \t : tab 문자
      \b : backspace

변수 (variable)

값을 저장하는 메모리 공간

변수명 : 변수에 대한 이름

변수 생성 방법

  • 변수명=값(문자열)
  • 변수명은 항상 대문자 사용
  • = 기호 앞뒤로 공백이 있으면 안됨

변수 종류

  • shell 변수 : 현재 사용중인 shell에서만 사용 가능한 변수 (지역변수)
    • 생성 : 변수명=값
  • 환경 변수 : 현재 사용중인 shell과 자식(서브) shell에 모두 적용되는 변수 (전역변수)
    • 생성 : export 변수명=값
    • shell 변수를 환경변수로 변경 : export <shell 변수>
  • unset 명령 : 변수 해제; unset 변수명

변수 목록 출력

  • set 명령 : 전체 변수 출력, shell 변수/환경변수 모두 출력
  • env 명령, printenv 명령 : 환경변수 전체 출력

주요 환경변수

  • HISTSIZE : 명령 history 저장 크기
  • HOME : 사용자 홈 디렉토리 절대 경로
  • LANG : 사용 언어
  • LOGNAME : 사용자 계정 이름
  • PATH : 명령 탐색 경로
    • Linux에서는 명령 검색을 PATH 변수 내용의 경로에서 수행
  • PWD : 현재 디렉토리 경로
  • SHELL : login shell

alias

별명 의미, 원하는 기능을 수행하는 명령(들)을 별도의 alias를 통해 지정

  • alias : 현재 설정된 alias 목록
  • alias <이름>='명령;명령;...' : alias 설정
    ex) alias myls='echo -n "current :";pwd;ls -F'
  • unalias <alias 이름> : alias 해제

환경설정

Linux 부팅 시 도는 사용자 로그인 때마다 자동으로 shell 환경설정 -> 처음 한번 적용
환경설정 파일 : 환경설정 내용을 담고 있는 text 파일

환경설정 파일에 #은 해당 line은 주석(comment)의미, 실제 환경설정 적용에 사용 X

시스템 환경설정 파일

Linux 시스템을 사용하는 모든 사용자에게 공통으로 적용되는 환경정보를 담고 있는 파일
관리자 권한으로 수정 가능

/etc/profile

  • 시스템 공통으로 적용되는 환경변수 설정
  • PATH, USER, HOSTNAME, HISTSIZE
  • 기본 접근 권한 설정
  • /etc/profile.d/*.sh 실행

/etc/bashrc (없는 경우도 있음)

  • 시스템 공통으로 적용되는 함수와 alias 설정
  • 기본 프롬프트 설정
  • 서브 shell을 위한 명령 경로 설정
  • 서브 shell을 위한 기본 접근 권한 설정

/etc/profile.d/*.sh

  • 언어나 명령별 각각 필요 환경 설정
  • 필요시 설정 파일 추가

사용자 환경설정 파일

개별 사용자마다 원하는 환경설정에 대해 환경설정 정보를 담고 있는 파일

사용자가 로그인하면 먼저 시스템 환경설정 파일 내용을 적용한 후, 사용자 환경설정 파일 적용 순으로 실제 설정이 이루어짐

사용자 환경설정 파일은 사용자 홈 디렉토리에 hidden 파일로 저장

~/.bash_profile

  • .bashrc 파일이 있으면 실행
  • 경로 추가 등 사용자 정의 환경 설정

~/.profile -> 사용자가 필요한 환경설정 내용 추가

  • 경로 추가 등 사용자가 정의하는 환경설정
  • ~/.bashrc 파일이 있으면 실행

~/.bashrc -> 사용자가 필요한 환경설정 내용 추가

  • 일반적인 사용자 환경 설정
    -사용자 정의 함수나 alias 등 설정

~/.bash_logout

  • logout 시 실행할 함수 등 설정

~/.bash_history

  • 명령 history 저장 파일
  • history 명령이 참조하는 파일

2. shell script

shell 명령 기반으로 자동화를 수행하는 파일

  • 단순히 shell 명령만 사용하는 것이 아닌, 선택/반복 등의 실행 흐림 제어 기능을 적용하여 프로그램 성격을 갖도록 작성한 파일
  • shell script 파일 첫 줄이 #!/bin/sh 또는 #!/bin/bash( shebang 셔뱅)을 추가하여 실행할 shell을 명시해주는 것이 일반적인 형식
  • shell script 파일은 .sh 확장자 부여
  • shell script 파일은 text 파일

shell script 실행

실행권한 부여

chmod 명령을 이용하여 실행권한 부여

source 명령 사용

환경설정 파일 변경 후 현재 shell에 바로 적용하고자 할 때 많이 사용 ; source <shell script 파일>

shell script 구성요소

변수

값 저장 목적으로 사용하는 shell 변수

  • 변수명은 소문자 사용
  • 만약 shell 변수나 환경변수로 사용할 변수는 대문자 사용
  • 변수내용 접근시 $를 변수명 앞에 사용
  • 다른 문자열과 변수를 혼합하여 사용시 변수를 { }로 묶어서 사용

shell script에서 사용하는 특수 변수

$0 : shell script 파일 이름
1 1 ~n : n번째 인수
$* : 모든 인수 목록
$# : 인수 개수
$? : 직전 실행명령 상태 (반환값)
$$ : shell script process ID
$LINENO : 변수를 사용한 줄번호
shift : 인수 위치를 하나씩 왼쪽으로 이동

쉘 스크립트 예시 1: sample.sh

#!/bin/sh

var1=abc
str="string"

echo $var1
echo $str
echo ${var1}-${str}

var2="${var1}-string ${str}"
echo $var2

chmod 775로 파일권한 변경 후 실행 결과 :


쉘 스크립트 예시 2: sample1.sh

#!/bin/sh

echo $0
echo
echo total argument is $*
echo 1st argument is $1
echo 2nd arguement is $2
echo The number of arguments is $#

shift
echo 1st arguement is $1

chmod 775로 파일권한 변경 후 실행 결과 :

(아무 변수도 넣지 않았을 때)


(정상적으로 변수를 입력했을 때)

조건에 따른 실행

  • if then ~ elif ~ else ~ fi : 조건식의 결과에 따른 실행 대상
if [ 조건식1 ] then
	조건식 1 참인 경우 실행 내용
elif [ 조건식2 ] then
	조건식 2 참인 경우 실행 내용
...
else
	조건식1/조건식2가 아닌 경우 실행 내용
fi
  • [ 식 ]

    [ -n string ] : string 길이가 0이 아니면 참
    [ -z string ] : string 길이가 0이면 참
    [ str1 = str2 ] : str1과 str2가 동일하면 참
    [ str1 != str2 ] : str1과 str2가 같지 않으면 참

  • 관계 연산

    -eq : 같다
    -ne : 같지 않다
    -gt : 크다
    -ge : 크거나 같다
    -lt : 작다
    -le : 작거나 같다

쉘 스크립트 예시 3: mylist.sh

#!/bin/sh

echo "argument count - $#"
echo

# if [ $# -eq 1 ]; then
if [ $# -eq 1 ]
then
	ls -lF $1
else
	echo "Usage : ./mylist.sh <argument>"
fi

chmod 775로 파일권한 변경 후 실행 결과 :

(아무 변수도 입력하지 않았을 때)


(정상적으로 변수를 입력했을 때)


  • 논리 연산

    -a : and
    -o : or
    !식 : not
    (식) ; ( ) 안의 결과를 돌려줌. 여러 식 결합시 사용, ' '로 감싸서 사용

  • 파일 판단

    -f file : 파일 존재하고 일반 파일이면 참
    -c file : 파일 존재하고 특수 파일이면 참
    -e file : 파일이 존재하면 참
    -d file : 파일 존재하고 디렉토리 파일이면 참
    -L file : 파일 존재하고 심볼릭 링크 파일이면 참
    -r file : 파일 존재하고 읽기 가능하면 참

반복 실행

일정 회수 또는 조건이 만족하는 동안 원하는 동작을 반복 실행

  • for : 반복할 내용 (회수) 이 정해진 경우
for <변수> in <반복대상>; do
	반복시 수행할 내용
done
  • while : 조건에 따라 반복을 수행할 경우 ( 반복 회수 정해지지 X )
    조건이 만족하는 동안 반복
    • while문 안에서 반복제어 변수의 내용을 변경해서 조건식의 결과가 거짓이 될 수 있도록 하지 않으면 무한 loop에 빠지니 주의
while [<반복 제어 변수> 이용한 조건식]; do
	조건이 참인 동안 수행할 내용
    <반복제어 변수 내용 변경>

쉘 스크립트 예시 4: mylist2.sh

#!/bin/sh

echo "argument count - $#"
echo

if [ $# -ge 1 ]; then
	for arg in $*; do
    		echo "argument - $arg"
    done
else
	echo "Usage : ./mylist2.sh <argument>..."
fi

chmod 775로 파일권한 변경 후 실행 결과 :

(아무 변수도 입력하지 않았을 때)

(변수를 두개 이상 입력했을 때. 하나만 입력해도 무방하긴 하다.)


expr

연산식을 표현할 때 사용

`expr 연산식`

쉘 스크립트 예시 5: while.sh

#!/bin/sh

num=1
if [ $# -eq 1 ]; then
	num=1
    while [ $num -le $1 ]; do
    	echo "num is $num"
        num=`expr $num + 1`
    done
else
	echo "Usage : ./while.sh <loop count>"
fi

chmod 775로 파일권한 변경 후 실행 결과 :

(아무 변수도 입력하지 않거나 2개 이상의 변수를 입력했을 때)


(변수 하나를 입력했을 때)

3. TIF

참고할만한 사이트 : roadmap.sh

초반부터 중후반까지는 그래도 뭔가 그동안 배웠던 프로그래밍 기초를 복습하는 듯 쉬어가는 느낌이었는데 막판에 쉘 스크립트에서 말 그대로 휘몰아쳐서 정말 정신없었다. 그러면서도 쉘 스크립팅이 리눅스의 꽃 중 하나이니 그 중요성에는 나도 동의한다. 강사님께서는 리눅스를 연습할 때 시나리오를 짜면서 하라고 거듭 강조하시는데, 도대체 어떤 식으로 시나리오를 짜는건지 여전히 감이 안잡힌다. 외국 사이트를 검색하면 좀 나으려나?

0개의 댓글