You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 리눅스 스크립트 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://toplist.maxfit.vn team, along with other related topics such as: 리눅스 스크립트 쉘 스크립트, 쉘스크립트 짜기, 쉘 스크립트 문법, 리눅스 쉘 스크립트 예제, 리눅스 스크립트 명령어, 쉘 스크립트 명령어 실행, 쉘 스크립트 기초, 쉘 스크립트 의미
[Linux] 쉘 스크립트(Shell script) 기초
- Article author: engineer-mole.tistory.com
- Reviews from users: 48149 Ratings
- Top rated: 4.7
- Lowest rated: 1
- Summary of article content: Articles about [Linux] 쉘 스크립트(Shell script) 기초 쉘 스크립트란 간단히 말하자면 Unix커맨드등을 나열해서 실행하는 것이다. 언제 어떤 조건으로 어떠한 명령을 실행시킬 것인가, 파일을 컨텐츠를 … …
- Most searched keywords: Whether you are looking for [Linux] 쉘 스크립트(Shell script) 기초 쉘 스크립트란 간단히 말하자면 Unix커맨드등을 나열해서 실행하는 것이다. 언제 어떤 조건으로 어떠한 명령을 실행시킬 것인가, 파일을 컨텐츠를 … 쉘 스크립트란? 쉘 스크립트란 간단히 말하자면 Unix커맨드등을 나열해서 실행하는 것이다. 언제 어떤 조건으로 어떠한 명령을 실행시킬 것인가, 파일을 컨텐츠를 읽어 들일 것인가, 로그 파일을 작성하는 것 등을..
- Table of Contents:
쉘 스크립트란
기본 설정
기본 커맨드
if 조건
루프(반복문)
함수
티스토리툴바
리눅스 (linux) 익히기: 쉘 스크립트 – 잔재미코딩
- Article author: www.fun-coding.org
- Reviews from users: 39959 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about 리눅스 (linux) 익히기: 쉘 스크립트 – 잔재미코딩 3. 쉘 스크립트 쉘을 사용해서 프로그래밍을 할 수 있음 서버 작업 자동화를 위해 기본적으로 익혀둘 필요가 있음 기본 명령어를 기반으로 하며, 이에 몇 가지 문법이 … …
- Most searched keywords: Whether you are looking for 리눅스 (linux) 익히기: 쉘 스크립트 – 잔재미코딩 3. 쉘 스크립트 쉘을 사용해서 프로그래밍을 할 수 있음 서버 작업 자동화를 위해 기본적으로 익혀둘 필요가 있음 기본 명령어를 기반으로 하며, 이에 몇 가지 문법이 … 3. 쉘 스크립트 쉘을 사용해서 프로그래밍을 할 수 있음 서버 작업 자동화를 위해 기본적으로 익혀둘 필요가 있음 기본 명령어를 기반으로 하며, 이에 몇 가지 문법이 추가되는 형태로, 일반적인 프로그래밍 언어와는 달리 간단하고, 쉽게 응용 가능 3. 쉘 스크립트 쉘을 사용해서 프로그래밍을 할 수 있음 서버 작업 자동화를 위해 기본적으로 익혀둘 필요가 있음 기본 명령어를 기반으로 하며, 이에 몇 가지 문법이 추가되는 형태로, 일반적인 프로그래밍 언어와는 달리 간단하고, 쉽게 응용 가능
- Table of Contents:
3 쉘 스크립트¶
리눅스 쉘(bash) 기본 명령어 이해 및 실습
Ubuntu(우분투) 이해하기
[linux] 간단한 쉘 스크립트 (Shell Script) 작성 및 실행 해보기.
- Article author: cheershennah.tistory.com
- Reviews from users: 46296 Ratings
- Top rated: 4.8
- Lowest rated: 1
- Summary of article content: Articles about [linux] 간단한 쉘 스크립트 (Shell Script) 작성 및 실행 해보기. 쉘 스크립트 (Shell Script). shell을 사용해서 프로그래밍을 할 수 있다. 주로 리눅스 등 서버작업의 프로그래밍 시 사용되며 생각보다 자주 사용 … …
- Most searched keywords: Whether you are looking for [linux] 간단한 쉘 스크립트 (Shell Script) 작성 및 실행 해보기. 쉘 스크립트 (Shell Script). shell을 사용해서 프로그래밍을 할 수 있다. 주로 리눅스 등 서버작업의 프로그래밍 시 사용되며 생각보다 자주 사용 … 쉘 스크립트 (Shell Script) shell을 사용해서 프로그래밍을 할 수 있다. 주로 리눅스 등 서버작업의 프로그래밍 시 사용되며 생각보다 자주 사용된다. 쉘 스크립트는 파일안에 스크립트 작성 후, 실행 시 해당..개발하는 생계형 코더의 개발블로그입니다.
밥 벌어먹고 살아야죠. On my way, Keep going !!! 👊
Youtube @치얼스헤나 - Table of Contents:
티스토리툴바
[LINUX] 📚 BASH 쉘 프로그래밍 문법 마스터 💯 총정리 (+ 연습예제)
- Article author: inpa.tistory.com
- Reviews from users: 21793 Ratings
- Top rated: 3.4
- Lowest rated: 1
- Summary of article content: Articles about [LINUX] 📚 BASH 쉘 프로그래밍 문법 마스터 💯 총정리 (+ 연습예제) Shell Script는 Shell이나 command line 인터프리터에서 구동되도록 작성된 스크립트다. 윈도우에서는 batch(배치파일, .bat) 을 한번쯤은 본적이 … …
- Most searched keywords: Whether you are looking for [LINUX] 📚 BASH 쉘 프로그래밍 문법 마스터 💯 총정리 (+ 연습예제) Shell Script는 Shell이나 command line 인터프리터에서 구동되도록 작성된 스크립트다. 윈도우에서는 batch(배치파일, .bat) 을 한번쯤은 본적이 … Shell Script 란 Shell Script는 Shell이나 command line 인터프리터에서 구동되도록 작성된 스크립트다. 윈도우에서는 batch(배치파일, .bat) 을 한번쯤은 본적이 있을 것이다. bat 파일을 실행하면 프로그램..
- Table of Contents:
Shell Script 란
쉘 스크립트 문법 정리 (Shell Programming)
BASH 쉘 스크립트 연습문제 코드
방문해 주셔서 감사드립니다
공지사항
최근 댓글 new
최근 글 new
인기 글 hot
티스토리툴바
리눅스 쉘 스크립트 마스터 – 인프런 | 강의
- Article author: www.inflearn.com
- Reviews from users: 10512 Ratings
- Top rated: 3.5
- Lowest rated: 1
- Summary of article content: Articles about 리눅스 쉘 스크립트 마스터 – 인프런 | 강의 리눅스 쉘 스크립트를 공부할까 말까 망설이는 당신에게 한 가지만 말하겠습니다. 해커처럼 멋있게 리눅스를 다루고 싶은가요? 쉘 스크립트를 모르는 … …
- Most searched keywords: Whether you are looking for 리눅스 쉘 스크립트 마스터 – 인프런 | 강의 리눅스 쉘 스크립트를 공부할까 말까 망설이는 당신에게 한 가지만 말하겠습니다. 해커처럼 멋있게 리눅스를 다루고 싶은가요? 쉘 스크립트를 모르는 … 리눅스 쉘 스크립트를 공부할까 말까 망설이는 당신에게 한 가지만 말하겠습니다.
해커처럼 멋있게 리눅스를 다루고 싶은가요? 쉘 스크립트를 모르는 해커를 상상할 수 있나요? 그럼 지금 바로 시작하세요!, – 강의 소개 | 인프런… - Table of Contents:
리눅스 입문 – 개념으로 탄탄히!!
페이스북 클론 – full stack 웹 개발
리눅스 쉘 스크립트
코알못에서 웹서비스 런칭까지 2021 제주 코딩 베이스캠프(Django)
리눅스 – 쉘(Shell)과 쉘스크립트(Shell Script)
- Article author: velog.io
- Reviews from users: 36456 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about 리눅스 – 쉘(Shell)과 쉘스크립트(Shell Script) 이번주 공부한 리눅스 내용은 쉘과 쉘스크립트다 :)Bash는 쉘의 종류로, Bourne Again Shell의 축약어다. 리눅스에서 가장 널리 사용되는 쉘이다. …
- Most searched keywords: Whether you are looking for 리눅스 – 쉘(Shell)과 쉘스크립트(Shell Script) 이번주 공부한 리눅스 내용은 쉘과 쉘스크립트다 :)Bash는 쉘의 종류로, Bourne Again Shell의 축약어다. 리눅스에서 가장 널리 사용되는 쉘이다. 이번주 공부한 리눅스 내용은 쉘과 쉘스크립트다 :)Bash는 쉘의 종류로, Bourne Again Shell의 축약어다. 리눅스에서 가장 널리 사용되는 쉘이다./bin 데릭터리 안에 존재한다.bash는 다섯 개의 공통된 설정 파일들을 가지고 있다. 모든 리눅스 배포본에
- Table of Contents:
Linux
시작하며
Bash
Shell Script
쉘 스크립트 (Shell Script) – (Ⅰ)
- Article author: www.linuxlab.co.kr
- Reviews from users: 27499 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about 쉘 스크립트 (Shell Script) – (Ⅰ) 쉘 스크립트란 쉘에서 사용할 수 있는 명령어들의 조합을 모아서 만든 배치(batch) 파일이다. 리눅스에서는 여러 명령어들을 파이프(pipe), 리다이렉션(redirection), … …
- Most searched keywords: Whether you are looking for 쉘 스크립트 (Shell Script) – (Ⅰ) 쉘 스크립트란 쉘에서 사용할 수 있는 명령어들의 조합을 모아서 만든 배치(batch) 파일이다. 리눅스에서는 여러 명령어들을 파이프(pipe), 리다이렉션(redirection), …
- Table of Contents:
Bash 입문자를 위한 핵심 요약 정리 (Shell Script) – 개발자스럽다
- Article author: blog.gaerae.com
- Reviews from users: 35868 Ratings
- Top rated: 4.5
- Lowest rated: 1
- Summary of article content: Articles about Bash 입문자를 위한 핵심 요약 정리 (Shell Script) – 개발자스럽다 그런데 전역 변수는 현재 실행된 스크립트 파일에서만 유효하다. 자식 스크립트에서는 … PS4, 쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: +). …
- Most searched keywords: Whether you are looking for Bash 입문자를 위한 핵심 요약 정리 (Shell Script) – 개발자스럽다 그런데 전역 변수는 현재 실행된 스크립트 파일에서만 유효하다. 자식 스크립트에서는 … PS4, 쉘 스크립트 디버깅 모드의 프롬프트 변수(기본값: +). 개발자스럽다, Bash 입문자를 위한 핵심 요약 정리 (Shell Script), jasa desain grafis,desain grafis,desain grafis murah,jasa desain logo,desain murah,desain logo murah,desain logo,jasa desain,desain murah indonesia,bikin logo murah,jasa desain murah,logo murah
- Table of Contents:
[Bash script] 리눅스 쉘스크립트 작성 및 실행하기
- Article author: jesc1249.tistory.com
- Reviews from users: 12009 Ratings
- Top rated: 3.7
- Lowest rated: 1
- Summary of article content: Articles about [Bash script] 리눅스 쉘스크립트 작성 및 실행하기 Bash script 리눅스를 운용하다 보면 반복되는 작업을 직접 커맨드를 입력하는 것이 아닌 자동으로 동작하게 하기 위해 쉘 스크립트를 사용하게 된다. …
- Most searched keywords: Whether you are looking for [Bash script] 리눅스 쉘스크립트 작성 및 실행하기 Bash script 리눅스를 운용하다 보면 반복되는 작업을 직접 커맨드를 입력하는 것이 아닌 자동으로 동작하게 하기 위해 쉘 스크립트를 사용하게 된다. Bash script 리눅스를 운용하다 보면 반복되는 작업을 직접 커맨드를 입력하는 것이 아닌 자동으로 동작하게 하기 위해 쉘 스크립트를 사용하게 된다. 쉘 스크립트를 만드는 방법과 실행하는..현재 네트워크 엔지니어 & 개발자로 성능시험과 인증업무, 네트워크 장비 개발, 트러블슈팅, QA 업무를 수행하고 있다.
도보 여행을 좋아하여 국내의 다양한 길들을 도전해보고 있다. - Table of Contents:
[Linux] 리눅스 쉘(Shell) 간단한 스크립트 작성 및 실행 방법
- Article author: coding-factory.tistory.com
- Reviews from users: 44270 Ratings
- Top rated: 3.1
- Lowest rated: 1
- Summary of article content: Articles about [Linux] 리눅스 쉘(Shell) 간단한 스크립트 작성 및 실행 방법 쉘을 사용해서 프로그래밍도 할 수 있습니다. 주로 서버 작업 자동화 프로그래밍을 만들 때 사용하며 생각보다 자주 사용합니다.쉘 스크립트는 파일 … …
- Most searched keywords: Whether you are looking for [Linux] 리눅스 쉘(Shell) 간단한 스크립트 작성 및 실행 방법 쉘을 사용해서 프로그래밍도 할 수 있습니다. 주로 서버 작업 자동화 프로그래밍을 만들 때 사용하며 생각보다 자주 사용합니다.쉘 스크립트는 파일 … 쉘을 사용해서 프로그래밍도 할 수 있습니다. 주로 서버 작업 자동화 프로그래밍을 만들 때 사용하며 생각보다 자주 사용합니다.쉘 스크립트는 파일안에 스크립트를 작성 후 실행하는 방식..
- Table of Contents:
Header Menu
Main Menu
쉘(Shell) 스크립트 작성 방법
쉘(Shell)파일 실행 권한 부여 방법
쉘(Shell) 스크립트 실행 방법
Sidebar – Right
Copyright © 코딩팩토리 All Rights Reserved
Designed by JB FACTORY
티스토리툴바
See more articles in the same category here: 180+ tips for you.
[Linux] 쉘 스크립트(Shell script) 기초
728×90
쉘 스크립트란?
쉘 스크립트란 간단히 말하자면 Unix커맨드등을 나열해서 실행하는 것이다. 언제 어떤 조건으로 어떠한 명령을 실행시킬 것인가, 파일을 컨텐츠를 읽어 들일 것인가, 로그 파일을 작성하는 것 등을 할 수 있다.
기본 설정
예시로 다음과 같이 test.sh 파일을 작성한다.
#!/bin/sh echo “Hello, World!”
– 쉘 스크립트 파일은 기본적으로 .sh 확장자로 작성한다.
– 실제 코드를 작성하기 전에 맨 처음의 행에는 #!/bin/sh를 쓴다. 시스템에 지금부터 셸 스크립트를 쓴다는 사실을 알려주기 위함이다(여담이지만, #는 hash, !는 bang이므로 #!를 shebang이라고 부르기도한다). 그러나 bash의 독자적인 기능을 사용하는 경우 다르게 작성한다(#!/usr/bin/env bash).
– 쉘 스크립트 파일(test.sh)를 실행하기 위해서는, 터미널에서 파일이 저장된 장소에 가서 아래의 커맨드 중 하나를 선택해서 실행해야한다.
$ chmod 755 test.sh $ ./test.sh
$ sh test.sh
$ bash test.sh
파일을 실행시키면, 작성한 Hello, World!가 표시된다.
기본 커맨드
코멘트
# 로 코멘트 처리할 수 있다.
#!/bin/sh # 여기는 코멘트이다. # 코멘트처리된 구문은 실행되지 않는다. echo “Hello, World!”
입력/출력
echo로 출력, read로 입력할 수 있다.
#!/bin/sh read NAME echo “Hello, $NAME!”
실행하면 결과는 다음과 같다.
$ ./test.sh Tensai Hello, Tensai!
입력을 대기하고 있는 경우, 스크립트는 실행되지 않는다.
Bash에서는 -e플래그로 특수 텍스트를 이스케이프할 수 있다.
#!/bin/bash echo -e “Hello
$NAME!” #개행된다.
변수
– 변수의 이름으로써 영문자, 숫자 그리고 언더바가 사용된다.
– 변수에 값을 전달할 때는 = 의 앞,뒤에 공백 없이 작성한다. 문자열인 경우 “(쌍따옴표)로 감싼다.
– 변수에 액세스할 때 변수명의 앞에 $를 넣는다. 혹은 $넣어서 변수를 {}로 감싼다.
– 하나의 변수에 한 개의 값만 보존된다.
– 변수의 값이 덮어 쓰기되는 것을 방지하기 위해서는 readonly를 사용한다.
– 변수를 unset으로 삭제할 수 있다 (그러나 readonly변수를 삭제하는 것을 불가능하다).
#!/bin/sh var=”변수1″ VaR_2=”변수2” echo “Var_2=$VaR_2″ VaR_2=”VaR_2가 변경됐다” echo ${VaR_2} readonly var var=”readonly var를 바꿔보자”
실행결과는 다음과 같다.
$ ./test.sh Var_2=변수2 VaR_2가 변경됐다. shell.sh: line 11: var: readonly variable
특별한 변수
쉘 스크립트에서는 아래와 같은 특별한 변수가 있다.
변수 기능 $0 스크립트명 $1 ~ $9 인수, 첫 번째의 인수는 $1, 2번째 인수는 $2로 액세스 $# 스크립트에 전달된 인수의 수 $* 모든 인수를 모아 하나로 처리 $@ 모든 인수를 각각 처리 $? 직전에 실행한 커맨드의 종료 값(0은 성공, 1은 실패) $$ 이 쉘 스크립트의 프로세스 ID $! 마지막으로 실행한 백그라운드 프로세스 ID
#!/bin/sh echo “\$0(스크립트 명): $0” echo “\$1(1번째 인수): $1” echo “\$2(2번째 인수): $2” echo “\$#(인수의 수): $#” echo “\”\$*\”: \”$*\”” echo “\”\$@\”: \”$@\”” VAR=”exit값은0이 될 것이다.” echo $?
실행 결과는 아래와 같다.
$ ./test.sh first second 3rd $0(스크립트 명): test.sh $1(1번째 인수): first $2(2번째 인수): second $3(3번째 인수): 3rd $#(인수의 수): 3 “$*”: “first second third” “$@”: “first second third” 0
특수 문자
* ? [ ‘ ” ` \ $ ; & ( ) | ~ < > # % = 스페이트 탭 개행는 쉘 스크립트의 특수 문자이다. 문자열로써 사용할 때는 \를 앞에 쓴 다음에 쓴다.
변수 값의 치환
문법 설명 ${var} 변수 값을 바꿔 넣는다. ${var:-word} 변수가 아직 세팅되지 않거나 공백 문자열의 경우 word를 반환한다. var에는 저장되지 않는다. ${var:=word} 변수가 아직 세팅되지 않거나 공백 문자열의 word를 반환한다. var에 저장된다. ${var:?word} 변수가 아직 세팅되지 않거나 공백 문자열의 경우 치환에 실패하고, 스탠다드 에러에 에러가 표시된다. ${var:+word} 변수가 세팅되지 않은 경우 word가 반환된다. var에는 저장되지 않는다.
#!/bin/sh echo “1 – ${var:-wordSetInEcho1}” echo “2 – var = ${var}” echo “3 – ${var:=wordSetInEcho3}” echo “4 – var = ${var}” unset var echo “5 – ${var:+wordSetInEcho5}” echo “6 – var = $var” var=”newVarValue” echo “7 – ${var:+wordSetInEcho7}” echo “8 – var = $var” echo “9 – ${var:?StandardErrorMessage}” echo “10 – var = ${var}”
실행 결과
1 – wordSetInEcho1 2 – var = 3 – wordSetInEcho3 4 – var = wordSetInEcho3 5 – 6 – var = 7 – wordSetInEcho7 8 – var = newVarValue 9 – newVarValue 10 – var = newVarValue
배열 (Bash)
#!/bin/bash #bash shell로 배열을 작성하는 방법 ARRAY=(item1 item2 item3 item4) ARRAY[0]=”ITEM1″ ARRAY[2]=”ITEM3″ echo “ARRAY[0]: ${ARRAY[0]}” echo “ARRAY[1]: ${ARRAY[1]}” #모든 아이템에 액세스 echo “ARRAY[*]: ${ARRAY[*]}” echo “ARRAY[@]: ${ARRAY[@]}”
실행결과
$ ./test.sh ARRAY[0]: ITEM1 ARRAY[1]: item2 ARRAY[*]: ITEM1 item2 ITEM3 item4 ARRAY[@]: ITEM1 item2 ITEM3 item4
오퍼레이터
shell에서는 산수연산자로 `expr 숫자 연산자 숫자`를 이용한다.
연산자 의미 예 + 덧셈 echo `expr 10 + 20` => 30 – 뺄셈 echo `expr 20 – 10` => 10 \* 제곱 echo `expr 11 \* 11` => 121 / 나눗셈 echo `expr 10 / 2` => 5 % 나머지 echo `expr 10 % 4` => 2 = 자정 a=$b b의 값은 a에 저장된다 == 동일 [ “$a” == “$b” ] $a과 $b가 동일하는 경우 TRUE가 반환된다. != 다름 [ “$a” != “$b” ] $a과 $b가 동일하지 않는 경우 TRUE가 반환된다.
비교 의미 예 -eq 동일 [ “$a” -eq “$b” ] 와 $a와 $b가 동일한 경우 TRUE가 반환된다. -ne 다음 [ “$a” -ne “$b” ] $a와 $b가 동일하지 않은 경우 TRUE가 반환된다. -gt 보다 큼 [ “$a” -gt “$b” ] $a가 $b보다 큰 경우 TRUE가 반환된다. -lt 보다 작음 [ “$a” -lt “$b” ] $a가 $b보다 작은 경우 TRUE가 반환된다. -ge 보다 크거나 같거나 [ “$a” -ge “$b” ] $a가 $b보다 크거나 같은 경우 TRUE가 반환된다. -le 보다 작거나 같거나 [ “$a” -le “$b” ] $a가 $b보다 작거나 같은 경우 TRUE가 반환된다. ! (이)가 아니다 [ ! “$a” -gt “$b” ]$a가 $b보다 크지 않은 경우 TRUE가 반환된다. -o 어느쪽이든 [ “$a” -gt “$b” -o “$a” -lt “$b” ]$a가 $b보다 크거나 작은 경우 TRUE가 반환된다. (Bash 확장 / POSIX폐지 예정) -a 양쪽 [ “$a” -gt 90 -a “$a” -lt 100 ] $a가 90보다 크고 100보다는 작은 경우 TRUE가 반환된다. -z 문자열이 비었는가 [ -z “$a” ]$a에 어떤 것도 지정되지 않은 경우 TRUE가 반환된다. -n 문자열이 비었는가 [ -n “$a” ] $a에 어떠한 것이 지정되어 있다면 TRUE가 반환된다.
위의 오퍼레이터를 사용하여 if 조건을 작성한다.
if 조건
– if의 기본 작성법은 if [ 조건 ] then 커맨드 fi 이다.
– 조건과 일치하는 경우 then 뒤의 커맨드가 실행된다.
– 조건과 다른 경우 차례로 elif [ 조건 ]에 적힌 내용을 확인한다.
– 일치하는 조건이 없는 경우 else 다음의 커맨드가 실행된 후 종료된다.
– else가 존재하지 않는 경우, 그대로 종료된다.
#!/bin/sh if [ “$1” -gt “$2” ] then echo “1번째 인수가 2번째 인수보다 크다” elif [ “$1” -eq “$2” ] then echo “1번째 인수와 2번째 인수가 동일하다” else echo “1번째 인수가 2번째 인수보다 작다” fi
실행 결과
$ ./test.sh 2 7 1번째 인수가 2번째 인수보다 작다 $ ./test.sh 10 5 1번째 인수가 2번째 인수보다 크다 $ ./test.sh 9 9 1번째 인수와 2번째 인수가 동일하다
Switch 조건
– switch의 기초 작성법은 case 변수 in 조건・값) 커맨드 ;; esac이다.
– 조건・값이 변수와 일치하는 경우 그 곳에 적힌 커맨드가 실행된다.
#!/bin/sh DRINK=”coffee” case “$DRINK” in “beer”) echo “맥주입니다” ;; “juice”) echo “주스입니다” ;; “coffee”) echo “프로그래머가 마시면 커피로 변화!” ;; esac
실행결과
$ ./test.sh 프로그래머가 마시면 커피로 변화!
루프(반복문)
루프는
– break 키워드로 종료
– continue키워드로 현재의 루프를 건너 뛸 수 있다.
while 루프
조건과 일치할 때 반복된다.
#!/bin/sh a=0 while [ $a -lt 5 ] do echo $a a=`expr $a + 1` done
실행결과
$ ./test.sh 0 1 2 3 4
until 루프
while과 반대로, 조건과 일치할 때까지 반복된다.
#!/bin/sh a=0 until [ ! $a -lt 5 ] do echo $a a=`expr $a + 1` done
실행결과
$ ./test.sh 0 1 2 3 4
for 루프
– for의 기본 작성법은 for 변수 in 여러개의 값・변수・범위 do 커맨드 done
– 조건・값이 변수와 일치하는 경우 커맨드가 실행된다.
#!/bin/sh for var in 0 1 2 3 4 #범위의 작성법(Bash독자) => {0..4} do echo $var done
실행결과
$ ./test.sh 0 1 2 3 4
함수
쉘 스크립트에서는 함수를 작성하여 인용하는 것이 가능하다.
#!/bin/sh #함수를 작성한다 MyFunction () { echo “함수의 echo이다.” } MyParamFunc() { echo “인수1:$1 인수2:$2” } #함수를 호출한다 MyFunction MyParamFunc param1 param2
실행결과
$ ./test.sh 함수의 echo입니다. 인수1:param1 인수2:param2
참고자료
https://qiita.com/miyu/items/4fce490115272b87c887
https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337
728×90
[linux] 간단한 쉘 스크립트 (Shell Script) 작성 및 실행 해보기.
반응형
쉘 스크립트 (Shell Script)
shell을 사용해서 프로그래밍을 할 수 있다.
주로 리눅스 등 서버작업의 프로그래밍 시 사용되며 생각보다 자주 사용된다.
쉘 스크립트는 파일안에 스크립트 작성 후, 실행 시 해당 스크립트가 실행되는 방식으로 이루어진다.
파일의 가장 위 첫라인은
#!/bin/bash
로 시작된다. * 이때 #는 주석을 의미하는 것이 아니다.
쉘스크립트 파일은 실행권한을 가지고 있어야 실행시킬 수 있다.
간단한 쉘 스크립트를 만들어서 실행 해보자.
$ vi forever.sh
vi [쉘 파일명]을 입력하여 쉘 파일 생성/편집 모드로 들어간다.
필자는 파일명은 forever.sh 로 만들어 보겠다.
* shell script의 파일 형식은 관습적으로 “sh” 확장자를 사용한다. 이는 정해진 규칙이라기보다 쉘 스크립트라는 것을 표시하기 위함이다.
편집모드 i 를 눌러
첫 라인에 #!/bin/bash 를 써 주고,
실행 스크립트는 echo “forever!” 로 입력해보았다.
*echo명령어는 쉘 프로그래밍 언어에서 출력문이다. “forever!”을 출력하겠다는 의미이다.
일반적인 프로그래밍 언어의 print 명령문이 되겠다.
입력 후 편집모드 종료키인 esc를 눌러 vi가 비활성화 되면
저장후 종료하라는 명령문인 :wq 를 입력하여 저장 후, vi를 종료한다.
ls -l 명령어를 사용하여 forever.sh 파일을 확인해보면
-rw-r–r– 권한으로 즉, 실행권한이 없는 일반파일이 생성이 된 것을 확인할 수 있다.
이 경우 쉘스크립트를 실행(./forever.sh) 해보면,
실행 권한이 없기 때문에 ‘허가거부’ 메세지가 떨어지면서 실행되지 않는다.
이 파일을 실행할 수 있도록 실행권한 chmod 755 권한을 부여해 준다.
* 퍼미션 755 설정 : 모든 사용자에게 실행 권한이 주어짐
실행권한 부여 부, forever.sh 쉘 파일을 실행하면 다음과 같이 스크립트에 입력해두었던 출력문이 실행되어
“forever!” 문구가 잘 출력이 된다.
* 실행방법
실행방법은 명령어 3가지 방법이 있다.
1) ./forever.sh
2) sh forever.sh
3) bash forever.sh
필자는 1번 방법으로 실행하였다.
다음과 같은 매커니즘으로 쉘스크립트를 실행할 수 있고
출력문이 아닌 실제 하고자 하는 작업 명령문을 입력해놓으면
길거나 여러개의 명령문을 순차적으로 실행하며
사용자 입장에서는 (실제 실행 프로세스를 모르더라도)간단히 쉘 스크립트를 실행하는 것만으로 작업실행이 가능하다.
실제 작업 명령문 ex)
+ 보너스 공부 #!/bin/bash 란?
쉘 스크립트를 만들때, 가장 첫 라인에
#!/bin/bash
를 왜 써야 하는지에 대하여 알아보자.
쉘 스크립트의 가장 첫 라인에 #!/bain/bash 를 쓰게 됨으로 해서, 내가 사용 하려는 명령어 해석기가 bash 쉘 임을 미리 알려주는 것이다.
일반적으로 스크립트에서 #는 주석기호이지만, 첫라인의 #!/bin/bash 에서의 #은 주석기호가 아니다.
#! 은 스크립트의 제일 앞에서 이 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에게 알려주는 역할을 하며, 실행 가능한 쉘 스크립트라는 것을 나타내는 특별한 표시자이다.
#! 바로 뒤에 나오는 것은 경로명으로, 스크립트에 들어있는 명령어들을 해석할 프로그램의 위치를 나타내는데 그 프로그램이 쉘인지, 프로그램 언어인지, 유틸리티인지를 나타낸다.
이 명령어 해석기가 주석은 무시하면서 스크립트의 첫 번째 줄부터 명령어들을 실행시킨다.
거의 대부분의 상업용 유닉스 및 리눅스 에서는 기본 본쉘인 #!/bin/sh 을 사용한다.
(필자도 리눅스 환경에서 테스트 했기 때문에 #!/bin/sh 를 사용하였다. )
실제 /bin/sh 경로를 조회해보면 bash 쉘에 링크를 걸어두고 있는것을 확인할 수 있다.
즉, 스크립트를 실행하면, /bin/sh 에 연결된 bash 쉘의 기능을 사용하는 것이다.
“#!” 뒤에 나오는 경로는 정확히 Full PATH를 기록 해야 한다.
만약 PATH를 잘못 적게 되면, 스크립트를 돌렸을 때 거의 대부분 “Command not found”라는 에러 메세지를 만날것이다.
shell script를 사용하는 이유?
가장 큰 이유는 반복되는 작업을 자동화하기 위해 스크립트형태로 미리 만들어 놓고 실행만 하도록 하기 위해서이다.
이렇게 하면 스케줄링을 돌려서 파일만 실행하도록 할수도 있고 스크립트의 내용을 몰라도 누구나 실행할 수 있다.
이러한 장점을 가지고 있는 shell script는 모니터링, 데이터 백업, 복구, notification, 보안, 인증 등
여러 상황에서 많이 사용된다.
반응형
[LINUX] 📚 BASH 쉘 프로그래밍 문법 마스터 💯 총정리 (+ 연습예제)
Shell Script 란
Shell Script는 Shell이나 command line 인터프리터에서 구동되도록 작성된 스크립트다.
윈도우에서는 batch(배치파일, .bat) 을 한번쯤은 본적이 있을 것이다.
bat 파일을 실행하면 프로그램이 자동으로 혼자 쭉쭉 실행 되는데, 이러한 bat파일의 리눅스 버젼 이 바로 shell script라고 봐도 된다.
물론 윈도우와 리눅스의 스크립트는 서로 다른 문법으로 작동된다.
정리를 하자면, 우리가 터미널에서 한땀한땀 입력했던 여러 명령어들을 하나의 스크립트 파일에 나열하여, 스크립트 파일이 자동으로 실행 함으로 효율적이면서 간편하게 작업 처리를 할 수 있는 것이다.
다만 Shell Script는 Interpreter 방식이므로, 한줄 한줄 읽어 실행함으로 다소 속도가 느리다는 단점이 있다.
쉘 스크립트의 사용 예는 다음과 같다.
서버가 다운되어서 확인해보니 서버 저장공간이 하나도 남아 있지 않았다.
이유는 로그 파일이 많이 쌓였기 때문이었다.
그래서 로그 파일이 업데이트가 안되어 관련 프로그램이 비정상적으로 종료되었던 것이다.
어떻게 하면 자동으로 오래된, 혹은 일정 시간 경과한 로그 파일을 자동으로 삭제할 수 있을까?
이런 문제를 간단한 쉘 스크립트 생성 및 주기적 실행으로 해결할 수 있다.
쉘 스크립트 문법 정리 (Shell Programming)
쉘 스크립트 문법 검사 사이트
쉘 작성 첫번째 행 – Shebang
쉘 스크립트를 작성할 때는 항상 기억해야 할 것이 있다.
바로 첫 번째행이 다음과 같이 작성 해줘야 하는 점이다.
#!/usr/bin/bash echo $(which bash) # 디렉토리 위치 출력
스크립트 첫 번째 줄에 작성한 내용은 쉘 스크립트가 실행될 때 어떤 쉘로 스크립트를 실행할 지 정의하는 곳 이다.
쉘에는 여러 버젼이 있다.
[유닉스 쉘 종류]sh : 초기의 유닉스 쉘(Bourne shell), 1977년에 발표
ksh : 콘 쉘이라고도 불리며 1983년 데이비드 콘이 개발했으며 sh를 확장하여 만듬.
csh : 1978년 버클리 대학에서 C언어를 기반으로 만든 쉘.
bash : 1987년 브라이언 폭스에 의해 만들어진 쉘로 sh와 대부분 호환.
이 강의에는 가장 널리쓰이는 bash 쉘을 사용하는 스크립트로 연재할 예정이니, 위와 같이 정의하여 리눅스의 표준 셀인 bash로 실행하겠다는 선언 을 하겠다는 말이다.
이러한 쉘 선언문을 Shebang이라고 한다.
vi로 쉘 스크립트 파일을 작성하고, 저장을 해준다.
그리고 실행권한(x)를 주고 쉘을 실행하면, bash의 절대경로가 출력되게 된다.
$ vi script.sh # … 작성후 종료 $ chmod +x script.sh or chmod 755 script.sh $ ./script.sh # 쉘 스크립트 실행
$ vi script.sh # … 작성후 종료 $ bash script.sh # bash 로 실행하면 권한을 주지 않고도 실행된다.
쉘 변수 선언
변수의 타입에는 로컬변수와 전역변수, 환경변수, 예약변수, 매개변수 등 다양히이 존재한다.
변수는 대, 소문자를 구별한다.
변수의 이름은 숫자를 포함할 수 있지만, 숫자로 시작할 수 없다.
변수에는 모든 값을 문자열 로 저장된다.
로 저장된다. 변수에는 자료형을 기입하지 않는다 . ( int number, char names[10] ), 즉 아무런 값을 다 넣을 수 있다.
. ( ), 즉 아무런 값을 다 넣을 수 있다. 값을 사용할 때는 변수명 앞에 특수문자 ” $ “를 사용한다. (Ex. echo ${data} )
“를 사용한다. (Ex. ) 값을 대입(삽입)할 때는 특수문자 ” $ “를 사용하지 않는다. (Ex. data=mac )
“를 사용하지 않는다. (Ex. ) 변수를 생성할 때는 ” = ” 대입문자 앞뒤로 공백이 없어야 한다. (Ex. data=”abcd” )
#!/usr/bin/bash name=”inpa” # 변수 선언 및 대입 pass=123123 # 따옴표로 감싸든 말든 문자열로 저장됨 echo $name # {}가 있으나 없으나 $만으로 변수의 값을 넣어줄 수 있으나, 문자열을 붙여서 쓸려면 ${} 를 사용해야 한다. echo “my name is mr.${name}” printf “%s” $pass
echo는 개행을 포함한채 출력한다. C언어의 put으로 생각해도 된다.
printf는 개행을 포함하지 않은채 출력한다. C언어의 printf와 같다
전역 변수 & 지역 변수
쉘에서 선언된 변수는 기본적으로 전역 변수(global variable)다.
단, 함수 안에서만 지역 변수(local variable)를 사용할 수 있는데 사용할려면 변수 명 앞에 local을 붙여주면 된다.
# 기본적으로 전역 변수로 지정 string=”hello world” function string_test() { # local을 붙여야 지역변수로 인식. 만일 local을 빼면 전역변수 덮어쓰기가 되버림 local string=”hello local @@” echo ${string} } # 함수 호출 string_test # > hello local @@ echo ${string} # > hello world # 변수 초기화 unset string
변수 타입 지정
기본적으로 Bash 변수는 문자열만 저장한다.
다만, 여타 프로그래밍 언어같이 변수 자료형 타입을 미리 지정해주는 문법도 존재한다.
# -r 읽기 전용 타입 (상수 const라고 보면 된다) declare -r var1 readonly var1 # -i 정수형 타입 declare -i number number=3 echo “number = $number” # number = 3 # -a 배열 타입 declare -a indices # -A 연관배열(MAP) 타입 declare -A map # -f 함수 타입 declare -f # -x 환경변수(export) 지정 declare -x var3 # 스크립트 외부 환경에서도 이 변수를 쓸 수 있게 해준다.
환경 변수
쉘 스크립트에서 변수 명 앞에 export을 붙여주면 환경 변수(environment variable)로 설정 되어 자식 스크립트에서 사용 가능하다.
다만 환경 변수 사용시 시스템에 미리 정의된 예약 변수(reserved variable)와 변수명이 겹치지 않게 주의하자.
# /home/export_test.sh 파일을 만들고 작성 #!/usr/bin/bash echo ${hello_world}
# 환경 변수 선언 export hello_world=”global hello world” # 자식 스크립트 호출은 스크립트 경로을 쓰면된다. /home/export_test.sh # > 자식스크립트의 코드에서 부모스크립트에서 정의한 hello_world변수값이 출력된다.
매개 변수
프로그램에서도 실행할때 인자를 주듯 쉘 스크립트도 역시 그렇게 할 수 있다.
실행한 스크립트 이름은 ${0}, 그 이후는 전달받은 인자 값들이다(${1}, ${2}, …)
종류 설명 $0 실행된 셸 스크립트명 $1 스크립트에 넘겨진 첫 번째 아규먼트 $2 스크립트에 넘겨진 두 번째 아규먼트 $3 S4 등등…쭈욱 이후 $숫자 그 이후 해당되는 아규먼트 $# 아규먼트 개수 $* 스크립트에 전달된 인자 전체를 하나의 변수에 저장하면 IFS 변수의 첫 번째 문자로 구분 $@ $*와 동일한데 다른 점은 IFS 환경 변수를 사용하지 않는다는 점. $! 실행을 위해 백그라운드로 보내진 마지막 프로그램 프로세스 번호 $$ 셸 스크립트의 PID $? 실행한 뒤의 반환 값 (백그라운드로 실행된 것 제외)
#!/bin/bash echo “script name : ${0}” echo “매개변수 갯수 : ${#}” echo “전체 매개변수 값 : ${*}” echo “전체 매개변수 값2 : ${@}” echo “매개변수 1 : ${1}” echo “매개변수 2 : ${2}”
$ ./script.sh 가 나 다 라 마 바 사 매개변수 갯수 : 7 전체 매개변수 값 : 가 나 다 라 마 바 사 전체 매개변수 값2 : 가 나 다 라 마 바 사 매개변수 1 : 가 매개변수 2 : 나
예약 변수
쉘 스크립트에서 사용자가 정해서 만들 수 없는 이미 정의된 변수 가 존재한다.
이 변수명을 피해서 스크립트를 작성해야 한다.
변수 설명 HOME 사용자 홈 디렉토리 PATH 실행 파일의 경로
여러분이 chmod, mkdir 등의 명령어들은 /bin이나 /usr/bin, /sbin에 위치하는데, 이 경로들을 PATH 지정하면 여러분들은 굳이 /bin/chmod를 입력하지 않고, chmod 입력만 해주면 된다. LANG 프로그램 실행 시 지원되는 언어 UID 사용자의 UID SHELL 사용자가 로그인시 실행되는 쉘 USER 사용자의 계정 이름 FUNCNAME 현재 실행되고 있는 함수 이름 TERM 로그인 터미널
이외의 변수 명령어
set : 셸 변수를 출력하는 명령어
env : 환경 변수를 출력하는 명령어
export : 특정 변수의 범위를 환경 변수의 데이터 공간으로 전송하여 자식 프로세스에서도 특정 변수를 사용 가능하게 한다. 전역 변수의 개념
unset : 선언된 변수를 제거한다.
쉘 이스케이프 문자
\f : 앞 문자열만큼 열을 밀어서 이동
: 앞 문자열만큼 열을 밀어서 이동
: 새로운 줄로 바꾼다
: 새로운 줄로 바꾼다 \r : 앞 문자열의 앞부분부터 뒷문자열 만큼 대체하고 반환한다.
: 앞 문자열의 앞부분부터 뒷문자열 만큼 대체하고 반환한다. \t : 탭 만큼 띄운다.
쉘 산술 연산
쉘 스크립트의 변수 산술연산은 다른 언어의 비해 간단치 않다 .
앞서 말했듯이 Bash 변수는 본질적으로 문자열이라 별도의 특수한 문법을 사용해 연산을 해야 한다.
그러면 Bash가 알아서 형변환 하여 정수 연산이나 변수를 비교해 준다.
Bash에서는 계산을 처리할 수 있는 다음 3가지 문법을 제공한다.
expr let $(( ))
expr 연산자
expr는 역따옴표 를 반드시 감싸준다. 역따옴표 대신 $(( )) 해줘도 동작은 한다.
를 반드시 감싸준다. 역따옴표 대신 $(( )) 해줘도 동작은 한다. expr을 사용할 때 피연산자와 연산자 사이에 공백 이 필요하다.
이 필요하다. 산술 연산할때 우선순위를 지정하기위해 괄호를 사용하려면 \처리 를 해줘야 한다.
를 해줘야 한다. 곱셈 문자 *는 \처리 를 해주어야 한다.
#!/bin/bash number1=10 number2=20 plus=`expr $number1 + $number2` minus=`expr $number1 – $number2` mul=`expr $number1 \* $number2` # 곱셈에는 \* 를 이용한다. div=`expr $number1 / $number2` rem=`expr $number1 % $number2` echo “plus: ${plus}” echo “minus: ${minus}” echo “mul: ${mul}” echo “div: ${div}” echo “rem: ${rem}”
$ ./script.sh plus: 30 minus: -10 mul: 200 div: 0 rem: 10
# 우선순위 산술 연산을 할때는 괄호를 문자 처리해야 한다. # 연산자 *와 괄호() 앞에는 역슬래시와 같이 사용 num=`expr \( 3 \* 5 \) / 4 + 7` echo $num
let 연산자
num1=42 num2=9 let re=num1+num2 #Add echo “add:$re” let re=num1-num2 #Sub echo “sub:$re” let re=num1*num2 #Mul echo “mul:$re” let re=num1/num2 #Div echo “div:$re” let re=num1%num2 #Mod echo “mod:$re”
$ ./script.sh add:51 sub:33 mul:378 div:4 mod:6
$(( )) 연산자
num1=42 num2=9 echo add:$((num1+num2)) echo sub:$((num1-num2)) echo mul:$((num1*num2)) echo div:$((num1/num2)) echo mod:$((num1%num2))
$ ./script.sh add:51 sub:33 mul:378 div:4 mod:6
쉘 주석
쉘스크립트를 작성할때 한 줄은 쉽게 ‘#’를 통해 주석이 가능하지만,
블록을 주석하기 위해서는 완전히 다른 문법을 사용해야 한다.
:<<"END" 이 구간부터 주석이 시작되는 블록이고, END 로 주석이 끝나는 블록을 명시해 주면 된다. echo "여기는 출력된다." #echo " 여기는 주석처리" <코드라인> : << "END" #주석 시작 echo "여기서부터 " echo "test_01" echo "test_02" echo "test_03" echo "test_04" echo "test_05" echo "test_06" echo "test_07" echo "여기까지 주석처리 됨" END #주석 끝 echo "여기는 주석이 안되어 있어 출력 " vi 에디터로 여러줄 주석 방법 기본 여러줄 주석 문법이 별로라면, vi 단축키를 이용한 주석 처리 방법이 있다. vi 편집기를 열고 ctrl + v를 눌러 비주얼 모드로 진입한다. (비주얼 모드는 vim 이 설치 되어 있어야 한다.) 주석을 처리하고자 하는 라인까지 방향키 또는 vi방향키를 이용하여 이동한다. shift + i 누르고 #을 입력한다. esc 키를 여러번 누른다. 주석 처리 됨을 확인한다. 쉘 조건문 if 문 배쉬의 if문의 특이한 점은 fi 와 대괄호[ ] 이다. 여타 언어와 달리 중괄호를 안쓰기 떄문에 fi로 if문의 끝 을 알려주어야 하며, 주의해야할 점은 if문 뒤에 나오는 대괄호 [ ] 와 조건식 사이에는 반드시 공백이 존재 해야 한다. if [ 값1 조건식 값2 ] then 수행1 else 수행2 fi # 가독성 좋기 위해 then을 if [] 와 붙여쓰려면 반드시 세미콜론 ; 을 써야한다. if [ 값1 조건식 값2 ]; then 수행1 else 수행2 fi 비교 연산 문자1 = 문자2 # 문자1 과 문자2가 일치 (sql같이 = 하나만 써도 일치로 인식) 문자1 == 문자2 # 문자1 과 문자2가 일치 문자1 != 문자2 # 문자1 과 문자2가 일치하지 않음 -z 문자 # 문자가 null 이면 참 -n 문자 # 문자가 null 이 아니면 참 문자 == 패턴 # 문자열이 패턴과 일치 문자 != 패턴 # 문자열이 패턴과 일치하지 않음 값1 -eq 값2 # 값이 같음(equal) 값1 -ne 값2 # 값이 같지 않음(not equal) 값1 -lt 값2 # 값1이 값2보다 작음(less than) 값1 -le 값2 # 값1이 값2보다 작거나 같음(less or equal) 값1 -gt 값2 # 값1이 값2보다 큼(greater than) 값1 -ge 값2 # 값1이 값2보다 크거나 같음(greater or equal) if [ ${a} -eq ${b} ]; then echo "a와 b는 같다." fi if [ ${a} -ne ${b} ]; then echo "a와 b는 같지 않다." fi if [ ${a} -gt ${b} ]; then echo "a가 b보다 크다." fi if [ ${a} -ge ${b} ]; then echo "a가 b보다 크거나 같다." fi if [ ${a} -lt ${b} ]; then echo "a가 b보다 작다." fi if [ ${a} -le ${b} ]; then echo "a가 b보다 작거나 같다." fi # 한줄로 작성 if [ ${num1} -lt ${num2} ]; then echo "yes"; fi num1=35 num2=48 # 이중 소괄호를 쓰면 조건문을 문자 대신 기호로 표현 가능하다. 단, 소괄호 안에 따옴표 쓰면 안된다. if (( ${num1} < ${num2} )); then echo "yes" fi if (( ($num1 * $num2) - $num2 > 200 )); then echo “>200” else echo “<200" fi 이중 괄호 (( expression )) expression 에는 수식이나 비교 표현식이 들어갈 수 있다. ! 논리 부정 ~ 비트 부정 ** 지수화 << 비트 왼쪽 쉬프트 >> 비트 오른쪽 쉬프트
& 비트 단위AND
| 비트 단위 OR
&& 논리 AND
|| 논리 OR
num++ 후위증가
num– 후위감소++
num 전위증가
–num 전위감소
파일 검사
if [ -d ${변수} ]; then # ${변수}의 디렉토리가 존재하면 참 if [ ! -d ${변수} ]; then # ${변수}의 디렉토리가 존재하지 않으면 참 if [ -e ${변수} ]; then # ${변수}라는 파일이 존재하면 참 if [ ! -e ${변수} ]; then # ${변수}라는 파일이 존재하지 않으면 참 if [ -r ${변수} ]; then # 파일을 읽을 수 있으면 참 if [ -w ${변수} ]; then # 파일을 쓸 수 있으면 참 if [ -x ${변수} ]; then # 파일을 실행할 수 있으면 참 if [ -s ${변수} ]; then # 파일의 크기가 0보다 크면 참 if [ -L ${변수} ]; then # 파일이 symbolic link이면 참 if [ -S ${변수} ]; then # 파일 타입이 소켓이면 참 if [ -f ${변수} ]; then # 파일이 정규 파일이면 참 if [ -c ${변수} ]; then # 파일이 문자 장치이면 참 if [ ${변수1} -nt ${변수2}]; then # 변수1의 파일이 변수2의 파일보다 최신 파일이면 참 if [ ${변수1} -ot ${변수2}]; then # 변수1의 파일이 변수2의 파일보다 최신이 아니면 참 if [ ${변수1} -ef ${변수2}]; then # 변수1의 파일과 변수2의 파일이 동일하면 참
논리 연산
조건1 -a 조건2 # AND 조건1 -o 조건2 # OR 조건1 && 조건2 # 양쪽 다 성립 조건1 || 조건2 # 한쪽 또는 양쪽다 성립 !조건 # 조건이 성립하지 않음 true # 조건이 언제나 성립 false # 조건이 언제나 성립하지 않음
if [ -f ${file1} -a -f ${file2} ]; then echo ‘file1과 file2는 모두 파일입니다.’ else echo ‘file1과 file2가 모두 파일인 것은 아닙니다.’ fi if [ -f ${a} -a -d ${b} ]; then echo “a는 파일이고 b는 디렉토리” fi
VALUE=10 if [ ${VALUE} -gt 5 -a ${VALUE} -lt 15 ] ; then echo “VALUE is greater than 5 and less than 15!” fi # 둘이 같은 문장이다. if [ ${VALUE} -gt 5 ] && [ ${VALUE} -lt 15 ] ; then echo “VALUE is greater than 5 and less than 15!” fi # 대괄호 두개를 써서 표현할 수 도 있다. if [[ ${VALUE} -gt 5 && ${VALUE} -lt 15 ]] ; then echo “VALUE is greater than 5 and less than 15!” fi
# AND if [ ${string1} == ${string2} ] && [ ${string3} == ${string4} ] ; then # OR if [ ${string1} == ${string2} ] || [ ${string3} == ${string4} ]; then # 다중 조건 if [[ ${string1} == ${string2} || ${string3} == ${string4} ]] && [ ${string5} == ${string6} ]; then
이중 대괄호
[[ “1.8.3” == 1.7.* ]]&&, ||, = ~ * (정규식 매칭) 과 같은 확장 expression test 기능을 대괄호 내에 사용할 수 있게 한다.
그냥 대괄호의 개선버젼 정도로 생각하면 된다.
if elif else 문
#!/bin/bash num1=”10″ num2=”10″ if [ ${num1} -lt ${num2} ]; then # “-lt”, A가 B보다 작으면 True echo “yes” elif [ ${num1} -eq ${num2} ]; then # “-eq”, A와 B가 서로 같으면 True echo “bbb” else echo “no” fi # 이중 소괄호를 쓰면 논리연산자 기호 사용 가능 if (( ${num1} < ${num2} )); then echo "yes" elif (( ${num1} == ${num2} )); then echo "bbb" else echo "no" fi # 한줄 작성 if [ ${num1} -lt ${num2} ]; then echo "yes"; elif [ ${num1} -eq ${num2} ]; then echo "bbb"; else echo "no"; fi $ ./script.sh bbb bbb bbb bbb case 문 C언어의 switch case 문법이라고 보면 된다. 대신, 리눅스 Bash의 switch문 특징이라면 각 case의 끝을 보면 세미콜론 2개로 종료 한다. 거기다 case문 만의 강력한 특징이 있는데 바로 패턴을 사용할 수 있다는 점이다. case 문자열 in 경우1) 명령 명령 명령 ;; 경우2) 명령 명령 명령 ;; * ) 명령 명령 명령 ;; esac case ${var} in "linux") echo "리눅스" ;; # 변수var값이 linux라면 실행 "unix") echo "유닉스" ;; "windows") echo "윈도우즈" ;; "MacOS") echo "맥OS" ;; *) echo "머야" ;; # default 부분 esac COUNTRY=korea case $COUNTRY in "korea"|"japan"|"china") # or 연산도 가능하다 echo "$COUNTRY is Asia" ;; "USA"|"Canada"|"Mexico") echo "$COUNTRY is Ameria" ;; * ) echo "I don't know where is $COUNTRY" ;; esac date=210610 # 21년 6월 10일 case $date in # ? 는 임의의 한문자 ??03?? | ??04?? | ??05??) echo 봄이구나~! ;; # 3월이거나 4월이거나 5월일 때 ??06?? | ??07?? | ??08??) echo 여름이구나~! ;; ??09?? | ??10?? | ??11??) echo 가을이구나~! ;; ??12?? | ??01?? | ??02??) echo 겨울이구나~! ;; *) echo 아 일하기 싫다 ;; esac str="abc" case $str in a*) # a이후 임의의 어떠한 문자라도 오면 일치 (0개~여러개) echo "$str starts with a" ;; a?) # a이후 반드시 임의의 하나의 문자가 오면 일치 echo "$str starts with a and has two words" ;; a[bc]) # a이후 b나 c가 오면 일치 echo "$str starts with a and then followed by b or c " ;; * ) # default echo "I don't know where is $COUNTRY" ;; esac 쉘 반복문 for 문 #!/bin/bash # 초기값; 조건값; 증가값을 사용한 정통적인 for문 for ((i=1; i<=4; i++)); do echo $i done 반복문을 빠져 나갈때 : break 현재 반복문이나 조건을 건너 뛸때 : continue for in 문 #!/bin/bash # 루프 돌 데이터에 띄어쓰기가 있으면 각각 돌음 for x in 1 2 3 4 5 do echo "${x}" done # 변수를 사용한 반복문 data="1 2 3 4 5" for x in $data do echo ${x} done # 배열을 사용한 반복문 arr=(1 2 3 4 5) for i in "${arr[@]}" # arr[@] : 배열 전체 출력 do echo "${i}" done # sequence를 통한 for문. seq라는 프로세스가 순서대로 숫자를 출력해 주는 역할을 bash에 사용한 것이다. for num in `seq 1 5` do echo $num done # range를 사용한 반복문. {..} 중괄호와 점 두개를 쓰면 range처리가 된다. for x in {1..5} do echo ${x} done # 파일 리스트 출력 for line in `ls` # 역따옴표 써서 ls를 문자가 아닌 하나의 명령어로 실행 do echo $line # 해당 위치에 파일이나 디렉토리들이 출력 done # 한줄 문법 (한줄로 쓰면 터미널에서 직접 스크립트를 실행 할 수 있다) for line in `ls`; do echo $line; done 세미콜론 ; 은 원래 엔터하고 작성했던걸 한줄로 작성할 수 있게 해주는 것으로 이해해도 된다. 세미콜론은 명령과 명령을 연결해주는 역할을 한다. for var in $* do echo $var done -------------------------------------------------- # 쉘 인자를 통한 출력 $ ./test.sh 1 2 3 4 5 1 2 3 4 5 while 문 count=0 while [ ${count} -le 5 ]; do echo ${count} count=$(( ${count}+1 )) done count=0 while (( ${count} <= 5 )); # 이중괄호 사용하면 논리기호 사용 가능 do echo ${count} count=$(( ${count}+1 )) done $ ./script.sh 0 1 2 3 4 5 unitil 문 수행 조건이 false 일때 실행되는 루프문이다. 한다미로 while의 반대버젼이라고 보면 된다. (while은 조건이 true 면 루프) count2=10 until [ ${count2} -le 5 ]; do echo ${count2} count2=$(( ${count2}-1 )) done $ ./script.sh 10 9 8 7 6 쉘 배열문 배열 생성 / 추가 #!/bin/bash # 배열의 크기 지정없이 배열 변수 선언 # 굳이 'declare -a' 명령으로 선언하지 않아도 바로 배열 변수 사용 가능함 declare -a array arr=("test1" "test2" "test3") # 배열 선언 및 지정 echo ${arr[0]} # test1 # 기존 배열에 1개의 배열 값 추가 3가지 방법 arr[3]="test4" arr+=("test5") arr[${#arr[@]}]="test6" # 배열 길이를 인덱스로 사용해 push echo ${arr[@]} # arr의 모든 데이터 출력 echo ${arr[*]} # arr의 모든 데이터 출력 echo ${#arr[@]} # arr 배열 길이 출력 echo ${arr[@]:2:3} # 2부터 3개의 요소 $ ./script.sh test1 test1 test2 test3 test4 test5 test6 test1 test2 test3 test4 test5 test6 6 test3 test4 test5 리눅스 쉘은 1차원 배열만 지원한다. 배열 원소 삭제 / 를 사용해 해당 문자열 부분이 있으면 삭제 할 수 있다. 를 사용해 해당 문자열 부분이 있으면 삭제 할 수 있다. 다만 unset 을 이용해 삭제를 권고 하는 편이다. arr=(1 2 3) remove_element=(3) arr=( "${arr[@]/$remove_element}" ) # 배열 1 2 3 에서 / 3을 없앰 echo ${arr[@]} # > 1 2
arr=(“abc” “def” “defghi”) unset arr[1] # 배열 특정 인덱스 요소 삭제 echo ${arr[@]} > # abc defghi unset array # 배열 전체 지우기
연관배열 (MAP)
key와 value 타입으로 저장된 배열을 말한다.
프로그래밍 고급언어에서 자주 등장하는 자료형 타입인데,
PHP의 연관배열, 파이썬의 딕셔너리, 자바스크립트의 MAP 자료형 이라고 봐도 된다.
# 연관배열 생성 declare -A map=([hello]=’world’ [long]=’long long long string’ [what is it]=123) declare -p map # 연관배열 정보 출력 # > declare -A map=([long]=”long long long string” [“what is it”]=”123″ [hello]=”world” ) echo “map[hello]=${map[hello]}” # > map[hello]=world key=hello # 변수를 인덱스로 넣어줘도 된다. (MAP의 특성) echo “map[key]=${map[${key}]}” # > map[key]=world
# 연관배열 value 값 모두 출력 (MAP은 순서를 보장하지않는다) echo “all=${map[@]}” # > long long long string 123 world # 연관배열 key 인덱스 모두 출력 (MAP은 순서를 보장하지않는다) echo “keys=${!map[@]}” # > long what is it hello # 연관배열 길이 출력 echo “length=${#map[@]}” # > length=3
# 원소 추가 map+=([key1]=value) map+=([key2]=value2 [key3]=value3) map+=([‘long key’]=’long long long value’) map[‘like a C++’]=’value!!!!!’ # 원소 삭제 (키로 삭제) unset ‘map[intput1]’
# 루프1: 순차적으로 접근 for i in “${map[@]}”; do echo “${i}” done # long long long string # 123 # world # 루프2: 키로 접근 for key in “${!map[@]}”; do echo “map[${key}]=${map[${key}]}” done # map[long]=long long long string # map[what is it]=123 # map[hello]=world
쉘 인풋값 입력받기
C언어의 scanf() 같이 터미널에서 사용자로부터 인자를 입력 받아 변수로 사용할 수 있다.
echo -n “String input : ” read [변수명] # <- 터미널에서 입력된 인풋값이 변수에 저장되게 된다. echo "user input : $변수명 # 입력된 값 출력 쉘 함수(Function) 다른 프로그래밍 언어와 달리 쉘 스크립트에서는 함수명 앞 function은 써주지 않아도 알아서 인식된다. 또한, 함수를 호출할때는 괄호를 써주지 않고 호출해야한다는 점이 다르다. 그리고 함수 호출 코드는 함수 코드보다 반드시 뒤에 있어야 된다. 함수 코드 보다 앞에서 호출 시 오류가 발생하기 때문이다. #!/bin/bash func(){ echo "func()" } function string_test() { echo "string test" echo "인자값: ${@}" } #함수 호출 func # 함수에 인자값 전달하기(공백의로 뛰어서 2개의 인자값을 넘김) string_test "hello" "world" $ ./script.sh func() string test 인자값: hello world 함수 아규먼트 함수에 인자를 전달하는 방법은 함수를 호출하면서 공백으로 구분하여 이후 인자들을 하나씩 넣어주면 된다. 이렇게 넣어준 인자들은 함수 내부에서 다양한 방식으로 사용할 수 있는데, 대표적으로는 $1, $2처럼 인자가 들어온 순서대로 입력을 받아 사용하게 된다. function test3() { param1=$1 param2=$2 echo $param1 # a echo $param2 # b echo $@ # 파라미터 전체 출력 } test3 "a" "b" 명령어 종료 상태 코드 종료 코드란, exit 명령으로 프로그램을 종료시키면서 사용자에게 프로그램 종료의 이유 를 알리기 위하여 반환하는 값이다. 쉘 스크립트 내에서 exit 명령어가 실행되면 스크립트가 종료되며 부모 프로세스에 종료 상태를 전달할 수 있는데 이 값은 프로그램 내에서 임의로 지정할 수도 있다. #!/bin/bash exit 16 # 강제 종료 echo "wtf" # 실행안됨 종료 상태는 리턴값(return value, return status)이라고 부르기도 하는데, 이전에 수행했던 명령어나 프로그램이 종료 될 때 넘겨주는 값을 의미하기도 하다. 종료 상태 또는 반환값이 중요한 이유는 쉘 스크립트를 작성하는데 있어서 특정 명령어의 성공 여부에 따라 분기 해야 하는 경우 이전 명령어가 정상적으로 수행되었는지 아는 것이 필수적이기 때문이다. 예를 들어 여타 프로그래밍 고급언어에선, If 문에서 참/거짓을 판단할 때 0이 거짓이고 그 외 값은 참으로 인정하는데, 특이하게 Bash shell 에서는 반대로 생각해야 된다. 즉, 0 : 프로그램의 정상종료 , 그 외의 숫자 : 오류 인 셈이다. 이러한 특징을 이용해서, 만일 명령어가 성공할경우 종료 상태 코드를 얻어서 if문에서 -eq 0을 통해 검사해서 분기문을 구축할 수 있게 된다. 종료 상태 값은 위에서 배운 $? 으로 확인할 수 있다. $ date -@ # 인수를 잘못 사용하여 일부러 명령어 오류발생 시킴 -> 종료 상태 코드 1 반환 date: invalid option — ‘@’ Try ‘date –help’ for more information. $ echo $? # 0 이 아닌 종료 상태 값은 모두 거짓에 해당 1 $ date +%Y # 정상적인 명령어 실행 -> 종료 상태 코드 0 반환 2015 $ echo $? # 정상종료 됐으므로 0 을 리턴. 참 0
#!/usr/bin/bash $ date -@ # 명령어 실패 -> $? 에 상태 코드 1이 들어감 # $?(상태 코드)를 조건문에서 검사함. 만일 성공 코드(0) 일경우 실행 if [ $? -eq 0 ]; then ls -asl # 위의 분기문에 걸러져서 이 명령은 실행이 안됨 fi
shell command 실행
$() : command substitution 이라고 한다. 괄호 안에 쓰여진 문자를 명령어로 인식하여 실행하고 결과값을 반환해준다. 즉 명령어를 수행하고, output을 $() 안에 넣어준다.
그리고 위에서 expert 할때 배웠던 백틱(역따옴표)도, expert뿐만 아니라 명령문을 그대로 써주면 $()와 같이 쉘 명령어로 인식해서 명령어 결과를 반환해 준다.
#!/bin/bash # 그냥 date 문자열 출력 echo date # 백틱으로 감싸주면 date 명령어가 실행되게 된다. echo `date` # $()도 마찬가지 echo $(date) # shell execution echo “I’m in `pwd`” echo “I’m in $(pwd)”
$ bash test.sh date 2021년 4월 10일 토요일 04시 10분 28초 KST 2021년 4월 10일 토요일 04시 10분 28초 KST I’m in /src/shell I’m in /src/shell
문자열 패턴 비교
패턴 비교는 일종의 문자열을 연산하는 것으로 특정한 pattern을 놓고 변수의 문자열 값이 일부분이라도 이 패턴과 일치 하는지 검사할 때 쓰인다.
이 패턴에는 와일드카드 문자 ( *, ?, [ ] 를 포함한 문자 세트)를 포함해도 된다.
${#var} 변수 var가 가지는 문자열의 길이를 구한다. ${var:-word} 1. 변수 var의 값이 null이 아니면 : var의 값을 반환, var의 값은 변하지 않는다.
2. 변수 var의 값이 null이면 : word의 값을 반환, var의 값은 변하지 않는다. ${var:=word} 1. 변수 var의 값이 null이 아니면 : var의 값을 반환, var의 값은 변하지 않는다.
2. 변수 var의 값이 null이면 : word의 값을 반환, var의 값은 word의 값으로 대체된다. ${var:+word} 1. 변수 var의 값이 null이 아니면 : word의 값을 반환, var의 값은 변하지 않는다.
2. 변수 var의 값이 null이면 : null을 반환, var의 값은 변하지 않는다. ${var:?word} 1. 변수 var의 값이 null이 아니면 : var의 값을 반환, var의 값은 변하지 않는다.
2. 변수 var의 값이 null이면 : null이면 에러 메시지인 word를 출력하고, 쉘 스크립트를 종료한다.
2번 째 경우이고 word가 생략되었다면 “parameter null or not set” 라는 메시지를 출력하고 쉘 스크립트를 종료한다.
${var%pattern} 끝에서 부터 word와 패턴이 일치하는 var의 최소 부분(첫번째 일치)을 제거하고 나머지를 반환한다. ${var%%pattern} 끝에서 부터 word와 패턴이 일치하는 var의 최대 부분(마지막 일치)을 제거하고 나머지를 반환한다. ${var#pattern} 처음 부터 word와 패턴이 일치하는 var의 최소 부분(첫 번째 일치)을 제거하고 나머지 부분을 반환한다. ${var##pattern} 처음 부터 word와 패턴이 일치하는 var의 최대 부분(마지막 일
#!/bin/bash # var not exists unset var1 echo ${var1:-string2} # var exists var1=string1 echo ${var1:-string2} var1=/var/log/apt echo ${var1#*/} echo ${var1##*/} var2=/var/log/apt/log/ifconfig.cfg echo ${var2%log*} echo ${var2%%log*}
$ ./script.sh string2 string1 var/log/apt apt /var/log/apt/ /var/
BASH 쉘 스크립트 연습문제 코드
구구단 출력
#!/usr/bin/bash for i in {2..9}; do # 2에서 9까지 레인지 리스트를 순회 for j in {1..9}; do # 1에서 9까지 레인지 리스트를 순회 echo “$i * $j = $((i*j))” # $(( )) 는 괄호안의 문자를 산술 처리 해준다. done done
현재 디렉토리에 있는 txt파일들 실행권한 다 주기
터미널에서 일일히 해도 되지만, 스크립트로 한방에 해보자.
#!/sur/bin/bash for file in `ls *.txt` # 역따옴표“로 묶어 ls를 문자가 아닌 쉘명령어로 인식하여, txt파일 목록들을 얻어 순회 do chmod +x $file # 각 파일마다 실행권한 추가 echo “${file}실행권한 추가 완료” done
인수로 받은 파일 디렉토리와 파일 이름 출력
터미널에서 인수를 받으면 인수에 맞는 디렉토리와 파일명을 출력
#!/bin/bash # $()는 백틱과 같이 안의 인수를 명령어 실행 처리 # 터미널에서 받은 인수 $0을 dirname하여 디렉토리명을 얻고 cd 이동하고 pwd로 절대경로값을 변수에 저장 scriptFolder=$(cd $(dirname “$0”) && pwd) # 절대경로값을 인수로 하여 basename 파일명을 변수에 저장 scriptName=$(basename $scriptFolder) echo “scriptFolder: $scriptFolder” echo “scriptName: $scriptName”
$ bash test.sh scriptFolder: /Users/src/shell scriptName: test.sh
마지막 작업의 종료 상태 확인
rm 명령어의 성공/실패 여부에 따라 결과동작을 종료코드 변수 $? 와 분기문을 통해 구현이 가능하다.
정말 많이 사용하는 패턴이니 꼭 익히자.
위에서 명령어 종료 상태 코드 섹션에서 해당 원리에 대해 설명했다. 모르면 다시 올려보자.
#!/bin/bash # 파일 경로를 변수에 저장 fileToRemove=”/tmp/some-file” # 파일 삭제 시도. 만일 오류가 나면 오류 재지정으로 보내서 오류 출력되지 않게 처리 rm “$fileToRemove” 2> /dev/null # 파일 삭제 성공(0) 실패(1) 여부를 따져 분기문 처리 if [ $? -eq 0 ]; then echo “Success removing file: $fileToRemove” else echo “File does not exist: $fileToRemove” fi
<만일 /tmp/some-file 이라는 경로 파일이 존재하지 않을 경우> $ bash test.sh File does not exist: /tmp/some-file
프로그램의 실행시간 측정
아래의 프로그램은 인자로 주어진 명령을 실행하고 걸린시간을 나노초 단위로 측정한다.
#!/bin/bash # 만일 사용자가 인자를 주지 않았을 경우.. ($#는 인자의 모든 갯수) if [ $# -eq 0 ]; then echo “Input the filename, please…” exit 0 # 스크립트 종료 fit Command=$1 # 인자를 변수에 저장 echo $Command time1=`date +%s.%N` # 현재 시간 구함. $1 # 인자를 명령어로서 실행 time2=`date +%s.%N` # %s : 타임스탬프 구하기. %N : 나노초로 포맷 diff=`echo “$time2 – $time1” | bc` # 실수 연산을 하려면 bc 명령어를 활용한다 echo “=======================================” echo “걸린시간 : $diff”
로그 파일 정리하기
로그 파일 중에 2일 이상 지난 파일들은 압축을 해서 보관해라
압축된 로그 파일 중에 3일 이상 경과한 것들은 삭제해라
#!/bin/bash LOGDIR=/var/log # 디렉토리 변수 선언 GZIPDAY=1 DELDAY=2 cd $LOGDIR # 로그가 저장되어있는 디렉토리로 이동 echo “cd $LOGDIR” # 일반파일 타입이고 파일명이 log, log.1 … 로 끝나고 -mtime +1(수정된지 2일 지난) 파일들 검색하여 gzip 압축한다. # 2> 단 중간에 오류나도 코드가 죽지않고 오류 리다이렉션을 통해 넘기고 진행 (try.. catch 개념) sudo find . -type f -name ‘*log.?’ -mtime +$GZIPDAY -exec bash -c “gzip {}” \; 2> # 일반파일 타입이고 파일확장자가 .gz이고, -mtime +2(수정된지 3일 지난) 파일들 검색하여 삭제한다. sudo find . -type f -name ‘*.gz’ -mtime +$DELDAY -exec bash -c “rm -f {}” \; 2>
cd 명령은 종료 상태 값을 확인해야 한다
아래와 같이 없는 디렉터리에 접근하려다가 실패할 경우 현재 디렉터리에 있는 모든 파일들을 날려버릴 수 있다.
#!/bin/bash cd ~/tempdir # 디렉토리 이동 rm -rf * # 원래대로라면 tempdir에 있는 모든 파일을 지우는 것이겠지만, # 만일 cd가 실패했을 경우 엉뚱한 디렉토리 파일을 다 날릴 수 있다.
따라서 반드시 cd 명령의 성공 여부를 체크 해야 한다.
#!/bin/bash # and 연산자를 써서 앞의 명령어가 성공해야 뒤의 명령어가 실행되도록 cd ~/tempdir && rm -rf * # 앞의 명령어가 실패하면, 뒤의 명령어를 실행해서 에러메세지를 출력하고 exit 1 종료한다. # >&2는 모든 출력을 강제로 쉘 스크립트의 표준 에러로 출력한다. cd ~/tempdir || { echo >&2 “cd ~/tempdir failed”; exit 1 ;}
자동 백업하기
#!/bin/bash # -z는 null 검사 if [ -z $1 ] || [ -z $2 ]; then echo usage : $0 sourcedir targetidir # 만일 터미널에서 인수 2개를 안써줬을 경우 사용 설명서 출력 else SRCDIR=$1 # 인자를 변수에 넣음 DSTDIR=$2 BACKUPFILE=backup.$(date +%y%m%d%H%M%S).tar.gz # 파일명 형식을 backup.날짜.tar.gz 로 설정 if [ -d $DSTDIR ]; then # 만일 해당 디렉토리가 존재하면 tar -cvzf $DSTDIR/$BACKUPFILE $SRCDIR # 해당 디렉토리에 파일 압축 실행 else # 존재하지 않는다면 mkdir $DSTDIR # 디렉토리 만들고 tar -cvzf $DSTDIR/$BACKUPFILE $SRCDIR # 해당 디렉토리에 파일 압축 실행 fi fi
< 쉘 스크립트를 실행해서 backupdir/ 디렉토리에 logfile 파일을 아카이빙 압축해서 보관 > < 파일명 형식은 backup.현재날짜.tar.gz > $ bash script.sh logfile backupdir
쉘 스크립트 난수 생성 (랜덤 숫자)
#!/bin/bash # 0부터 9까지의 랜덤 숫자 생성 random_num=”$(($RANDOM % 10))” echo $random_num # 1부터 10까지의 랜덤 숫자 생성 random_num=”$(($RANDOM % 10+1))” echo $random_num # 100부터 110까지의 랜덤 숫자 생성 random_num=”$(($RANDOM % 11+100))” echo $random_num # 200부터 300까지의 랜덤 숫자 생성 random_num=”$(($RANDOM % 101+200))” echo $random_num
데이터를 솎아내서 백업하기
ls -al 의 결과에서 ‘합계’ 와 상대경로 ., .. 을 제외하고 나머지를 파일명과 파일사이즈만 출력하고 그 결과를 파일에 저장
#!/bin/bash PRE_IFS=$IFS # IFS 백업 IFS=” ” # IFS를 개행으로 변환 TOT=0 # 파일용량 합계 변수 cd /home/inpa # 정해진 위치에서 FileName=”result.txt” touch $FileName # 결과를 저장할 빈 파일 생성 echo “———————————————” for i in `ls -al /`; do # ls 한 결과 내용를 루프 S=`echo $i | awk ‘{print $5}’` # 한 행(레코드)의 5번째 필드(파일사이즈) 저장 F=`echo $i | awk ‘{print $9}’` # 한 행(레코드)의 9번째 필드(파일명) 저장 # 만일 상대경로나 빈칸이면 continue if [[ ${F} == “.” || ${F} == “..” || ${F} == “” ]]; then continue fi #TOT=$(( ${TOT} += ${S} )) 이 수식은 실행되지 않는다. 왜냐하면 awk한 결과는 문자열로 저장되기 떄문에 $(()) 산술연산이 안되기 때문 TOT=`expr $TOT + $S` # expr는 자식프로세스로 터미널에서 실행한 결과이기 때문에 상관없음 echo “$S $F” >> $FileName # 출력 결과를 파일로 리다이렉션 이어쓰기 done echo $TOT # 파일사이즈 합계 출력 IFS=$PRE_IFS # IFS 롤백
Reference
https://blog.gaerae.com/2015/01/bash-hello-world.html
https://blog.d0ngd0nge.xyz/shell-script/
So you have finished reading the 리눅스 스크립트 topic article, if you find this article useful, please share it. Thank you very much. See more: 쉘 스크립트, 쉘스크립트 짜기, 쉘 스크립트 문법, 리눅스 쉘 스크립트 예제, 리눅스 스크립트 명령어, 쉘 스크립트 명령어 실행, 쉘 스크립트 기초, 쉘 스크립트 의미