리뷰 (Review)
SSH (Secure SHell)
- 22번 Port 사용
- 공개키 암호 방식으로 데이터 송수신
- ssh-keygen 명령으로 개인키 / 공개키 생성
- 가상 PC 환경에서 SSH 접속 환경 구축 방법
- NAT 환경에서 포트 포워딩 기능 사용
- NAT 네트워크 구성
- 호스트 어댑터 이용 - SSH server ip로 접속
스냅 패키지 관리
- 장점
- 다른 패키지나 라이브러리 의존성에 대하여 고려하지 않고 개발
- 기존 시스템과 격리되어 실행하는 샌드박스 형식으로 보안 강화
- 단점
- 패키지 용량이 큼
- snap [옵션] 명령
- list
- info 스냅명
- find 스냅명
- install 스냅명 - 관리자 권한 필요
- remove 스냅명 - 관리자 권한 필요
파일 아카이브 및 압축
- 파일 아카이브 - 파일들을 하나로 묶는 동작, 확장자 .tar
- tar 기능[옵션] <아카이브 파일> <아카이브 대상 파일 또는 디렉토리>
- cvf, tvf, xvf, cvfz, cvfj정도는 많이 쓰임
- 압축 - 일반적으로 gzip 사용
- gzip [옵션] <파일명> - 확장자 .gz
- bzip2 [옵션] <파일명> - 확장자 .bz2
- zip <압축파일명> <파일명> - .zip
호스트 접속 확인 명령
- ping [옵션] <호스트 IP 또는 domain>
- 보안 문제로 응답을 하지 않는 경우도 많음
원격 호스트에 대한 패킷 경로 표시
- Ubuntu - traceroute [옵션] <호스트>
- CentOS - tracepath [옵션] <호스트>
호스트 IP 주소 / 도메인명 검색
- /etc/resolv.conf 파일에 검색 요청할 DNS 정보 기록
- host [옵션] <domain 또는 IP Address>
SSH client 명령
- ssh [옵션] <[사용자명]@<호스트명>>
- ssh <host IP> - login시 ID / PW 입력
- ssh <사용자명@host IP> - login시 PW 입력, 일반적인 방식
- ssh-keygen - 개인키 / 공개키 생성 명령
- 사용자 홈 디렉토리/.ssh에 키 저장
- 개인키 - id_rsa
- 공개키 - id_rsa.pub
CLI 방식의 웹 브라우저
- 특정 사이트로부터 데이터 다운로드 동작 수행하는 웹 브라우저 기능 명령
- wget [옵션] URL
- curl [옵션] URL
네트워크 인터페이스 확인 및 설정
- ip [옵션] addr [내부 명령]
- ifconfig
인터넷 경로 (routing) 설정
- ip route [내부 명령]
- route [옵션] [내부 명령]
네트워크 소켓 정보 및 접속 상환 표시
- ss [옵션]
- ip [옵션] link [내부 명령]
- netstat [옵션]
네트워크 인터페이스 트래픽 데이터 표시하기 - wireshark와 유사 기능 수행
- sudo tcpdump [옵션] [조건]
Linux 개요
shell 환경 설정
shell
- Linux Kernel과 사용자의 상호 작용을 위한 인터페이스 역할 수행 Application
- 기능
- 명령 해석 및 실행 가능
- 사용자와 Linux Kernel 사이에서 명령을 해석하고 전달하는 해석기(interpreter)와 번역기(translator) 기능
- Linux booting 후 기본 사용 shell - login shell
- login shell 지정 - /etc/passwd 파일에 저장
- /etc/passwd - 현재 Linux에 등록된 사용자 정보 저장 파일, 실제 password는 저장하고 있지는 않는다.
- /etc/shadow - password 저장 파일, passwd 명령
- /etc/group - group 정보 저장 파일, chgrp, addgrp 명령
- /etc/gshadow - group password 저장 파일
- 프롬프트(prompt) - 사용자로부터 명령 입력을 기다릴 때 표시되는 내용
- 프로그래밍 기능 - 자동화 (반복적인 동작 자동 수행)
- 반복적으로 수행하는 작업을 프로그램 형태로 작성해서 일괄 실행하는 기능 - 반복 동작 자동화
- shell 프로그램 - shell script
- shell에서 사용하는 명령을 모아 놓은 파일
- shell script를 실행함으로써 명령들을 자동 실행 (유사한 기능으로 crontab)
- 사용자 환경 설정 기능
- 환경 설정 파일 (초기화 파일)
- 명령 검색 경로
- 파일 생성 시 기본 권한
- 환경 변수 설정
- 환경 설정 파일 (초기화 파일)
- 명령 해석 및 실행 가능
jwlish@jwlish:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
jwlish:x:1000:1000:jwlish,,,:/home/jwlish:/bin/bash
sshd:x:127:65534::/run/sshd:/usr/sbin/nologin
# 사용자이름:x:UID:GID:사용자 설명:홈 디렉토리:login shell
shell 종류
- 본 쉘 (Bourne shell)
- UNIX V7에 처음 적용
- 표준 shell이라고도 한다.
- 본 쉘 이름 - sh
- 단순하고 처리 속도가 빠른 장점, 시스템 관리 작업 수행 시 현재도 많이 사용하는 shell
- history, alias, 작업 제어 등의 편의 기능이 미약
- C shell
- BSD UNIX에 처음 적용
- C chell 이름 - csh
- Bourne shell에 없던 history, alias와 같은 편의 기능 추가
- shell script 형식이 C 언어와 같기 때문에 C shell이라 한다.
- 콘 쉘 (Korn shell)
- AT&T에서 개발
- UNIX SVR4에서 처음 적용
- 콘 쉘 이름 - ksh
- 본 쉘과 호환성을 유지하면서 사용자 편의 기능과 C shell의 특징을 모두 제공하며 속도가 빠름
- 배시 쉘 (Bash shell, bourne again shell)
- 본 쉘 기반으로 개발
- 본 쉘과 호환성을 유지하면서 csh, ksh 기능을 포함
- 배시 쉘 이름 - bash
- GPL license 기반 open source
- Linux 기본 shell로 제공
- 대시 쉘 (dash shell)
- 본 쉘 기반으로 개발
- POSIX 표준 준수 및 크기가 작게 개발
- 대시 쉘 이름 - dash
- Ubuntu에서는 bash 대신 dash 사용
- chsh - 쉘 변경 명령
- chsh [옵션] [사용자명]
- -s shell : 지정한 쉘(쉘의 절대 경로)로 login shell 변경
- -l : 지정 가능한 shell 출력, /etc/shells 파일 내용, Ubuntu 2004 에서는 지원 x
- chsh [옵션] [사용자명]
jwlish@jwlish:~$ cat /etc/shells
# /etc/shells: valid login shells
# 사용 가능한 shell list
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
jwlish@jwlish:~$ ls -liF /bin/bash
2884445 -rwxr-xr-x 1 root root 1183448 4월 18 18:14 /bin/bash*
jwlish@jwlish:~$ ls -liF /usr/bin/bash
2884445 -rwxr-xr-x 1 root root 1183448 4월 18 18:14 /usr/bin/bash*
# inode 번호가 같음
- 로그인 쉘과 서브 쉘
- 현재 프롬프트 상에서 다른 쉘을 실행하면 해당 쉘은 서브 쉘이라 한다.
- 서브 쉘은 현재 쉘과 별개의 다른 쉘을 실행
- 서브 쉘 종료 방법은 exit나 ctrl + d 키 입력
- 서브 쉘이 종료되면 이전 쉘 환경으로 복귀
- 로그인 쉘을 종료하면 logout 상태가 된다.
- logout - 현재 사용자 사용 종료, Linux booting 후 login 화면으로 전환
- Linux 종료 - shutdown이라고 하며 Linux를 완전히 종료한다는 의미
jwlish@jwlish:~$ sh # login shell에서 sh 실행
$ dash # dash 실행
$ bash # bash 실행
jwlish@jwlish:~$ exit # bash 종료
exit
$ exit # dash 종료
$ exit # sh 종료
jwlish@jwlish:~$ # login shell
shell 명령
- shell 내장 명령
- shell에 내장된 명령으로 별도의 실행 파일이 존재하지 않는 명령
- type <명령> - 명령 종류 확인
- shell 일반 명령
- 별도의 실행 파일로 존재하면서 실행 시 메모리에 로드한 후 실행되는 과정을 거치는 명령
- 사용자 작성 프로그램 또한 shell 일반 명령으로 볼 수 있다.
jwlish@jwlish:~/work$ type cd
cd is a shell builtin # 내장 명령
jwlish@jwlish:~/work$ type clear
clear is /usr/bin/clear # 일반 명령
jwlish@jwlish:~/work$ type pwd
pwd is a shell builtin # 내장 명령
- echo - 문자열 또는 변수 내용 출력 (표준 출력 장치)
- echo 명령은 자동 줄 바꿈 기능을 갖고 있다.
- echo [옵션] <출력할 문자열 또는 $변수명>
- -n : 줄 바꿈을 하지 않는다.
- 문자열은 ' ', " "로 묶거나 문자열만 직접 표기할 수 있다.
- 변수 (variable)
- 메모리 공간에 부여한 이름, 메모리 공간에 값을 저장할 때 사용
- 변수명만 표기하면 변수 내용이 아니고 변수명을 문자열로 인식
- $변수명 형식 사용
# 줄 바꿈, '', ""
jwlish@jwlish:~/work$ echo 'hello';echo 'world'
hello
world
jwlish@jwlish:~/work$ echo -n 'hello';echo 'world'
helloworld
jwlish@jwlish:~/work$ echo -n hello;echo world
helloworld
jwlish@jwlish:~/work$ echo -n 'hello ';echo 'world'
hello world
# 변수
jwlish@jwlish:~/work$ echo $SHELL
/bin/bash
jwlish@jwlish:~/work$ echo $HOME
/home/jwlish
- shell 환경에서 사용하는 문자열 표현 특수 문자
- ' ' - 문자열 안의 특수 문자 기능은 모두 해제
- " " - 문자열 안의 특수 문자 중 $, `(backtick), \ 를 제외한 특수 문자 기능은 모두 해제
- ` (백틱, backtick) - 표현식 또는 명령에 대한 기능 수행 결과
- \ (역슬래시, backslash) - 제어 문자 효과를 없애고자 할 때 사용
- 제어 문자 - 특정 문자에 기능을 적용한 문자
- \n : 줄 바꿈
- \t : tab
- \b : backspace
- 제어 문자 - 특정 문자에 기능을 적용한 문자
# 특수 문자
jwlish@jwlish:~/work$ echo 'current directory - `pwd`' # '' 내부에 `(backtick) 있을 때
current directory - `pwd`
jwlish@jwlish:~/work$ echo "current directory - pwd" # "" 내부에 ` 없을 때
current directory - pwd
jwlish@jwlish:~/work$ echo "current directory - `pwd`" # "" 내부에 ` 있을 때
current directory - /home/jwlish/work
변수 (variable)
- 값을 저장하는 메모리 공간
- 변수 생성 방법
- 변수명=값 (문자열)
- 변수명은 항상 대문자 사용
- = 기호 기준 앞 / 뒤로 공백이 없어야 한다.
- 변수 종류
- shell 변수 - 현재 사용 중인 shell에서만 사용 가능한 변수 (지역 변수)
- 변수명=값 : shell 변수 생성
- 환경 변수 - 현재 사용 중인 shell과 자식(서브) shell에 모두 적용되는 변수 (전역 변수)
- export 변수명=값 : 환경 변수 생성
- export <shell 변수> : shell 변수를 환경 변수로 변경
- export -n <환경 변수> : 환경 변수를 shell 변수로 전환
- unset <변수명> - 변수 해제
- shell 변수 - 현재 사용 중인 shell에서만 사용 가능한 변수 (지역 변수)
# 지역 변수 생성
jwlish@jwlish:~/work$ MYPWD="current directory - `pwd`" # MYPWD라는 shell 변수 생성
jwlish@jwlish:~/work$ echo $MYPWD # 변수 호출
current directory - /home/jwlish/work # 값이 출력 됨
# 지역 변수임을 확인
jwlish@jwlish:~/work$ sh # 서브 shell 호출
$ echo $MYPWD # MYPWD 변수 호출
# 값이 출력 되지 않음
# 환경 변수, 서브 shell에서도 실행이 됨
jwlish@jwlish:~/work$ echo $HOME # 변수 호출
/home/jwlish # 변수 출력
jwlish@jwlish:~/work$ sh # 서브 shell 실행
$ echo $HOME # 변수 호출
/home/jwlish # 변수 출력, 전역 변수이기 때문에 출력 됨
# 환경 변수로 변경
jwlish@jwlish:~/work$ export MYPWD # MYPWD를 환경 변수로 변경
jwlish@jwlish:~/work$
jwlish@jwlish:~/work$ env | grep MYPWD # 환경 변수로 검색이 됨
MYPWD=current directory - /home/jwlish/work
# 변수 해제
jwlish@jwlish:~/work$ unset MYPWD
jwlish@jwlish:~/work$ env | grep MYPWD
jwlish@jwlish:~/work$ set | grep MYPWD
_=MYPWD
- 변수 목록 출력
- set - 전체 변수 출력, shell 변수 / 환경 변수 모두 출력
- env, printenv - 환경 변수 전체 출력
- 주요 환경 변수
- HISTSIZE - 명령 history 저장 크기
- HOME - 사용자 홈 디렉토리 절대 경로
- LANG - 사용 언어
- LOGNAME - 사용자 계정 이름
- PATH - 명령 탐색 경로
- Linux에서는 명령 검색을 PATH 변수 내용의 경로에서 검색한다.
- PWD - 현재 디렉토리 경로
- SHELL - login shell
alias
- 별명을 의미하며 원하는 기능을 수행하는 명령을 별도의 alias를 통해 지정
- alias : 현재 설정된 alias 목록
- alias <이름>='명령;명령;명령;...' : alias 설정
- unalias <alias 이름> : alias 해제
# alias 설정
jwlish@jwlish:~$ alias myls='pwd;ls -F' # myls alias 설정
jwlish@jwlish:~$ alias # alias 목록 출력
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
alias myls='pwd;ls -F' # 설정된 myls alias
jwlish@jwlish:~$ myls # myls로 명령 출력
/home/jwlish # pwd
cron2.out Desktop/ Downloads/ Music/ Public/ Templates/ work/ # ls -F
cron.out Documents/ grep Pictures/ snap/ Videos/
# alias 해제
jwlish@jwlish:~$ unalias myls # myls unalias로 해제
jwlish@jwlish:~$ alias # alias 목록 출력
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
환경 설정
- Linux booting시 또는 사용자 로그인할 때마다 자동으로 shell 환경 설정
- 환경 설정 파일 - 환경 설정 내용을 담고 있는 text 파일
- 시스템 환경 설정 파일
- Linux 시스템을 사용하는 모든 사용자에게 공통으로 적용되는 환경 정보를 담고 있는 파일
- 관리자 권한으로 수정 가능
- /etc/profile
- 시스템 공통으로 적용되는 환경 변수 설정
- PATH, USER, HOSTNAME, HISTSIZE
- 기본 접근 권한 설정
- /etc/profile.d/*.sh 실행
- /etc/bashrc - 없는 경우도 있음
- 시스템 공통으로 적용되는 함수와 alias 설정
- 기본 프롬프트 설정
- 서브 shell을 위한 명령 경로 (path) 설정
- 서브 shell을 위한 기본 접근 권한 설정
- /etc/profile.d/*.sh
- 언어나 명령 별 각각 필요 환경 설정
- 필요시 설정 파일 추가
- 사용자 환경 설정 파일
- 개별 사용자마다 원하는 환경 설정에 대하여 환경 설정 정보를 담고 있는 파일
- 사용자가 로그인하면 시스템 환경 설정 파일을 적용하고 이후 사용자 환경 설정 파일 적용 순으로 환경 설정
- 사용자 환경 설정 파일은 사용자 홈 디렉토리에 hidden 파일로 저장
- ~/.bash_profile
- .bashrc 파일이 있으면 실행
- 경로 추가 등 사용자 정의 환경 실행
- ~/.profile - 사용자가 필요한 환경 설정 내용 추가
- ~/.bashrc 파일이 있으면 실행
- 경로 추가 등 사용자 정의 환경 실행
- ~/.bashrc - 사용자가 필요한 환경 설정 내용 추가
- 일반적인 사용자 환경 설정
- 사용자 정의 함수나 alias 등 설정
- ~/.bash_logout
- logout 시 실행할 함수 등 설정
- ~/.bash_history
- 명령 history 저장 파일
- history 명령이 참조하는 파일
jwlish@jwlish:~$ sudo vi ~/.bashrc
# 맨 밑에 추가
# append jwlish environment
export MYPWD="current directory - `pwd`"
alias myls='echo -n "currnt : ";pwd;ls -F'
echo $MYPWD
# 로그아웃 후 재실행
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.15.0-46-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
70 updates can be applied immediately.
To see these additional updates run: apt list --upgradable
New release '22.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Your Hardware Enablement Stack (HWE) is supported until April 2025.
Last login: Fri Aug 19 16:11:17 2022 from 10.0.2.2
current directory - /home/jwlish # 등록된 사용자 환경 설정 출력
jwlish@jwlish:~$
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 파일>
jwlish@jwlish:~$ vi ~/.bashrc
# vi 편집기에 추가
MYVAR='jwlish user'
jwlish@jwlish:~$ set | grep MYVAR # 바로 적용되지 않음
jwlish@jwlish:~$ source ~/.bashrc # source 명령을 통해 적용
current directory - /home/jwlish
jwlish@jwlish:~$ set | grep MYVAR # MYVAR 변수 적용
MYVAR='jwlish user'
shell script 구성 요소
- 변수 - 값 저장 목적으로 사용하는 shell 변수
- 변수명은 소문자 사용
- 만약 shell 변수나 환경 변수로 사용할 변수는 대문자 사용
- 변수 내용 접근 시 $를 변수명 앞에 사용
- 다른 문자열과 변수를 혼합하여 사용 시 변수를 {}로 묶어서 사용
############################### 변수 ###############################
jwlish@jwlish:~$ cd work
jwlish@jwlish:~/work$ mkdir work_sciprt
jwlish@jwlish:~/work$ cd work_script
jwlish@jwlish:~/work/work_script$ vi sample.sh
---------------------------------------------------------
#!/bin/sh
var1=abc
str="string"
echo $var1
echo $str
echo ${var1}-${str}
var2="${var1}-string ${str}"
echo $var2
---------------------------------------------------------
jwlish@jwlish:~/work/work_script$ ls -lF
total 4
-rw-rw-r-- 1 jwlish jwlish 116 8월 19 17:01 sample.sh
jwlish@jwlish:~/work/work_script$ source sample.sh
abc
string
abc-string
abc-string string
jwlish@jwlish:~/work/work_script$ chmod 775 sample.sh # 실행 권한 부여
jwlish@jwlish:~/work/work_script$ ls -lF
total 4
-rwxrwxr-x 1 jwlish jwlish 116 8월 19 17:01 sample.sh*
jwlish@jwlish:~/work/work_script$ sample.sh # PATH에 없기 때문에 실행이 안됨
sample.sh: command not found
jwlish@jwlish:~/work/work_script$ /home/jwlish/work/work_script/sample.sh # 절대 경로로 실행
abc
string
abc-string
abc-string string
jwlish@jwlish:~/work/work_script$ ./sample.sh # 상대 경로로 실행
abc
string
abc-string
abc-string string
jwlish@jwlish:~/work/work_script$
- shell script에서 사용하는 특수 변수
- $0 - shell script 파일 이름
- $1 ~ $n - n번째 인수
- $* - 모든 인수 목록
- $# - 인수 개수
- $? - 직전 실행 명령 상태 (반환값)
- $$ - shell script process ID
- $LINENO - 변수를 사용한 줄 번호
- shift - 인수 위치를 하나씩 왼쪽으로 이동
############################### 특수 변수 ###############################
jwlish@jwlish:~/work/work_script$ vi sample1.sh
----------------------------------------------------------------------
#!/bin/sh
echo $0
echo
echo total argument is $*
echo
echo 1st argument is $1
echo 2nd argument is $2
echo Thr number of arguments is $#
shift
echo 1set argument is $1
----------------------------------------------------------------------
jwlish@jwlish:~/work/work_script$ ls -lF sample*
-rw-rw-r-- 1 jwlish jwlish 170 8월 19 17:16 sample1.sh
-rwxrwxr-x 1 jwlish jwlish 116 8월 19 17:01 sample.sh*
jwlish@jwlish:~/work/work_script$ chmod 775 sample1.sh
jwlish@jwlish:~/work/work_script$ ./sample1.sh apple banana peach
./sample1.sh # $0, shell script 이름
total argument is apple banana peach # $* 모든 인수 목록
1st argument is apple # $1 인수
2nd argument is banana # $2 인수
Thr number of arguments is 3 # $# 인수의 갯수
1set argument is banana # shift로 apple 빼고 banana가 나옴
jwlish@jwlish:~/work/work_script$
- 조건에 따른 실행
- 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가 동일하면 참
- [ str != str2 ] : str1과 str2가 동일하지 않으면 참
- 관계 연산
- -eq (같다), -ne (같지 않다), -gt (크다), -ge (크거나 같다), -lt (작다), -le (작거나 같다)
- 논리 연산
- -a (and), -o (or), ! 식 (not)
- ( 식 ) - () 안의 식의 결과를 돌려준다. 여러 식을 결합 시 사용, ' ' 로 감싸서 사용
- 파일 판단
- -f file : 파일이 존재하고 일반 파일이면 참
- -c file : 파일이 존재하고 특수 파일이면 참
- -e file : 파일이 존재하면 참
- -d file : 파일이 존재하고 디렉토리 파일이면 참
- -L file : 파일이 존재하고 심볼릭 링크 파일이면 참
- -r file : 파일이 존재하고 읽기 가능하면 참
- -w file : 파일이 존재하고 쓰기 가능하면 참
- -x file : 파일이 존재하고 실행 가능하면 참
############################### if 조건식 ###############################
jwlish@jwlish:~/work/work_script$ vi mylist.sh
----------------------------------------------------------------------
#!/bin/sh
echo "argument count - $#"
echo
if [ $# -eq 1 ] # $# = 1 일 때 명령 실행
then
ls -lF $1
else
echo "Usage : ./mylish.sh <argument>"
fi
----------------------------------------------------------------------
jwlish@jwlish:~/work/work_script$ ./mylist.sh sample.sh sample1.sh
argument count - 2 # $# = 2, else 명령 실행
Usage : ./mylish.sh <argument> # else 명령 실행
jwlish@jwlish:~/work/work_script$ ./mylist.sh sample.sh
argument count - 1 # $# = 1, if 명령 실행
-rwxrwxr-x 1 jwlish jwlish 116 8월 19 17:01 sample.sh* # ls -lF $1 명령 실행
jwlish@jwlish:~/work/work_script$
- 반복 실행
- 일정 횟수 또는 일정 조건이 만족하는 동안 원하는 동작을 반복 실행할 경우 사용
- 반복할 내용이 정해진 경우 (반복 횟수가 정해진 경우) - for
- for <변수> in <반복 대상>; do
반복 시 수행할 내용
done
- for <변수> in <반복 대상>; do
- 조건에 따라 반복을 수행하는 경우 (반복 횟수가 정해지지 않은 경우) - while
- 조건이 만족하는 동안 반복
- while문 안에서 반복 제어 변수의 내용을 변경하여 조건식의 결과가 거짓이 될 수 있도록 하지 않으면
무한 loop에 빠진다. - <반복 제어 변수 초기화>
while [ <반복 제어 변수> 이용한 조건식 ]; do
조건이 참인 동안 수행할 내용
<반복 제어 변수 내용 변경>
done
############################### for 반복문 ###############################
jwlish@jwlish:~/work/work_script$ vi mylist2.sh
----------------------------------------------------------------------
#!/bin/sh
echo "argument count - $#"
echo
for arg in $*; do
echo "argument - $arg"
done
----------------------------------------------------------------------
jwlish@jwlish:~/work/work_script$ chmod 775 mylist2.sh
jwlish@jwlish:~/work/work_script$ ./mylist2.sh apple banana mango
argument count - 3 # $# 인수의 개수, apple, banana, mango
argument - apple # $*, apple
argument - banana # $*, banana
argument - mango # $*, mango
jwlish@jwlish:~/work/work_script$
########################## for 반복문, if 조건문 ##########################
jwlish@jwlish:~/work/work_script$ vi mylist2.sh
----------------------------------------------------------------------
#!/bin/sh
echo "argument count - $#"
echo
if [ $# -ge 1 ]; then # $# >= 1 일 때 명령 실행
for arg in $*; do
echo "argument - $arg"
done
else
echo "Usage : ./mylist2.sh <argment>..."
fi
----------------------------------------------------------------------
jwlish@jwlish:~/work/work_script$ ./mylist2.sh
argument count - 0 # $# = 0, else 명령 실행
Usage : ./mylist2.sh <argment>...
jwlish@jwlish:~/work/work_script$ ./mylist2.sh apple
argument count - 1 # $# >= 1, if 조건문 출력
argument - apple # $*, apple
jwlish@jwlish:~/work/work_script$ ./mylist2.sh apple banana mango
argument count - 3 # $# >= 1, if 조건문 출력
argument - apple # $*, apple
argument - banana # $*, banana
argument - mango # $*, mango
jwlish@jwlish:~/work/work_script$
############################### while 반복문 ###############################
jwlish@jwlish:~/work/work_script$ vi while.sh
----------------------------------------------------------------------
#!/bin/sh
num=1
while [ $num -le 3 ]; do # $num <= 3 일 때까지 반복
echo "num is $num"
num=`expr $num + 1` # expr 연산식
done
----------------------------------------------------------------------
jwlish@jwlish:~/work/work_script$ chmod 775 while.sh
jwlish@jwlish:~/work/work_script$ ./while.sh
num is 1 # 1 <= 3, while 반복문 실행
num is 2 # 2 <= 3
num is 3 # 3 <= 3, while 반복문 종료
jwlish@jwlish:~/work/work_script$
########################## while 반복문, if 조건문 ##########################
jwlish@jwlish:~/work/work_script$ vi while.sh
----------------------------------------------------------------------
#!/bin/sh
if [ $# -eq 1 ]; then # $# 인수의 개수가 1개일 때 명령 실행
num=1
while [ $num -le $1 ]; do # $1 인수보다 작거나 같으면 반복문 실행
echo "num is $num"
num=`expr $num + 1` # counting
done
else
echo "Usage : ./while.sh <loop count>"
fi
----------------------------------------------------------------------
jwlish@jwlish:~/work/work_script$ ./while.sh # $# = 0
Usage : ./while.sh <loop count> # else 실행
jwlish@jwlish:~/work/work_script$ ./while.sh 5 # $# = 1, $1 = 5
num is 1 # 1 <= 5, if, while 실행
num is 2 # 2 <= 5
num is 3 # 3 <= 5
num is 4 # 4 <= 5
num is 5 # 5 <= 5, 반복문 종료
jwlish@jwlish:~/work/work_script$
ETC
- expr - 연산식을 표현할 때 사용
- `expr 연산식`
- ex) `expr 1 + 2`
- `expr 연산식`
실습 예제
1. /zip1 디렉토리 생성 후 이동
jwlish@jwlish:~$ mkdir zip1
jwlish@jwlish:~$ cd zip1
jwlish@jwlish:~/zip1$
2. etc/skel, etc/fstab을 복사하여 가지고 온다.
jwlish@jwlish:~/zip1$ cp -r /etc/skel skel # 하위 디렉토리가 있어서 -r 없으면 error 발생
jwlish@jwlish:~/zip1$ cp /etc/fstab fstab
jwlish@jwlish:~/zip1$ ls
fstab skel
jwlish@jwlish:~/zip1$
3. skel 디렉토리를 skel2라는 이름으로 이름 변경 복사하여라.
jwlish@jwlish:~/zip1$ cp -r skel skel2
jwlish@jwlish:~/zip1$ ls -liF
total 12
6294221 -rw-rw-r-- 1 jwlish jwlish 786 8월 19 20:10 fstab
6295234 drwxr-xr-x 3 jwlish jwlish 4096 8월 19 20:10 skel/
6295242 drwxr-xr-x 3 jwlish jwlish 4096 8월 19 20:12 skel2/
4. skel의 용량을 압축하여라.
jwlish@jwlish:~/zip1$ zip skel skel # gzip, bzip2는 디렉토리 압축이 안됨, zip으로 압축
adding: skel/ (stored 0%)
jwlish@jwlish:~/zip1$ ls
fstab skel skel2 skel.zip
jwlish@jwlish:~/zip1$ ls -liF
total 16
6294221 -rw-rw-r-- 1 jwlish jwlish 786 8월 19 20:10 fstab
6295234 drwxr-xr-x 3 jwlish jwlish 4096 8월 19 20:13 skel/
6295242 drwxr-xr-x 3 jwlish jwlish 4096 8월 19 20:12 skel2/
6295236 -rw-rw-r-- 1 jwlish jwlish 160 8월 19 20:20 skel.zip
jwlish@jwlish:~/zip1$
5. skel2의 이름을 finalskel로 이름을 변경하며 용량도 압축되게끔 하라.
jwlish@jwlish:~/zip1$ zip finalskel skel2
adding: skel2/ (stored 0%)
jwlish@jwlish:~/zip1$ ls -liF
total 20
6295251 -rw-rw-r-- 1 jwlish jwlish 162 8월 19 20:21 finalskel.zip
6294221 -rw-rw-r-- 1 jwlish jwlish 786 8월 19 20:10 fstab
6295234 drwxr-xr-x 3 jwlish jwlish 4096 8월 19 20:13 skel/
6295242 drwxr-xr-x 3 jwlish jwlish 4096 8월 19 20:12 skel2/
6295236 -rw-rw-r-- 1 jwlish jwlish 160 8월 19 20:20 skel.zip
jwlish@jwlish:~/zip1$
6. fstab 파일을 fstab.bz2.gz.bz2가 나오도록 만들어라.
jwlish@jwlish:~/zip1$ bzip2 -v fstab
fstab: 1.560:1, 5.130 bits/byte, 35.88% saved, 786 in, 504 out.
jwlish@jwlish:~/zip1$ gzip -v fstab.bz2
fstab.bz2: -1.0% -- replaced with fstab.bz2.gz
jwlish@jwlish:~/zip1$ bzip2 -v fstab.bz2.gz
fstab.bz2.gz: 0.734:1, 10.905 bits/byte, -36.31% saved, 537 in, 732 out.
jwlish@jwlish:~/zip1$ ls
finalskel.zip fstab.bz2.gz.bz2 skel skel2 skel.zip
7. 6번에 압축된 파일을 원본으로 만들어라.
jwlish@jwlish:~/zip1$ bunzip2 fstab.bz2.gz.bz2
jwlish@jwlish:~/zip1$ gunzip fstab.bz2.gz
jwlish@jwlish:~/zip1$ bunzip2 fstab.bz2
jwlish@jwlish:~/zip1$ ls
finalskel.zip fstab skel skel2 skel.zip
jwlish@jwlish:~/zip1$
8. 안에 있는 파일을 zip2로 전부 압축하여라.
jwlish@jwlish:~/zip1$ zip zip2.zip -r ./* # ./* 현재 폴더 의미
adding: finalskel.zip (stored 0%)
adding: fstab (deflated 46%)
adding: skel/ (stored 0%)
adding: skel/.bashrc.gz (stored 0%)
adding: skel/.profile.gz (stored 0%)
adding: skel/skel/ (stored 0%)
adding: skel/skel/.bashrc.gz (stored 0%)
adding: skel/skel/.profile.gz (stored 0%)
adding: skel/skel/.bash_logout.gz (stored 0%)
adding: skel/.bash_logout.gz (stored 0%)
adding: skel2/ (stored 0%)
adding: skel2/.profile (deflated 51%)
adding: skel2/.bash_logout (deflated 28%)
adding: skel2/skel/ (stored 0%)
adding: skel2/skel/.profile (deflated 51%)
adding: skel2/skel/.bash_logout (deflated 28%)
adding: skel2/skel/.bashrc (deflated 54%)
adding: skel2/.bashrc (deflated 54%)
adding: skel.zip (stored 0%)
jwlish@jwlish:~/zip1$ ls
finalskel.zip fstab skel skel2 skel.zip zip2.zip
jwlish@jwlish:~/zip1$
TIF
3주차 마무리가 되었다.
오늘 수업은 프로그래밍 기본 문법을 아예 몰랐다면... 아마도 탈주하지 않았을까... 싶은 하루였다.
Linux를 4일차부터 시작해서 오늘 14일차, 약 10일 동안 리눅스의 전반적인 내용을 다루었다.
수업 교재로 왔던 거의 500페이지 분량의 책을 거의 다했다고 한다.
나 대학 때 이 정도면... 1년 정도 했던 것 같은데...? 가물가물하다.
다음 주부터 리눅스 서버 구축 관련 실습이 주가 되기 때문에 주말 동안 리눅스 복습을 좀 해두어야 할 것 같다.
수업이 이 정도 진행되고 구글 스터디잼 실습했던 내용을 보니 배웠던 내용들이 보인다.
변수라던지, 심볼릭 링크라던지, 쉘 관련된 것들이라던지...
뭐 하나 아는 게 없어서 그냥 진행만 했던 2주 전과는 다른 느낌이다.
다시 실습을 못해보는 게 아쉽지만 9/19 시작 예정인 심화반 때 제대로 해볼 수 있을 것 같다.
2022. 08. 19 에 작성된 글입니다.
'구름 쿠버네티스' 카테고리의 다른 글
구름 쿠버네티스 전문가 과정 6기 - 16일차 (0) | 2023.07.24 |
---|---|
구름 쿠버네티스 전문가 과정 6기 - 15일차 (0) | 2023.07.21 |
구름 쿠버네티스 전문가 과정 6기 - 13일차 (0) | 2023.07.18 |
구름 쿠버네티스 전문가 과정 6기 - 12일차 (0) | 2023.07.17 |
구름 쿠버네티스 전문가 과정 6기 - 11일차 (0) | 2023.07.14 |