배운것/LINUX

리눅스 쉘 마스터 - 쉘 스크립트

SangPedia 2022. 1. 14. 11:28

1. 쉘 스크립트 무엇입니까?

쉘(shell)은 명령 인터프리터(Command interpreter) 입니다.
사용자가 운영체제에 대화식(interactively)으로 명령을 내리거나, 명령을 일괄(Batc)적으로 실행할 수 있는 기능을 제공하는 응용 프로그램입니다.
쉘은 사용자가 시스템과 대화 할 수 있는 방법이라고 생각합니다.

  • kernel
  • Core of the OS
  • Allcates time and menory to programs
  • shell
  • Outer layer of OS
  • Interacts with user
  • Sends requests to kernel
  • 인기 있는 쉘의 종류
  • sh : Thompson Shell (1971)
  • sh : Bourne Shell (1977)
  • csh: c shell (1979)
  • tcsh : tabbed C shell (1979)
  • ksh : Korn Shell (1982)
  • bash : Bourne-Again (1987)
  • zsh : Z Sehll (1990)
  • dash : Dash Shell (2002)

2. 스크립트 작성방법

  • #!/bin/bash 쉬뱅(해쉬뱅)이라고 부르며 번역기로서의 역할을 합니다.
  • #!/usr/bin/env bash : 다른 방법으로 사용할 수 있습니다.
  • ps 터미널에 입력 하면 bash가 기본적으로 백그라운드에 실행되어 있어 터미널에서 입력하는 모든 명령은 bash라는 프로그램이 받아들여서 실행되도록 합니다.
vim helloworld.sh

#!/bin/bash
echo hello world

3. DOS 스타일의 줄끝

  • /n : 제어문자로서 줄바꿈을 해줍니다.
  • 라인피드(LF), 아스키 코드 0x0A ⇒ LF Line Feed
  • 아스키 코드 0x0D ⇒ CR Carriage Return
  • 리눅스에서 생성한 text 에서는 줄바꿈이 0a / 원도우에서 생성한 text에서는 0d 가 추가
echo -e 'hello\\n\\n\\n'
hello\\n\\n\\n

#16진수 값으로 출
hexdump -C hello.txt
00000000  68 65 6c 6c 6f **0a**                                 |hello.|
00000006

hexdump -C hello_ms.txt
00000000  68 65 6c 6c 6f **0a 0d**
	|hello..|
00000007

강의자료 리눅스에 압축풀기

tar 자료는 리눅스 내에서 압축을 풀 수 있는데요.
하기 명령어로 맨뒤는 자기 경로를 지정하여 파일 경로에서 압축을 풀어주면 됩니다.
tar -zxvf shell_cmd-master.tar.gz -C /home/testworks

 ➤ tar -zxvf shell_cmd-master.zip /home/testworks/
tar: invalid magic
tar: short read
tar: /home/testworks: not found in archive
                                                                                                                                ✘
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ pwd
/home/testworks
                                                                                                                                ✔
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────                                                                             
➤ tar -zxvf shell_cmd-1.01.tar.gz -C /home/testworks/
shell_cmd-1.01/
shell_cmd-1.01/.gitignore
shell_cmd-1.01/Anaconda2-2.4.1-MacOSX-x86_64.sh
shell_cmd-1.01/IoT.md
shell_cmd-1.01/ai.md
shell_cmd-1.01/alphago.md
shell_cmd-1.01/arduino.md
shell_cmd-1.01/case.sh
shell_cmd-1.01/csv/
shell_cmd-1.01/csv/addresses.csv
shell_cmd-1.01/csv/crash_catalonia.csv
shell_cmd-1.01/csv/deniro.csv
shell_cmd-1.01/csv/email.csv
shell_cmd-1.01/csv/mlb_players.csv
shell_cmd-1.01/csv/mlb_teams_2012.csv
shell_cmd-1.01/csv/oscar_age_female.csv
shell_cmd-1.01/csv/oscar_age_male.csv
shell_cmd-1.01/csv/unique-passenger-counts-over-100-by-NZ-port-and-citizenship-year-ended-june-2019.csv
shell_cmd-1.01/debug.sh
shell_cmd-1.01/err.log
shell_cmd-1.01/euid.sh
shell_cmd-1.01/file
shell_cmd-1.01/file1
shell_cmd-1.01/file2
shell_cmd-1.01/fnum.sh
shell_cmd-1.01/fruits.txt
shell_cmd-1.01/fruits_comma_separated.txt
shell_cmd-1.01/fruits_multi.txt
shell_cmd-1.01/fruits_onebyone.txt
shell_cmd-1.01/fruits_onebyone_with_linenum.txt
shell_cmd-1.01/george.txt
shell_cmd-1.01/goodday.sh
shell_cmd-1.01/hello.txt
shell_cmd-1.01/hello_ms.txt
shell_cmd-1.01/helloworld.sh
shell_cmd-1.01/image4/
shell_cmd-1.01/image4/01a.png
shell_cmd-1.01/image4/IMG_2135.jpg
shell_cmd-1.01/image4/IMG_2137.jpg
shell_cmd-1.01/image4/IMG_2138.jpg
shell_cmd-1.01/image4/IMG_2139.jpg
shell_cmd-1.01/image4/IMG_2140.jpg
shell_cmd-1.01/image4/IMG_2141.jpg
shell_cmd-1.01/image4/IMG_2142.jpg
shell_cmd-1.01/image4/IMG_2143.jpg
shell_cmd-1.01/image4/IMG_2146.jpg
shell_cmd-1.01/image4/IMG_2147.jpg
shell_cmd-1.01/image4/IMG_2148.jpg
shell_cmd-1.01/image4/IMG_2153.jpg
shell_cmd-1.01/image4/IMG_2154.jpg
shell_cmd-1.01/image4/IMG_2155.jpg
shell_cmd-1.01/image4/IMG_2156.jpg
shell_cmd-1.01/image4/IMG_2373.m4v
shell_cmd-1.01/image4/IMG_2460.m4v
shell_cmd-1.01/image4/IMG_2471.m4v
shell_cmd-1.01/image4/IMG_2486.m4v
shell_cmd-1.01/image4/IMG_2507.m4v
shell_cmd-1.01/image4/IMG_2524.m4v
shell_cmd-1.01/image4/IMG_2630.m4v
shell_cmd-1.01/image4/IMG_2632.m4v
shell_cmd-1.01/image4/IMG_2673.m4v
shell_cmd-1.01/image4/IMG_2674.m4v
shell_cmd-1.01/image4/IMG_2675.m4v
shell_cmd-1.01/image4/IMG_2676.m4v
shell_cmd-1.01/image4/IMG_2677.m4v
shell_cmd-1.01/image4/IMG_2704.m4v
shell_cmd-1.01/image4/IMG_2712.m4v
shell_cmd-1.01/image4/IMG_2722.m4v
shell_cmd-1.01/image4/IMG_2723.m4v
shell_cmd-1.01/image4/IMG_2757.m4v
shell_cmd-1.01/image4/IMG_7362.png
shell_cmd-1.01/image4/IMG_7363.png
shell_cmd-1.01/image4/IMG_7364.png
shell_cmd-1.01/image4/IMG_7365.png
shell_cmd-1.01/image4/IMG_7366.png
shell_cmd-1.01/image4/IMG_7367.png
shell_cmd-1.01/image4/IMG_7368.png
shell_cmd-1.01/image4/IMG_7369.png
shell_cmd-1.01/image4/IMG_7370.png
shell_cmd-1.01/image4/IMG_7371.png
shell_cmd-1.01/image4/IMG_7372.png
shell_cmd-1.01/image4/IMG_7373.png
shell_cmd-1.01/image4/IMG_7374.png
shell_cmd-1.01/image4/IMG_7375.png
shell_cmd-1.01/image4/IMG_7376.png
shell_cmd-1.01/image4/IMG_7377.png
shell_cmd-1.01/image4/IMG_7379.png
shell_cmd-1.01/image4/IMG_7382.png
shell_cmd-1.01/image4/IMG_7383.png
shell_cmd-1.01/image4/IMG_7384.png
shell_cmd-1.01/image4/XCWS2933.JPG
shell_cmd-1.01/image4/bitcoin-2947949_1920.jpg
shell_cmd-1.01/image4/hacking-2903156_1920.jpg
shell_cmd-1.01/image4/notebook-1207543_1920.jpg
shell_cmd-1.01/image4/office-2761159_1920.png
shell_cmd-1.01/image4/stickies-3127287_1920.jpg
shell_cmd-1.01/image4/traffic-sign-209194_1920.jpg
shell_cmd-1.01/image4/xxx_2015.png
shell_cmd-1.01/imagemagick/
shell_cmd-1.01/imagemagick/bell.png
shell_cmd-1.01/imagemagick/bell_#7E01FD.png
shell_cmd-1.01/imagemagick/bell_#8104FE.png
shell_cmd-1.01/imagemagick/bell_#8F2DF5.png
shell_cmd-1.01/imagemagick/bell_#CA61D7.png
shell_cmd-1.01/imagemagick/bell_#E6A0CD.png
shell_cmd-1.01/imagemagick/bell_#F0CFEA.png
shell_cmd-1.01/imagemagick/bell_#FF2F92.png
shell_cmd-1.01/imagemagick/bell_#FF7E79.png
shell_cmd-1.01/imagemagick/bell_#FF817D.png
shell_cmd-1.01/imagemagick/bell_#FFFFFF.png
shell_cmd-1.01/imagemagick/colors
shell_cmd-1.01/images/
shell_cmd-1.01/images/Balloon.jpg
shell_cmd-1.01/images/Candy.jpg
shell_cmd-1.01/images/glob.gif
shell_cmd-1.01/images/settings_down.png
shell_cmd-1.01/images/settings_up.png
shell_cmd-1.01/images/shadingimage.tiff
shell_cmd-1.01/images/smaller.tiff
shell_cmd-1.01/images_mirror/
shell_cmd-1.01/images_mirror/Balloon.jpg
shell_cmd-1.01/images_mirror/glob.gif
shell_cmd-1.01/images_mirror/settings_down.png
shell_cmd-1.01/images_mirror/settings_up.png
shell_cmd-1.01/images_mirror/shadingimage.tiff
shell_cmd-1.01/images_mirror/smaller.tiff
shell_cmd-1.01/locale.sh
shell_cmd-1.01/log
shell_cmd-1.01/makeTagDirectory.sh
shell_cmd-1.01/md5sum/
shell_cmd-1.01/md5sum/helloworld
shell_cmd-1.01/md5sum/helloworld.c
shell_cmd-1.01/md5sum/helloworld.sh
shell_cmd-1.01/md5sum/helloworld.tar
shell_cmd-1.01/md5sum/helloworld_md5sum.sh
shell_cmd-1.01/msdos.txt
shell_cmd-1.01/msdos_modified.txt
shell_cmd-1.01/mydaemon.log
shell_cmd-1.01/mydaemon.sh
shell_cmd-1.01/mydate.sh
shell_cmd-1.01/mydir2/
shell_cmd-1.01/mydir2/For Whom the Bell Tolls.mp3
shell_cmd-1.01/mydir2/Gone With the Wind.mp3
shell_cmd-1.01/mydir2/old man and
the sea.mp3
shell_cmd-1.01/myscript
shell_cmd-1.01/myscript.sh
shell_cmd-1.01/mysleep.sh
shell_cmd-1.01/num100
shell_cmd-1.01/num200
shell_cmd-1.01/nums
shell_cmd-1.01/olympic.txt
shell_cmd-1.01/president.txt
shell_cmd-1.01/quiz/
shell_cmd-1.01/quiz/IoT.md
shell_cmd-1.01/quiz/ai.md
shell_cmd-1.01/quiz/alphago.md
shell_cmd-1.01/quiz/arduino.md
shell_cmd-1.01/quiz/youtube.md
shell_cmd-1.01/rename.sh
shell_cmd-1.01/seagull.txt
shell_cmd-1.01/sleep.sh
shell_cmd-1.01/steven.txt
shell_cmd-1.01/tech.txt
shell_cmd-1.01/watch.sh
shell_cmd-1.01/whereis.sh
shell_cmd-1.01/whois.sh
shell_cmd-1.01/youtube.md
                                                                                                                                ✔
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ ls
Desktop                dir1                   dir3                   ppt.pdf
LauncherFolder         dir123                 minicom.log            shell_cmd-1.01
MyDocuments            dir2                   mydir                  shell_cmd-1.01.tar.gz
                                                                                                                                ✔
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ cd shell_cmd-1.01
                                                                                                                                ✔
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ ls
Anaconda2-2.4.1-MacOSX-x86_64.sh  george.txt                        myscript
IoT.md                            goodday.sh                        myscript.sh
ai.md                             hello.txt                         mysleep.sh
alphago.md                        hello_ms.txt                      num100
arduino.md                        helloworld.sh                     num200
case.sh                           image4                            nums
csv                               imagemagick                       olympic.txt
debug.sh                          images                            president.txt
err.log                           images_mirror                     quiz
euid.sh                           locale.sh                         rename.sh
file                              log                               seagull.txt
file1                             makeTagDirectory.sh               sleep.sh
file2                             md5sum                            steven.txt
fnum.sh                           msdos.txt                         tech.txt
fruits.txt                        msdos_modified.txt                watch.sh
fruits_comma_separated.txt        mydaemon.log                      whereis.sh
fruits_multi.txt                  mydaemon.sh                       whois.sh
fruits_onebyone.txt               mydate.sh                         youtube.md
fruits_onebyone_with_linenum.txt  mydir2

4. 스크립트의 실행방법 4가지

 /home/testworks/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ ./helloworld.sh
hello world
 /home/testworks/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ bash helloworld.sh
hello world
 /home/testworks/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ source helloworld.sh
hello world
                                                                                                                    
[2021-09-16 16:11.50]  /home/testworks/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ . helloworld.sh
hello world

5. 특수문자 종류 미리보기

  • 탭(Tab), 줄 바꿈(newline), 세로 탭, 양식공급(form feed), 캐리지 리턴(Carriage Return) 또는 공백(White Space) 입니다.
  • 공백 : 단어의 시작과 끝을 결정, 첫번째 단어는 명령 이름, 추가되는 단어는 인수 입니다.
  • 확장(Expansion) : 다양한 유형의 확장( Expansion )을 도입합니다.
    • parameter expansion(파라미터 확장) : $var or ${var}
    • command substitution(명령 대체) : $(command)
    • arithmetic expansion(산술확장) : $((expression))
  • 큰따옴표(Double Quotes) : 그 안의 택스트가 여러 단어나 인수로 분리되지 않도록 보호합니다.\(백 슬래시), $(달러), `(백틱)를 제외한 대부분의 다른 특수 문자의 의미는 억제됩니다.(즉, 일반문자로 해석됩니다.)
  • ‘#’ 문자의 도입은 그 행의 끝까지 모두 주석 처리됩니다.
  • 코멘토는 설명의 주석이며 쉘에 의해 처리되지 않습니다.
  • 테스트(test)
    • 조건부 표현식이 “TRUE” 인지 “FALSE” 인지를 결정하기 위한 조건식의 평가
    • 테스트 BASH에서 여러 조건을 평가하는데 사용됩니다.
    • [[ ]]
  • 부정하다 (NEGATE)
    • 테스트나 종료 상태를 무효화하거나 되돌리기 위해 사용됩니다.
    • ! Grep mister file; exit $?
  • 방향재지정 (REDIRECTION)
    • 명령의 출력 또는 입력을 재 지정합니다.
    • Rm dir1 2>/dev/null #에러 메세지는 무시
  • 파이프(PIPE)
    • 초기 명령의 출력 2차 명령의 입력으로 재지정 합니다.
    • 이것은 명령을 하나로 묶는 방법입니다.
    • Echo “hello World” | grep -o World
    • Ehco “60+1” | bc
  • 명령 분리자 (COMMMAND SEPARATOR)
    • 같은 줄에 있는 여러 명령을 구분하는데 사용 됩니다.
    • While read num ; do sum=$ (($sum + $sum)) done < numbers.txt:echo $sum;
    • ;
  • 인라인 그룹 (INLINE GROUP)
    • 중괄호 안에 명령은 마치 하나의 명령처럼 취급됩니다.
    • Bash 구문이 하나의 명령만을 필요로 하고, 함수의 사용은 피하고 싶을 때, 이것을 사용하는 것이 편리 합니다.
    • { local v1; v1 = 123:}
    • {}
  • 서브 셸 그룹 (SUBSHELL GROUP)
    • 위와 비슷하지만 내부 명령이 서브 쉐에서 실행되는 경우
    • 명령이 부작용을 일으키는 경우 샌드 박스 처럼 많이 사용됩니다.( 변수 변경하기 같은 경우)
    • 현재의 쉘에는 영향을 주지 않습니다.
    • ()
  • 산술 표현식(ARITHMETIC EXPRESSION)
    • 산출 표현식에서 +, -, * 및 / 와 같은 문자는 계산에 사용되는 수학 연산자입니다.
    • 그것들은 다음과 같은 변수 할당에 사용할 수 있습니다. ((a=1 + 4))
    • 테스트에도 사용합니다. if((a<b))
    • (( ))
  • 주석( comment )
    • 큰 따옴표 내의 문자들을 대체(Substitution)하는 것이 가능하다.

6. 쉘 변수

  • 변수를 초기화 할때는 대입연산자의 좌측과 우측에 공백 문자가 포함되지 않아야 함.
  • $표시를 앞에 두고 변수명을 입력하면 값이 출력 됩니다.
imsanghyeon@kimui-MacBookPro Desktop % anmal=tiger
kimsanghyeon@kimui-MacBookPro Desktop % animal=tiger
kimsanghyeon@kimui-MacBookPro Desktop % echo $animal
tiger
kimsanghyeon@kimui-MacBookPro Desktop % animal =tiger
zsh: tiger not found
kimsanghyeon@kimui-MacBookPro Desktop % animal= tiger
zsh: command not found: tiger
kimsanghyeon@kimui-MacBookPro Desktop % color=white
kimsanghyeon@kimui-MacBookPro Desktop % echo "tiger's color is $color"
tiger's color is white
kimsanghyeon@kimui-MacBookPro Desktop %

7. 파라미터 대체와 인용부호

  • 변수 앞뒤로 인용부호를 사용해서 쓰는 것을 잊지 말아야 한다.
  • 중괄호를 이용해서 변수의 범위를 지정해주고 인용부호" "를 이용 합니다.
kimsanghyeon@kimui-MacBookPro Desktop % animal=Tiger; color=Red
kimsanghyeon@kimui-MacBookPro Desktop % echo "$animal $color"
Tiger Red
kimsanghyeon@kimui-MacBookPro Desktop % echo "$animals $colors"
  • 초기화 된 변수를 사용하는 예시로 $를 사용하는데 단수를 s 를 입력해서 복수를 만들려고 했으나,
    어디서부터 어디까지가 변수명인지 알수 없기에 인용부호 처리를 통해 변수명을 알려줍니다.
kimsanghyeon@kimui-MacBookPro Desktop % echo "${animal}s ${color}s"
Tigers Reds
kimsanghyeon@kimui-MacBookPro Desktop % echo "${animal}s vs. ${color}s"
Tigers vs. Reds
kimsanghyeon@kimui-MacBookPro Desktop % echo ${animal}s vs. ${color}s
Tigers vs. Reds

8. 특수 매개 변수

#pwd
#vim vhereis.sh

#! /bin/bash
DIRECTORY=`dirname $0`
echo $DIRECTORY
  1. # chmod +x whereis.sh
  2. # ./whereis.sh
  3. # vi whois.sh
  4. # chomd +x whois.sh
  5. # ./whois.sh james james@gmail.com
  6. # .
#!/bin/bash
name=$1
email=$2
all=$*

echo "your name is $name"
echo "your email is $email"

9. 환경 변수

# pwd
# echo "USER ID : $UID"
# vim euid.sh

# script 작성
#!/bin/bash

if [ "$EUID" -ne 0 ]; then
	echo "run as root"
	exit
fi
echo hello

# 권한 부여
# chmod +x euid.sh
#./euid.sh
run as root
# sudo ./ euid.sh
[sudo] password for user:
hello
# echo  "$RANDOM"
echo  "$RANDOM"
3145
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
echo  "$RANDOM"
3316
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
echo  "$RANDOM"
29227
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
env
HOMEPATH=\\Users\\testworks
USERDOMAIN_ROAMINGPROFILE=DESKTOP-MPVHQUF
APPDATA=C:\\Users\\testworks\\AppData\\Roaming
CUDA_PATH=C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.1
PROMPT_TYPE=0
...

env 를 입력해서 현재 사용중인 변수값을 확인 할 수 있습니다.

10. declare

  • -a 배열 옵션
declare -a alnum=(a1 b1 c1 d1 e1 f1)
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${alnum[1]}
b1
                                                                                                                                 ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${alnum[2]}
c1                                                                                                             
  • -i 옵션
➤ declare -i inum=78
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ inum=inum+1
                                                                                                                               ✔                                                                                                                   ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo $inum
79

─
[2021-11-01 13:44.06]  ~/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ num=num=1
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[2021-11-01 13:44.12]  ~/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ num=num+1
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[2021-11-01 13:44.16]  ~/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ echo $num
num+1
  • -r 읽기 전용 변수 사용 : 다른값으로 재초기화가 불가능 함
─
[2021-11-01 13:44.21]  ~/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ declare -r rPi=3.14
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[2021-11-01 13:46.43]  ~/shell_cmd-1.01
[testworks.DESKTOP-MPVHQUF] ➤ rpi=312
  • -x 변수를 export 하기
declare -x xpath="${HOME}/mydir"
export XPATH="${HOME}/mydir"

11. 매개변수 확장(PE)

  • offset 값을 조정해 2번째부터 출력
  • 4번째 글자부터 출력
  • 문자열의 시작과 글자수를 입력해서 출력
  • echo ${testString#T*is}
  • "That that is is that that is not is not"
  • is that that is not is not
  • echo ${testString%is*not}
  • "That that is is that that is not is not"
  • 다음과 같은 문자열의 조작들이 빈번하게 일어나고 활용됨
➤ testString="That that is is that that is not is not"
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${#testString} # 원하는 문자열의 글자 갯수를 출력
39
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo ${testString:0} # 1번째 글자 부터 출력
That that is is that that is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo ${testString:1} # 2번째 글자 부터 출력
hat that is is that that is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString:3} # 4번째 글자 부터 출력
t that is is that that is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo ${testString:3:3} # 4번째 글자부터 3개 출력
t t
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString#T*is} #앞부분 부터 짧게 일치한 단어 삭제
is that that is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString##T*is} # 앞부분 부터 길게 일치한 단어 삭제
not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString%is*not} # 뒷부분 부터 짧게 일치한 단어 삭제
That that is is that that is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString%%is*not} # 뒷부분 부터 길게 일치한 단어 삭제
That that
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString//that} # 해당 단어와 일치하는 모든 단어 삭제
That is is is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString/that/this} #해당 단어와 일치하는 처음 단어 변경
That this is is that that is not is not                                                                                                                                                                                                                       ✔
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤  echo ${testString/[tT]hat/this} # t 대소문자 포함 처음 일치한 단어를 변경
this that is is that that is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤  echo ${testString//[tT]hat/this} #t 대소문자 포함 일치하는 모든 단어 변경
this this is is this this is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString/#That/this} # 앞부분이 일치하면 변경
this that is is that that is not is not
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo ${testString/%not/NO} # 뒷부분이 일치하면 변경
That that is is that that is not is NO

12. globe 패턴(globe patton)

? 특수문자는 한문자와 대응관계를 이용해 echo 목록을 이용하여 파일 목록을 출력할때 글자수에 따른 파일 목록을 출력함

➤ cd /
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ echo * # 해당 모든 파일 목록 출력
bin cygdrive CygUtilsLicenses.html dev directory.sh drives etc home lib media mnt mx86_64b opt proc registry RemoteFiles sbin src tmp usr var
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo ???  # 3글자로 된 파일 목록 출력
bin dev etc lib mnt opt src tmp usr var
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo ???? # 4글자로 된 파일 목록 출력
home proc sbin
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo b?? # b로 시작하는 파일 목록 출력
bin
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo [abcd]* # a,b,c,d로 시작하는 모든 파일 목록 출력
bin cygdrive dev directory.sh drives
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo [a-d]*  # a,b,c,d로 시작하는 모든 파일 목록 출력
bin cygdrive CygUtilsLicenses.html dev directory.sh drives                                                                         

13. 명령어(tr)

  • tr명령은 지정한 문자를 바꾸어주거나 삭제하기 위한 명령 줄 유틸리티 입니다. Camel Case 단어의 첫글자를 대문자로 표현하는 경우, 이것이 낙타의 등처럼 보인다고 해서 붙여진 용어입니다.
    • -s : Squeeze 반복되는 글자를 1글자로 축약
    • -d : 모든 공백 문자를 제거
    • -cd : Complement 지정한 글자를 제외한 다른 글자를 뜻함 공백문자만 화면에 출력됨
 ➤ tr abcdefghijklmnopqrstuvwxyz ZABCDEFGHIJKLMNOPQRSTUVWXY <<< "Hello World"
HDKKN WNQKC

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ tr [:lower:] [:upper:] <<< "Hello World"
HELLO WORLD

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[2021-11-01 15:42.01]  /
[testworks.DESKTOP-MPVHQUF] ➤ tr [:space:] '\\t' <<< "Hello World"
Hello   World

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ tr -s [:space:] <<< "Hello     World"
Hello World

────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ tr -d [:space:] <<< "Hello World"
HelloWorld                                                                                                                     ✔
─────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ tr -cd [:space:] <<< "Hello         World"

14. 명령어(cut)

  • cut은 파일을 입력을 받아 처리합니다.
    • 2번째 글자가 화면에 출력 됨
    • 1번째 글자부터 3번째 글자까지 출력 됨
    • 3번째 글자부터 마지막 글자까지 출력 됨
    • 1번째 글자부터 5번째 글자까지 출력 됨
  • -d ':' -f1 : delimiter 화이트 스페이스 대신 사용자가 지정한 필드 구분 문자를 사용

passwd 의 첫번째 필드
환경변수

 ➤ cat fruits.txt
grapes
orange
tomato
strawberry
apple

                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ cut -c2 fruits.txt
r
r
o
t
p
                                                                                                                      ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ cut -c1-3 fruits.txt
gra
ora
tom
str
app
                                                                                                                          ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ cut -c3- fruits.txt
apes
ange
mato
rawberry
ple
                                                                                                                     ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ cut -c1-5 fruits.txt
grape
orang
tomat
straw
apple
✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ cut -c1-5 fruits.txt
grape
orang
tomat
straw
apple

                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ cut -d':' -f1 /etc/passwd
SYSTEM
LocalService
NetworkService
Administrators
Administrator
DefaultAccount
Guest
WDAGUtilityAccount
testworks
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ cat /etc/passwd
SYSTEM:*:18:544:,S-1-5-18::
LocalService:*:19:544:U-NT AUTHORITY\\LocalService,S-1-5-19::
NetworkService:*:20:544:U-NT AUTHORITY\\NetworkService,S-1-5-20::
Administrators:*:544:544:,S-1-5-32-544::
Administrator:unused:500:513:U-DESKTOP-MPVHQUF\\Administrator,S-1-5-21-1546242758-651016019-3932243654-500:/home/mobaxterm:/bin/bash
DefaultAccount:unused:503:513:U-DESKTOP-MPVHQUF\\DefaultAccount,S-1-5-21-1546242758-651016019-3932243654-503:/home/mobaxterm:/bin/bash
Guest:unused:501:513:U-DESKTOP-MPVHQUF\\Guest,S-1-5-21-1546242758-651016019-3932243654-501:/home/mobaxterm:/bin/bash
WDAGUtilityAccount:unused:504:513:U-DESKTOP-MPVHQUF\\WDAGUtilityAccount,S-1-5-21-1546242758-651016019-3932243654-504:/home/mobaxterm:/bin/bash
testworks:unused:1001:513:U-DESKTOP-MPVHQUF\\testworks,S-1-5-21-1546242758-651016019-3932243654-1001:/home/mobaxterm:/bin/bash
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ cut -d':' -f1,6 /etc/passwd
SYSTEM:
LocalService:
NetworkService:
Administrators:
Administrator:/home/mobaxterm
DefaultAccount:/home/mobaxterm
Guest:/home/mobaxterm
WDAGUtilityAccount:/home/mobaxterm
testworks:/home/mobaxterm

 ➤  /sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'

15. 확장 glob( EXTENDED GLOBS )

  • 활성화 시킨 후 사용해야 함 shopt -s extglob
 ➤ echo *jpg *bmp
Balloon.jpg Candy.jpg *bmp
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 ➤ shopt -s extglob
                                                                                                                               ✔
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
➤ echo !(*jpg|*bmp)
glob.gif settings_down.png settings_up.png shadingimage.tiff smaller.tiff
  • 이들은 globs에서 사용할 수 있는 메타 문자 입니다.
  • ?(list) : 주어진 패턴의 0 번 또는 1번 일치시킵니다.
  • *(list) : 주어진 패턴의 0 회 이상 일치
  • +(list) : 주어진 패턴의 하나 이상의 일치와 일치합니다.
  • @ : 주어진 패턴 중 하나와 일치 합니다. (or 의 뜻을 가짐)
  • ! : 주어진 패턴을 제외한 모든 것을 일치시킵니다. not 의 뜻을 가짐

16. 쉘 스크립트 문법 검사 도구

ShellCheck : https://www.shellcheck.net/

  • 쉘 스크립트 정적 분석 도구
    • 쉘 스크립트 정적 분석 도구로 유용한 웹사이트
    • 스크립트의 오류 검사

17. 컬러(color) 텍스트

  • echo -e '\\033[34;40mNew Color Prompt\\033[0m'
    New color Prompt
  • echo -e '\\033[37;41mNew Color Prompt\\033[0m'
    New Color Prompt
  • echo -e '\\033[2;31;41mNew Color Prompt\\033[0m'
    이스케이프 [ 1(스타일) ; 37 (전경폰트색); 44m(배경 폰트색)

# 스타일 표 삽입 필요

반응형