섹션 2. 쉘 기초 명령어

 

리눅스 서버를 자동화하여 관리하기 위한 쉘 스크립트(Shell Script) 심화 강좌를 정리합니다.
출처 : inflearn

1. echo의 사용법

  • echo 는 화면 출력시 사용
  • echo * 파일 출력시에도 사용
linux:/home/shkim$ echo hello world
hello world

linux:/home/shkim$ echo hello       world
hello world

linux:/home/shkim$ echo "hello       world" #공백을 주려면 "" 또는 '' 를 사용해야한다.
hello       world

linux:/home/shkim$ echo 'hello       world'
hello       world

linux:/home/shkim$ echo -e 'hello     world\n\n\n' # -e 옵션을 통 이스케이프 할 수 있음
hello     world



linux:/home/shkim$

linux:/home/shkim$ echo 'hello     world\n\n\n'
hello     world\n\n\n

linux:/home/shkim$ echo -e 'hello     world\a' # alert 비프음 발생
hello     world

linux:/home/shkim$ echo -n 'hello world' # 줄바꿈 없이 출력
hello worldlinux:/home/shkim$

linux:/home/shkim$ echo $'\a' # 비프음 발생

linux:/home/shkim$ echo * # ls 명령과 동일하게 사용가능, substring 할때 많이 사영
dir1 dir2 dir3

linux:/home/shkim$ ls
dir1  dir2  dir3

linux:/etc$ pwd
/etc
linux:/etc$ echo *
acpi adjtime aliases aliases.db alternatives amazon anacrontab at.deny audisp audit bash_completion.d bashrc binfmt.d chkconfig.d chrony.conf chrony.keys cifs-utils cloud cron.d cron.daily cron.deny cron.hourly cron.monthly crontab cron.weekly csh.cshrc csh.login dbus-1 default depmod.d dhcp DIR_COLORS DIR_COLORS.256color DIR_COLORS.lightbgcolor dracut.conf dracut.conf.d e2fsck.conf environment ethertypes exports exports.d filesystems fstab gcrypt GeoIP.conf GeoIP.conf.default gnupg GREP_COLORS groff group group- grub2.cfg grub.d gshadow gshadow- gss gssproxy hibagent-config.cfg hibinit-config.cfg host.conf hostname hosts hosts.allow hosts.deny idmapd.conf image-id init.d inittab inputrc iproute2 issue issue.net krb5.conf krb5.conf.d ld.so.cache ld.so.conf ld.so.conf.d libaudit.conf libnl libuser.conf locale.conf localtime login.defs logrotate.conf logrotate.d lsm lvm machine-id magic man_db.conf mke2fs.conf modprobe.d modules-load.d motd mtab my.cnf my.cnf.d nanorc netconfig NetworkManager networks nfs.conf nfsmount.conf nsswitch.conf nsswitch.conf.bak openldap opt os-release pam.d passwd passwd- pkcs11 pki plymouth pm popt.d postfix ppp prelink.conf.d printcap profile profile.d protocols python rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.d rc.local request-key.conf request-key.d resolv.conf rpc rpm rsyncd.conf rsyslog.conf rsyslog.d rwtab rwtab.d sasl2 scl screenrc securetty security selinux services sestatus.conf setuptool.d shadow shadow- shells skel ssh ssl statetab statetab.d subgid subuid sudo.conf sudoers sudoers.d sudo-ldap.conf sysconfig sysctl.conf sysctl.d systemd system-release system-release-cpe terminfo tmpfiles.d trusted-key.key udev updatedb.conf update-motd.d vimrc virc wgetrc X11 xdg xinetd.d yum yum.conf yum.repos.d

2. 명령의 구조

  • 명령어 옵션 전달인자
    ㄴ (ls) (-al) (/var/log)
linux:/home/shkim$ ls
dir1  dir2  dir3

linux:/home/shkim$ ls -al /var/log
total 1312
drwxr-xr-x   7 root   root              4096 Feb 21 18:33 .
drwxr-xr-x  19 root   root               269 Feb 11 23:20 ..
drwxr-xr-x   3 root   root                17 Feb 11 23:20 amazon
drwx------   2 root   root                23 Feb 11 23:20 audit
-rw-------   1 root   root             50253 Feb 21 18:33 boot.log
-rw-------   1 root   utmp              4224 Feb 12 00:18 btmp
drwxr-xr-x   2 chrony chrony               6 Dec 16 06:48 chrony
-rw-r--r--   1 root   root            547897 Feb 21 18:33 cloud-init.log
-rw-r--r--   1 root   root             22356 Feb 21 18:33 cloud-init-output.log
-rw-------   1 root   root              8582 Feb 21 18:50 cron
-rw-r--r--   1 root   root             26679 Feb 21 18:33 dmesg
-rw-r--r--   1 root   root             26651 Feb 20 22:24 dmesg.old
-rw-r--r--   1 root   root               193 Jan 26 13:14 grubby_prune_debug
drwxr-sr-x+  3 root   systemd-journal     46 Feb 11 23:20 journal
-rw-r--r--   1 root   root            293168 Feb 21 18:41 lastlog
-rw-------   1 root   root              4769 Feb 21 18:33 maillog
-rw-------   1 root   root            531953 Feb 21 18:58 messages
drwxr-xr-x   2 root   root                91 Feb 21 00:00 sa
-rw-------   1 root   root             29821 Feb 21 18:41 secure
-rw-------   1 root   root                 0 Jan 26 13:15 spooler
-rw-------   1 root   root                 0 Jan 26 13:14 tallylog
-rw-rw-r--   1 root   utmp             37632 Feb 21 18:41 wtmp
-rw-------   1 root   root                 0 Jan 26 13:15 yum.log

3. glob와 공백

  • glob(*) : 와일드카드 문자, asterisk # 라틴어로 별을 뜻한다. 리눅스에서는 모든 의 의미가 있다.
linux:/home/shkim$ mkdir mydir
linux:/home/shkim$ cd mydir/
linux:/home/shkim/mydir$ ls
linux:/home/shkim/mydir$ touch orange apple banana
linux:/home/shkim/mydir$ ll
total 0
-rw-rw-r-- 1 shkim shkim 0 Feb 21 19:31 apple
-rw-rw-r-- 1 shkim shkim 0 Feb 21 19:31 banana
-rw-rw-r-- 1 shkim shkim 0 Feb 21 19:31 orange

linux:/home/shkim/mydir$ rm apple
linux:/home/shkim/mydir$ rm *
linux:/home/shkim/mydir$ ll
total 0

4. 인용문

  • ” “, ‘ ‘
linux:/home/shkim/mydir$ rm 'Gone With the Wind.mp3'
rm: cannot remove ‘Gone With the Wind.mp3’: No such file or directory
linux:/home/shkim/mydir$ ls

linux:/home/shkim/mydir$ touch 'Gone With the Wind.mp3' # "" 도 가능하다.
linux:/home/shkim/mydir$ ls
Gone With the Wind.mp3

linux:/home/shkim/mydir$ touch Gone With the Wind.mp3 # 인용부호가 없을시 각각 파일이 생성됨
linux:/home/shkim/mydir$ ls
Gone  Gone With the Wind.mp3  the  Wind.mp3  With

5. [..]와 테스트

  • [] : test 명령어, if else 조건문에서 많이 사용됨. 아래와 같이 -f 사이에 반드시 공백이 있어야 에러가 나지 않음.
# mydir로 이동하라, [] :test 명령어(판별의 목적이 있음), -f : 파일이 존재하는 지  

linux:/home/shkim$ cd mydir; [ -f 'Gone With the Wind.mp3' ]

6. 명령어(wc)

  • wc : 사용자가 지정한 파일의 행, 단어, 문자 수를 세는 명령어
linux:/home/shkim/shell_cmd$ cat fruits.txt
grapes
orange
tomato
strawberry
apple

linux:/home/shkim/shell_cmd$ wc -w fruits.txt # w: 파일 안에 단어(word)의 갯수
5 fruits.txt

linux:/home/shkim/shell_cmd$ wc -l fruits.txt # l: line 수
6 fruits.txt

linux:/home/shkim/shell_cmd$ wc -L fruits.txt # L: 해당파일의 가장 긴 단어의 글자 수
10 fruits.txt

linux:/home/shkim/shell_cmd$ wc -c fruits.txt # c: 파일의 byte
39 fruits.txt

7. 명령어(tail)

  • seq : 숫자를 만들어내는 명령어
linux:/home/shkim/mydir$ seq 1 200 > num200
linux:/home/shkim/mydir$ cat num200
1
2
3
4
5
.
.
.
200

linux:/home/shkim/mydir$ tail -n 10 num200 # 마지막에서 10번째 라인 출력
191
192
193
194
195
196
197
198
199
200

linux:/home/shkim/mydir$ tail -n +10 num200 # 10번째 line 부터 출력
10
11
12
13
14
15
.
.
.
200

linux:/home/shkim/mydir$ tail -n +101 num200 | head -n 10 # 파이프를 이용하여 원하는 라인 출력 가능
101
102
103
104
105
106
107
108
109
110

linux:/home/shkim/mydir$ tail -f /var/log/syslog # 실시간 로그 볼 때 사용, 시스템 관리자가 가장 많이 사용하는 명령어임.

8. 별칭(alias)

  • alias 사용법 : alias 명령어=’명령어 + 옵션’
linux:/home/shkim$ alias mkdir='mkdir -p'
linux:/home/shkim$ mkdir dir123/dir1/dir2/dir3
linux:/home/shkim$ tree dir123/
dir123/
└── dir1
    └── dir2
        └── dir3

3 directories, 0 files


# minicom 은 unix와 유사한 운영체제를 위한 텍스트 기반 모뎀제어 및 터미널 에뮬레이션 프로그램.
linux:/home/shkim$ alias m='minicom -w -D/dev/ttyS0'
linux:/home/shkim$ alias m1='minicom -w -D/dev/ttyS1'
linux:/home/shkim$ alias m2='minicom -w -D/dev/ttyS2'

# 위와 같은 방법으로 alias 를 쓰는것 보다 m 1, m 2 으로 쓰는게 더 효율적임
# 전달인자를 넘겨주기 위해서 function 을 사용하면 됨.

linux:/home/shkim$ function m() { minicom -w -D/dev/ttyS${1}; }

9. 명령어(pushd/popd)

  • pushd / popd 는 지정한 경로를 스택에 저장하는 명령어
  • 직전 경로로 이동하는 방법(cd - 와 동일한 기능)
linux:/home/shkim$ pushd .
~ ~
linux:/home/shkim$ cd /etc/pam.d/
linux:/etc/pam.d$ popd
~
linux:/home/shkim$

10. 명령어(print)

  • printf 는 echo 명령어와 함께 리눅스에서 즐겨 사용하는 명령어
  • print -v legend : 변수 legend (출력결과가 변수에 저장됨)
linux:/home/shkim$ printf "%02d\n" 1
01

linux:/home/shkim$ printf "%05d\n" 1
00001

linux:/home/shkim$ name=michael; printf -v legend "%s jackson" $name; echo $legend
michael jackson

11. 명령어(read)

  • read 는 사용자로 부터 입력을 받는다.
linux:/home/shkim$ read num
1234
linux:/home/shkim$ echo $num
1234

linux:/home/shkim$ read -p "what is your phone number" v # -p ""안에 문장을 보여줌. 입력한 정보가 변수 v에 저장된다.
what is your phone number010-1234-1234

linux:/home/shkim$ echo $v
010-1234-1234

linux:/home/shkim$ read -n 1 -p "Are you over 16?" v # -n 1 은 한문자만 입력 받는다는 뜻.
Are you over 16?ylinux:/home/shkim$

linux:/home/shkim$ read -s -n 1 -p "Are you over 16?" v # s -> silent 입력값을 화면에 보이지 않게 함.
Are you over 16?linux:/home/shkim$

linux:/home/shkim$ read -s -n 1 -t 3 -p "Are you over 16?" v # 3초 후에 자동종료.
Are you over 16?linux:/home/shkim$

12. while..do..done

  • loop 문 : while, do 사이에 판단(test)식이 와야한다. 참일 경우 do, done 사이에 명령이 실행된다.
linux:/home/shkim$ no=1; while ((no < 10));do printf "%02d\n" $no; ((no++)); done
01
02
03
04
05
06
07
08
09
linux:/home/shkim$

13. 실행파일을 사용하는 방법 4가지

  1. 환경설정에서 잡힌 경로에 복사하여 이름만으로 실행.
  2. 실행파일이 존재하는 곳에 절대경로를 입력하여 실행.
  3. $PATH 환경변수에 경로를 추가하여 실행 가능.
  4. ./helloworld.sh 상대경로로 찾아가서 실행.
linux:/home/shkim$ echo 'echo hello world' > helloworld.sh
linux:/home/shkim$ chmod +x helloworld.sh
linux:/home/shkim$ ./helloworld.sh
hello world

linux:/home/shkim$ sudo cp helloworld.sh /usr/bin/

linux:/home/shkim$ helloworld.sh #/usr/bin 은 공개적으로 경로가 잡혀있어서 파일명만 적어도 실행 가능
hello world

linux:/home/shkim$ /usr/bin/helloworld.sh #절대 경로 입력해서 실행
hello world
linux:/home/shkim$ /home/shkim/helloworld.sh
hello world

linux:/home/shkim$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shkim/.local/bin:/home/shkim/bin
linux:/home/shkim$ PATH=$PATH:~/shell_cmd/ # 원하는 경로를 추가
linux:/home/shkim$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shkim/.local/bin:/home/shkim/bin:/home/shkim/shell_cmd/

linux:/home/shkim$ sudo rm /usr/bin/helloworld.sh
linux:/home/shkim$ helloworld
-bash: helloworld: command not found
linux:/home/shkim$ PATH=$PATH:/home/shkim
linux:/home/shkim$ helloworld.sh
hello world
linux:/home/shkim$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shkim/.local/bin:/home/shkim/bin:/home/shkim/shell_cmd/:/home/shkim