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가지
- chmod +x helloworld.sh ⇒ 실행속성을 부여하여 사용
- 경로 : ./helloworld.sh
- BASH : bash helloworld.sh
- SOURCE : source helloworld.sh
- DOT : . helloworld.sh
/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
- # chmod +x whereis.sh
- # ./whereis.sh
- # vi whois.sh
- # chomd +x whois.sh
- # ./whois.sh james james@gmail.com
- # .
#!/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(배경 폰트색)
# 스타일 표 삽입 필요
반응형
'배운것 > LINUX' 카테고리의 다른 글
ubuntu를 hyper-v 환경에서 해보자 (0) | 2024.07.18 |
---|---|
리눅스 쉘 마스터 - 기초 명령어 (0) | 2021.09.14 |
리눅스 쉘 마스터 - 리눅스 기본 (0) | 2021.09.14 |
리눅스 쉘 마스터 - 인프런 강의 소개 (0) | 2021.09.14 |
Linux shell - 사칙연산 해보기 $(expr ) , $[] , $(()) 변수 활용 (0) | 2021.09.09 |