일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- html
- 리버싱 문제
- 넘파이
- 인공지능
- webhacking
- 머신러닝
- 웹해킹
- abex crackme
- 알고리즘
- sql injection
- MySQL
- 컴퓨터 구조
- 리버싱 워게임
- 해킹
- 백준
- 백준 알고리즘
- C언어
- 자바스크립트
- 어셈블리어
- 웹
- 회귀 수식
- 워게임
- 리버싱
- webhacking.kr
- php
- 리액트
- writeup
- 리눅스
- CodeEngn
- 보안
- Today
- Total
인공지능 개발일지
[쉘 스크립트] Bash scripting Tutorial 1-29 풀이 본문
안녕하세요.
이번 시간에는 쉘 스크립트 예제를 풀어 봤습니다.
https://linuxconfig.org/bash-scripting-tutorial#h1-hello-world-bash-shell-script
풀이는 아래와 같습니다.
1.Hello World Bash Shell Script
1)코드
2)코드 설명
STRING이라는 변수에 “Hello World”라는 문자열을 출력
하는 것이다.C언어에 출력 함수 printf가 있듯이 쉘 스크립트에서는
Echo라는 출력함수를 통해 변수를 출력할 수 있다.
3)실행 결과
2.Simple Backup Bash Shell Script
1)코드
2)코드 설명
이거는 굳이 gedit 로 안 하고 바로 터미널에서
사용해도 되는 리눅스 명령어 tar을 사용한
예제입니다.
보통 윈도우에서는 파일 여러 개를 묶고 압축하는 것을
한 번에 하는데 리눅스에서는
여러 개를 묶고(tar) 압축하는(zip) 기능이
분리되어 있습니다.
그런데 tar 명령어 옵션 중에 압축하는
기능도 포함한 옵션 -czf를 사용하여 파일을 묶고
압축하는 코드입니다.
따라서 bash 쉘을 “myhome_directory.tar.gz”라는 파일명으로 압축하여 저장한 것이다.
그래서 위 코드의 기능은 bash 쉘을 압축하여 저장함으로서 백업한 것이다.
3)실행 결과
3.Gloval vs Local variables
1)코드
2)코드 설명
위 코드는 지역변수와 전역변수의 차이를 알아보는 예제로 지역변수와 전역변수 둘 다 VAR이라는 “같은”변수 명으로 선언하고 출력했다.
여기서 지역변수는 함수 안에서만 작용한다는 사실을 이해하면 된다.
따라서 함수 밖의 처음 echo에서는 전역변수 “global~”이 출력되고
다음 bash함수를 호출했을 때는 함수 안에서만 작용하는 “local~”이 출력되고
마지막 echo에서는 다시 전역변수가 출력됨을 알 수 있다.
3)실행 결과
4.Declare simple bash array
1)코드
2)코드 설명
위 코드를 이해하기 위해서 배열과 따옴표의 역할을 짚고 넘어갈 필요가 있다.
쉘 스크립트에서 배열은 c언어랑 다르게 쉼표로 값들을 구분하는게 아닌
공백으로 구분한다. 그리고 작은 따옴표는 변수를 포함하지 않을 때
사용하고 큰 따옴표는 변수를 포함할 때 사용한다.
이를 이해하고 다시 코드를 보면 ARRAY라는 배열에 4개의 값이 할당되어 있다.
그리고 배열의 길이를 계산해주는
${#배열명(@)}을 ELEMENTS에 저장하여 이를
반복문의 횟수로 줌으로서
배열에 저장되어 있는 값을 차례로 출력하는 코드이다.
3)실행 결과
5.Read file into bash array
1)코드
2)코드 설명
위 예제는 파일 입출력을 다룬 예제로 bash_script.sh에서 bash.txt에서 값을 읽어
오는 것이다.파일에서 값을 읽어오려면 읽어올 파일이 존재해야 하므로
bash.txt라는 이름의 파일에 위의 왼쪽과 같이 파일을 만들어준다.
다음으로 bash.script.sh 라는 파일을 만들어서 LINE으로 입력 받았다.
그리고 반복문 안에서 count로 인덱스를 설정해서 ARRAY에 차례로 읽어온 값을 저장한다.
그리고 마지막으로 입력 받은 값들을 echo를 통해 인자의 개수와
bash.txt에서 한 줄씩 읽어온 값들을 공백으로 구분하여
아래와 같이 출력한다.
6.Simple Bash if/else statement
1)코드
2)코드 설명
위 코드는 간단하게 if문을 이용하여 BashScripting 디렉터리가 존재하면
존재한다고 없으면 존재하지 않는다고 출력해주는 예제다.
여기서는 if문에 참 거짓 조건문으로 “$directory”를 주어 존재하는 것을 참인 조건으로
설정해서 fi로 끝낸 것이다.
3)실행 결과
7.Nested if/else
1)코드
2)코드 설명
위 코드는 쉘 스크립트에서 반복문과 조건문을 사용한 예제이다.
먼저 choice 변수를 4로 선언해 주고 read choice 로 값을 입력 받아서
입력 받은 값이 1-3 사이이면 해당하는 값을 출력해주고 자연스럽게 choice=1-3으로
Choice 가 4인동안 반복하는 조건문을 나가서 프로세스를 종료하는데
입력 받은 값이 1-3 사이가 아니면 가장 안쪽의 else 문에서 choice를 4로 초기화시켜
반복문을 계속 돌게 함을 알 수 있다. 따라서 아래와 같이 5를 입력 했을 땐 반복문을 다시 돌고 1-3 사이의 값을 입력 하면 스크립트가 종료된다.
3)실행 결과
8.Arithmetic Comparisons
1)코드
2)코드 설명
8번은 간단하게 if-else문을 두 세트를 쓰며 if문을 이해하는 예제이다.
첫 번째 if문에서 a와 b가 같으면 같다고 다르면 다르다고 출력해주는데
a와 b는 같기 때문에 첫 출력은 같다고 나갈 것이다.
다음 if문도 마찬가지로 c와 d를 비교하여 같은지 다른지 알려준다.
그런데 c와 d는 다르므로 두 번째 출력은 다르다고 나갈 것이고
아래와 같이 확인할 수 있다.
3)실행 결과
9.String Comparisons
1)코드
2)코드 설명
9번은 8번과 비슷하게 값이 같은지 다른지
를 비교하는 예제인데 8번은 숫자이고 9번은 문자열을 비교한다.
따라서 –eq가 아닌 등호를 사용한 것 외에 차이점은 없다.
따라서 같은 문자열은 같고 다른 문자열은
다르다고 출력해준다.
3)실행 결과
10.Bash for loop
1)코드
2)코드 설명
10 번은 쉘 스크립트의 반복문을 이용하였다. 그런데 특이한 점은 ls /var/ 명령을 사용해서 /var 디렉터리에 있는 값을 하나씩 출력하도록 반복문을 사용하였다.따라서 위의 ls /var/
명령을 사용했을 때 나오는 반복문으로 출력하는 코드이다.
3)실행 결과
11.Bash while loop
1)코드
2)코드 설명
위 while문에서는 조건식을 –gt를 사용하여 COUNT가 0보다
클 때까지 반복하는 반복문이다.
따라서 반복문 안에서 COUNT 값을 하나씩 줄여가며 6번 출력한다.
3)실행 결과
12.Bash Until loop
1)코드
2)코드 설명
위 코드에서 COUNT 를 0으로 선언하고 루프 안에서 COUNT를
1씩 증가시킨다. 그런데 until 문은 조건이 거짓일 때 동작하므로 COUNT가 5보다 클 때까지라는 조건이 틀릴 때 즉 COUNT가 5일 때까지 동작하다가 COUNT=5를 출력하고 COUNT가 6이 되었을 때는 조건문이 참이 되므로 루프를 탈출한다.
3)실행 결과
13. Control bash loop with
1)코드
2)코드 설명
먼저 3번째 라인에서 파이프를 이용하여 find 명령의 출력을 while문의 입력으로 주고 있는 것을 확인할 수 있다. Find 명령에서는 현재디렉터리에서 일반 파일을 찾고 이 결과를 while 문으로 file에 저장하여 다음으로는 5번째 라인에서 tr명령을 사용하여 공백을 언더바(_)로 대체 하였다.
3)실행 결과
14. Escaping Meta characters
1)코드
2)코드 설명
위 코드는 따옴표의 역할을 알 수 있다.
일반적으로 echo $변수명 명령(큰 따옴표 생략가능)을 사용시 변수의 값을 출력해주지만 작은 따옴표로 감싸주면 글자 그대로 출력하기 때문에 첫 번째 줄에는 변수의 값이,두 번째 줄에는 글자 그대로 세 번째 줄 또한 글자 그대로 출력된다.
3)실행 결과
15. Single quotes
1)코드
2)코드 설명
위 코드 또한 14번과 마찬가지로 작은 따옴표로 문자열을 감싸주면 $변수명을 사용하여도 그대로 출력함을 보여 주는 예제이다.
따라서 처음 echo $BASH_VAR은 변수의 값을 출력하고 다음 출력문에 “$BASH_VAR”을 통해 큰 따옴표는 변수의 값을 출력하지만
제일 바깥의 따옴표가 작은 따옴표이면 큰 따옴표 또한 문자로 그대로 출력됨을 알 수 있다.
3)실행 결과
16. Double Quotes
1)코드
2)코드 설명
이 문제는 제일 기본적으로 큰 따옴표 안에서 $변수명은 그대로 출력하지만 앞에 역슬래쉬를 붙여주면 문자의 값을 출력해주는 특수 기호를 글자 그대로 출력해줌을 알 수 있는 예제이다.
따라서 3line에서는 변수의 값을 출력하고 4line에서 두 번째 변수 출력문은 앞에 큰 따옴표를 붙여서 큰 따옴표 그대로를 출력하는 코드이다.
3)실행 결과
17. Bash quoting with ANSI-C style
1)코드
2)코드 설명
위 코드는 \n을 사용해서 줄을 바꿔서 출력하는
간단한 예제이다. 따라서 echo하고 \n 앞까지는 첫 번째 문장에 그 뒤는 두 번째 문장에 줄을 바꿔서 출력하는 코드이다.
3)실행 결과
18. Bash Addition Calculator Example
1)코드
2)코드 설명
위 코드는 문자열 연산의 예제로 4line 에서 RESULT2를 정수로 declare해 주고 첫 번째 인자와 두 번째 인자를 뜻하는 $1,$2 를
더해주는 코드이다. 즉 입력된 두 숫자를 더해준다.
3)실행 결과
19. Bash Arithmetics
1코드
2)코드 설명
Let은 새 변수를 만들어 연산하는 것이고 expr은 만들지 않고 연산하는 것이다.
이 중 19번에서는 let명령을 사용하여 연산하였다
위 코드는 크게 세 덩어리로 나눌 수 있다. 첫 번째 덩어리는
간단하게 let명령을 사용하여 지정한 문자를 연산하는 작업을 수행한다.
두 번째 덩어리는 산술 확장 $(())을 이용하여 지정한 숫자를 연산하고 마지막 덩어리에서는
숫자 두 개를 입력 받고 더해준뒤 각각을 2진수 8진수 16진수로 출력해준다.
즉 쉘 스크립트의 연산 방법에 대해 알아보는 예제이다.
3)실행결과
20. Round floating point number
1)코드
2)코드 설명
이 코드는 실수의 소수점을 떼어서 출력하는 예제이다.
먼저 floating_point_number 을 그대로 echo로 출력해준다. 다음으로는
소수 3.3446의 소수점을 %.0f로 떼어서 3이 출력된다.
3)실행 결과
21. Bash floating point calculations
1)코드
2)코드 설명
먼저 유저에게 입력 받은 것을 userinput에 저장한다. 그리고 5line에서 정확도를 scale로
설정한 뒤에 실수를 계산하는 명령어 bc를 이용하여 입력 받은 것에 대한 연산을 해준다.
7line에서는 정확도를 더 높게 설정해서 입력 받은 것을 계산하므로 소수점 이하까지
더 정확하게 계산해준다. 마지막으로 9line에서 scale없이 입력 받은 것을 계산할 때는
몫만 출력해준다.
3)실행 결과
22. STDOUT from bash script to STDERR
1)코드
2)코드 설명
위 코드는 입출력 재지정 리디렉션 중에서 표준 출력을 에러로 정하는 코드이다.
이때 주목해야 할 부분은 1>&2로 이는 표준 출력을 표준 에러로 리디렉션하는 것이다.
따라서 이 코드를 실행시키면 큰 따옴표 안에 있는 문자열이 출력됨을 알 수 있다.
3)실행 결과
23. STDERR from bash script to STDOUT
1)코드
2)코드 설명
표준에러를 표준 출력으로 리디렉션하는 코드이다. 그래서 위 스크립트를 실행시며 인자로 /etc/shadow 를
주면 이는 에러가 뜬다. 이때 뜨는 에러를 STDOUT.txt라는 파일로 출력 재지정을 해주면
에러 메시지가 뜨지 않고 에러는 위 파일에 저장된다.
이는 cat STDERR.txt으로 STDERR.txt에 저장된 내용을 확인해보면 오류내용이 터미널로 출력되지 않고
위 파일에 저장됨을 확인할 수 있다.
3)실행 결과
24. stdout to screen
1)코드
2)코드 설명
위 코드는 파일의 크기가 0인 빈파일을 생성해주는 명령어 touch를 통해 file1을 만들고
ls명령어로 확인하는 예제이다. 그러니까 standard out to screen 을 해준 것이다.
25. stdout to file
1)코드
2)코드 설명
위 코드는 ls 명령으로 file 을 입력하면 원래 그냥 화면에 file이 나오는데 이를 출력재지정으로 STDOUT 파일에
값을 담아준다. 그래서 STDOUT을 cat으로 출력해보면 file이 파일로 출력된 것을 확인할 수 있다.
26. stderr to file
1)코드
2)코드 설명
위 코드는 존재하는 file1과 존재하지 않는 file2이 존재하는데 ls명령으로 file1과 file2를 파라미터로 주고
이를 출력재지정으로 STDERR에 저장한다.
그러면 먼저 존재하는 파일 file1은 바로 출력되고 없는 file2에 대한 오류는
STDERR에 저장되어 cat으로 이를 출력해보면 Standard Error가 file로 저장됨을 확인할 수 있다.
27. stdout to stderr
1)코드
2)코드 설명
위의 출력재지정 중 숫자 0,1,2는 파일 디스크립터이다.
0:입력,1:출력,2:에러로 1>&2 의 뜻은 표준 출력을 표준 에러로 백그라운드 재지정 하는 것이다.
이를 이해하면 위의 코드는 간단히 이해할 수 있다.
먼저 위의 ls명령은 두 덩어리로 나눌 수 있는데 ls file1 file2 2> STDERR_STDOUT 과
STDERR_STDOUT 1>&2 로 나눌 수 있다. 전자는 26번과 마찬가지로 file 1은 화면에 출력하고
file2에러는 STDERR_STDOUT파일에 저장한다. 그런데 후자의 명령으로 인해 이 화면으로 출력되어야 할 것까지
에러 출력파일에 들어가게 된다.
따라서 이를 cat으로 출력해보면 위와 같이 file1과 오류 메시지를 출력한다.
28. stderr to stdout
1)코드
2)코드 설명
위 코드는 27번과 같은 결과를 출력한다. 왜냐하면 표준 에러를 표준 출력으로 재지정 했기 때문이다.
29. stderr and stdout to file
1)코드
2)코드 설명
위 코드는 출력되어야할 에러를 STDERR_STDOUT이라는 파일로 출력을 재지정 하는 것이다.
이에 cat명령으로 확인해보면 에러가 파일로 잘 리디렉션 됨을 확인할 수 있다.