< 과제 3 >

 

우선, 사용자에게 숫자를 입력받기 위해 read 명령어를 이용했다.

입력한 수를 num이라는 변수에 저장한 후 입력받은 수가 짝수일 때는 별찍기, 홀수일 때는 구구단을 출력하기 위해

조건문 if를 사용했다.

입력받은 수가 짝수일 때는 num값을 2로 나눴을 때 0인 것으로 작성했다.

이 때 -eq는 비교 연산자 "= ="를 의미한다.

짝수일 때는 그 수를 높이로 하는 별을 찍기 위해 for문을 사용했다.

(별찍기 코드는 C++ 스터디에서 했던 코드를 이용했다.)

또한, else를 이용하여 입력받은 수가 홀수일 때는 구구단이 출력되도록 하기 위해 while문을 사용했다.

-le는 비교 연산자 "< ="를 의미하고 위와 같이 입력된 수의 구구단이 출력되도록 코드를 작성했다.

 

스크립트를 모두 작성 후 실행시키면 다음과 같다.

 

위와 같이 짝수를 입력했을 때는 그 짝수를 높이로 하는 별찍기 모양이 잘 출력되는 것을 확인할 수 있다.

 

위와 같이 홀수를 입력했을 때는 그 홀수의 구구단이 잘 출력되는 것을 확인할 수 있다.

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 5 - 2  (0) 2020.06.07
Linux Study Week 5 - 1  (0) 2020.06.07
Linux Study Week 4 - 3  (0) 2020.06.01
Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01

< 과제 2 - 계산기 프로그램 >

 

우선 list에 원하는 값들을 입력해둔 후 메뉴를 반복해서 실행시킬 수 있도록 하기 위해 select문을 이용했다.

list에 저장해둔 값이 하나씩 cal이라는 변수에 저장되고,

case문을 이용하여 각각의 값에 해당되는 명령을 분기시킨 후 작성했다.

또한, 연산 결과의 값이 출력되도록 하기 위해 "$(( ))" 안에 명령을 입력하여 값이 실행될 수 있도록 했다.

Exit에 해당하는 값을 입력하면 반복 실행문을 빠져나가도록 break문을 입력해주었고,

REPLY가 null일 때만 프롬프트(=PS3 값)가 출력되므로 REPLY를 널로 설정했다.

 

리눅스에서는 곱셈 연산을 할 때 \*를 입력해주어야 한다고 해서 처음에는 그렇게 했지만, 위와 같은 오류가 발생했다.

그래서 $(($num1*$num2))로 수정한 후 실행시켰다.

 

스크립트를 모두 작성한 후 실행시킨 결과는 다음과 같다.

 

위와 같이 select문을 사용했기 때문에 메뉴가 반복하여 출력된다.

 

1번 선택 후 원하는 숫자를 입력하면 덧셈이 잘 실행되는 것을 확인할 수 있다.

 

2번 선택 후 원하는 숫자를 입력하면 뺄셈이 잘 실행되는 것을 확인할 수 있다.

 

3번 선택 후 원하는 숫자를 입력하면 곱셈이 잘 실행되는 것을 확인할 수 있다.

 

4번 선택 후 원하는 숫자를 입력하면 나눗셈이 잘 실행되는 것을 확인할 수 있다.

 

5번을 선택하면 break문의 효과로 인해 반복 실행문을 잘 빠져나가는 것을 확인할 수 있다.

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 5 - 3  (0) 2020.06.07
Linux Study Week 5 - 1  (0) 2020.06.07
Linux Study Week 4 - 3  (0) 2020.06.01
Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01

< 조건문 >

 

- 산술 비교 연산자

 

산술 비교 연산자 의미
A -eq B A = = B
A -ne B A ! = B
A -gt B A > B
A -ge B A > = B
A -lt B A < B
A -le B A < = B

 

- 문자열 비교 연산자

 

문자열 비교 연산자 의미
문자열 A = 문자열 B A와 B가 같다
문자열 A != 문자열 B A와 B가 다르다
-n 문자열 문자열이 null이 아니면 참
-z 문자열 문자열이 null이면 참

 

- 파일 관련 연산자

 

파일 관련 연산자 의미
-a 파일명 해당 파일이 존재하면 참
-e 파일명 해당 파일이 존재하면 참
-r 파일명 해당 파일을 읽을 수 있으면 참
-w 파일명 해당 파일을 쓸 수 있으면 참
-x 파일명 해당 파일을 실행할 수 있으면 참
-f 파일명 해당 파일이 일반 파일이면 참
-d 파일명 해당 파일이 디렉토리면 참

 

< case문 >

 

- case문은 C언어의 case~switch문과 동일한 역할을 한다.

- case로 시작하고, esac로 끝난다.

- 각 조건은 )로 끝나며 실행문 끝에는 ;;를 입력해야 한다.

 

위와 같이 스크립트 작성 후 실행시키면 다음과 같다.

 

위에서 score값을 2라고 저장해두었기 때문에 echo B;;가 실행되므로 B가 출력되는 것을 확인할 수 있다.

 

< for문 >

- for문은 for로 시작하고, done으로 끝난다.

- do와 done 사이에 명령(실행문)을 작성한다.

- for문을 사용하는 방법은 다양한데, 다음의 방식들이 있다.

 

첫번째 방법은 위와 같다.

for 변수 in 리스트를 적어주는데, 이 때 리스트는 공백 문자로 구분을 지어준다.

또한, do와 done 사이에 명령을 작성한다.

 

두번째 방법은 C언어처럼 "(( ))" 사이에 초기식, 조건식, 증감식을 적어준 후 do 다음에 실행문을 작성해준다.

 

세번째 방법은 list를 따로 적어주는 것이다.

list에 들어가길 원하는 값을 공백 문자로 구분하여 "( )" 안에 적어준다.

또한 for 변수 in 리스트에서 리스트 안의 값을 넣어주기 위하여 ${list[*]}를 작성해준다.

 

위에서 본 세 가지 방법의 실행 결과는 모두 이와 같은 것을 확인할 수 있다.

 

< while문 >

 

- while문은 while로 시작하고, done으로 끝난다.

- for문과 마찬가지로 do 다음에 명령(=실행문)을 작성한다.

 

위와 같이 스크립트를 작성한 후 실행시키면 다음과 같다.

 

위에서 num 값이 10이 될 때까지 1씩 증가시키면서 sum에 더해주라는 명령을 작성했기 때문에

$sum에는 1+2+3+ ··· +10값이 저장되므로 이 스크립트를 실행시키면 total : 55라는 문장이 출력되는 것을 확인할 수 있다.

 

< select문 >

 

- select문은 메뉴를 생성할 수 있는 반복 실행문이다.

- PS3은 프롬프트를 변경하기 위한 쉘 변수이다.

- 사용자는 각 항목에 자동 부여된 번호를 선택할 수 있고, 사용자가 입력한 값은 select와 in 사이에 지정된 변수에 저장된다.

- REPLY가 NULL일 때만 프롬프트(PS3값)가 출력되기 때문에 계속 출력시키기 위해서는 "REPLY="를 입력해주어야 한다.

 

위와 같이 스크립트를 작성한 후 실행시키면 다음과 같다.

 

위와 같이 사용자가 자동 부여된 번호를 입력할 수 있고, 입력한 번호의 값은 스크립트에서 지정한 work라는 변수에 저장된다.

따라서 2를 입력하면 2번의 값인 Run이 출력되는 것을 확인할 수 있다.

 

< break문 >

 

- 반복 루프 안에서 사용한다.

- 이후의 실행을 무시하고 루프를 탈출한다.

 

< continue문 >

 

- 반복 루프 안에서 사용한다.

- 이후의 실행을 무시하고 루프의 맨 처음으로 돌아간다.

 

< 함수 >

 

- 함수를 정의할 때는 함수이름( )을 입력하고, { } 사이에 명령어를 입력한다.

- 함수를 호출할 때는 함수이름 매개변수를 입력하여 호출한다.

 

입력한 스크립트를 실행시키면 매개변수1 값에 fun이 저장되어 위와 같이 잘 출력되는 것을 확인할 수 있다.

 

- 함수를 종료시킬 때는 함수 본문 안의 마지막 문장을 실행하고 return문을 실행한다.

- 이 때, return문에 지정한 값이 함수 종료값으로 $?에 저장된다.

 

매개변수 1,2에 들어갈 값을 입력한 후 스크립트를 실행시키면 위와 같이 잘 출력되는 것을 확인할 수 있다.

 

< 실습 1 - case문 >

 

숫자를 입력받게 하기 위해 read 명령어를 이용하고, 입력과 출력을 한 줄에서 실행하도록 하기 위해 -p 옵션을 사용한다.

case문을 이용하여 숫자가 3, 6, 9이면 'Hello 숫자'를 출력하고, 그 외의 숫자면 'Bye'를 출력하도록 스크립트를 작성한다.

 

위와 같이 스크립트 작성하고 실행 권한을 부여해준 후 실행시키면 위와 같이 숫자의 입력과 출력을 한 줄에서 실행할 수 있다.

또한, 3을 입력하면 Hello 3이 출력되고 3,6,9 이외의 수를 입력하면 Bye가 잘 출력되는 것을 확인할 수 있다.

 

< 실습 2 - for문 >

 

for문을 이용하는 방법은 많지만 여기서는 list에 값을 지정해두는 방법을 사용하였다.

위와 같이 list 괄호 안에 리스트 내용을 입력해둔 후 num이라는 변수에 리스트 안의 값이 출력되도록 스크립트를 작성했다.

 

스크립트를 저장한 후 실행시키면 위와 같이 리스트 내용이 잘 출력되는 것을 확인할 수 있다.

 

< 실습 3 - while문 >

 

-le는 비교연산자 "< =" 를 의미한다.

직각삼각형 모양을 만들기 위해 while문을 이용하여 위와 같이 스크립트를 작성해준다.

(C++ 스터디에서 한 코드를 이용했다.)

 

스크립트를 저장한 후 실행시키면 위와 같이 직각삼각형이 잘 출력되는 것을 확인할 수 있다.

 

< 실습 4 - select문 >

 

select문은 메뉴를 생성할 수 있는 반복 실행문이다.

사용자가 각 항목에 자동 부여된 번호를 선택할 수 있도록 하기 위해 select문을 이용했고,

case문을 이용하여 각각의 값이 분기되어 선택된 값에 해당하는 명령을 실행시킬 수 있도록 스크립트를 작성했다.

또한, 계속 출력을 할 수 있도록 하기 위해 REPLY를 null로 설정했다.

 

스크립트를 저장한 후 실행시키면 위와 같이 사용자가 원하는 숫자를 입력받을 수 있다.

또한, 입력된 숫자에 해당되는 명령이 잘 출력되는 것을 확인할 수 있다.

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 5 - 3  (0) 2020.06.07
Linux Study Week 5 - 2  (0) 2020.06.07
Linux Study Week 4 - 3  (0) 2020.06.01
Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01

< 과제 3 >

 

( 파일 실행할때 주는 매개변수가 사용자명이 된다.)
1. who are you? 라고 물으면, 이름 입력받기(read 사용)
2. 사용자 명(apple)이 아니면, Permission Denied로 뜨게하기
3. 사용자 명(apple)이 맞다면,
1) ls –l 한 결과와 컴파일 할 파일을 묻고 입력받는다.
2) 이때, 컴파일 하여 생긴 실행파일(a.out)의 이름을 현재 날짜로 바꾸어주기 (ex. 20200529)
( ls 하여 현재 날짜로 된 실행파일이 있는지 확인하고, 실행해보기)

 

vi 편집기로 assign1.sh라는 파일에 위와 같은 내용을 입력해준다.

매직넘버를 이용하여 실행할 쉘스크립트를 만들어 준다.

who are you? 라는 질문에 답을 입력하기 위해 read라는 명령어를 이용하고 name이라는 변수에 입력한다.

입력과 출력을 한 행에서 처리하기 위해 -p 옵션을 사용한다.

if문을 이용하여 name 변수에 입력한 값과 매개변수($1=사용자명)에 입력한 값이 같다면

( if문을 쓸 때 괄호([ ])와 비교 연산자(=) 앞뒤에 반드시 공백이 있어야 함을 주의한다. )

파일 상세 정보를 출력하기 위해 ls -l을 해준다.

그리고 컴파일할 파일을 묻고(file to compile) 입력받기 위해 read명령어를 이용한다.

이 때도 위와 같이 -p 옵션을 사용하여 입력과 출력을 한 행에서 처리하고 file이라는 변수에 입력한다.

위에서 입력한 컴파일할 파일을 컴파일하기 위해 gcc를 이용한다.

컴파일하여 생성된 실행파일 a.out의 이름을 현재 날짜로 바꾸어주기 위해 파일명을 변경해주는 명령어인 mv를 이용한다.

이 때, date라는 명령어를 통해 현재 날짜와 시간으로 변경되도록 했고 (Y:연도, m:월, d:일)

date+포맷을 입력할 때 +와 포맷 사이에 공백이 없어야 함을 주의해야 한다.

또한, 컴파일이 성공되었다는 메세지(Success to compile)가 출력되도록 echo 명령어를 이용한다.

만약 name 변수에 입력한 값과 매개변수($1=사용자명)에 입력한 값이 다르다면 (=else)

Permission denied라는 메세지가 출력되게 하기 위해 echo를 이용한다.

위와 같은 내용을 모두 입력하고 vi 편집기를 저장 후 종료한다.

 

 

chmod를 이용하여 assign1.sh 파일에 실행 권한을 부여해준다.

apple을 매개변수로 하여 assign1.sh 파일을 실행시킨 후 who are you?라는 질문에 apple과 다른 swing을 입력해주면

permission denied라는 메세지가 잘 출력되는 것을 확인할 수 있다.

( 이와 같이 출력되는 이유는 매개변수와 입력받은 이름이 다르기 때문이다. )

 

 

assign1.sh 파일을 실행하기 전에 ls하여 현재 날짜로 된 실행파일이 없음을 확인할 수 있다.

 

 

apple을 매개변수로 하여 assign1.sh 파일을 실행시킨 후 who are you?라는 질문에 apple과 같은 apple을 입력해주면

ls -l한 결과가 잘 출력되고 컴파일 할 파일을 묻고 입력받을 수 있게 함을 확인할 수 있다.

hello.c를 입력하면 Success to compile이라는 메세지가 잘 뜨는 것을 확인할 수 있다.

 

 

위와 같이 ls를 입력하여 파일을 확인해보면 a.out 대신 현재 날짜(20200602)로 파일명이 잘 변경된 것을 확인할 수 있다.

 

 

또한, 20200602 파일을 실행시켜보면 hello.c파일에 입력되어있던 내용을 컴파일한 내용이 잘 출력됨을 확인할 수 있다.

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 5 - 2  (0) 2020.06.07
Linux Study Week 5 - 1  (0) 2020.06.07
Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01
Linux Study Week 3 - 3  (0) 2020.05.24

< 과제 2 >

 

1. 매개변수 총 4개를 가지고 실행한다. ( 매개변수명은 자유롭게 가능)
2. 첫번째 매개변수(ex. abcd)는 디렉토리명으로, 사용자 홈디렉토리에 생성한다. (~/)
3. 만든 디렉토리로 이동하여, 매개변수2,3,4 (ex. a, b, c)의 이름의 파일을 생성한다. (touch)
4. 만든 디렉토리에 파일이 잘 생성되었는지 확인하기 위해, ls –l을 해준다.
5. 삭제할 파일을 묻고(read), 입력 받아, 삭제한다. (rm)
6. 삭제 한 후, 다시 ls –l하여 삭제된 것을 확인할 수 있도록 한다.

 

 

vi 편집기로 assign0.sh 라는 파일에 위와 같은 내용을 입력해준다.

#! /bin/bash를 입력하여 실행할 쉘스크립트를 만들어 준다.

디렉토리를 생성하는 명령어인 mkdir을 이용하여 홈 디렉토리(~)에 $1 디렉토리를 생성해준다. ($1은 매개변수1을 의미)

만들어진 디렉토리로 이동하기 위해 cd ~/$1을 입력해준다.

만들어진 디렉토리에 매개변수 2, 3, 4 파일을 생성하기 위해 touch 명령어를 이용한다. ($2, $3, $4는 매개변수2,3,4를 의미)

만들어진 디렉토리에 파일이 잘 생성되었는지 확인하기 위해 ls -l을 해준다.

삭제할 파일을 묻기 위해 read 명령어를 이용한다. (-p는 입력과 출력을 한 행에서 처리해주는 옵션)

file이라는 변수로 삭제할 파일을 입력받은 후 rm 명령어를 이용하여 입력한 파일을 삭제한다.

입력한 파일이 잘 삭제되었는지 확인하기 이해 다시 ls -l을 해준다.

 

 

vi 편집기를 저장 후 종료하고, assign0.sh 파일을 실행시키면 다음과 같다.

assign0.sh 라는 파일에 실행 권한을 부여해준 후 abcd라는 디렉토리와 a, b, c라는 파일을 생성한다

위와 같이 처음에는 입력한 파일이 잘 생성된 것을 볼 수 있고 delete file에 삭제할 파일명을 입력하면

입력한 파일이 잘 삭제된 것을 확인할 수 있다.

 

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 5 - 1  (0) 2020.06.07
Linux Study Week 4 - 3  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01
Linux Study Week 3 - 3  (0) 2020.05.24
Linux Study Week 3 - 2  (0) 2020.05.24

< 쉘 스크립트 >

 

vi 편집기에 위와 같은 내용을 입력한다.

#!는 매직 넘버로 스크립트를 처리하는 인터프리터이다. 즉, 스크립트 파일을 bash 쉘로 실행시킨다는 의미이다.

echo는 화면에 문자열을 출력하기 위해 사용된다.

exit 10은 종료 상태를 나타낸다.

 

hello.sh 파일에 실행 권한을 부여해준 후 실행시키면 입력한 내용이 잘 출력되는 것을 볼 수 있다.

위와 같이 실행하는 방법은 ./와 bash를 쓰는 두 가지 방법이 있다.

 

ls명령어를 이용하여 hello.sh 파일이 생성된 것을 확인할 수 있다.

exit [종료상태]는 종료값을 지정하며 스크립트를 종료하고 $? 변수에 저장된다. ($?는 가장 최근 명령어의 종료 상태)

종료 상태의 범위는 0~255이고 0은 성공, 1~255는 오류코드를 나타낸다.

ls -l 후의 $?은 성공했으므로 0이고 ./hello.sh의 종료상태는 10으로 입력해두었기 때문에 10으로 나오는 것을 볼 수 있다.

 

< 변수사용과 매개변수 >

 

vi 편집기로 name.sh 이라는 파일에 내용을 입력한다.

위와 같이 변수를 선언할 수 있는데, 변수 선언 시 = 앞뒤로 공백이 없어야 한다.

변수의 값을 지정해주기 위해 name 앞에 $을 붙여야한다.

※ $( )는 실행결과를, $(( ))는 계산결과를 나타낸다.

 

저장하고 name.sh 파일을 출력하면 변수에 저장된 값으로 잘 출력되는 것을 볼 수 있다.

 

큰 따옴표(" ")는 변수의 값을 잘 출력해주지만, 작은 따옴표(' ')는 $의 의미를 없앤다.

 

또한, 문자열에서 큰 따옴표(" ")는 공백을 보존하여 출력해주지만 따옴표 없는 echo는 보존해주지 않는다.

 

그리고, 역 따옴표(` `)는 실행 결과를 나타낸다.

 

vi 편집기로 prac1이라는 파일에 위와 같은 내용을 입력한다.

prac1 파일에 실행 권한을 부여한 후 실행시키면 다음과 같다.

 

그냥 echo는 공백을 보존해주지 않기 때문에 a bcd로 출력이 된다.

큰 따옴표(" ")는 공백을 보존해주기 때문에 입력한 내용이 그대로 출력되는 것을 확인할 수 있다.

작은 따옴표(' ')는 $의미를 없애주기 때문에 $b로 출력되는 것을 볼 수 있다.

 

vi 편집기로 param1.sh 라는 파일에 위와 같은 내용을 입력해준다.

$* : 입력된 매개변수들의 목록

$# : 입력된 매개변수들의 수

$0 : 쉘 스크립트 이름

$1, $2, ··· : 매개변수 1, 2, ···

\ : $의 의미를 잃음

※ 따옴표(" ")로 묶는 것은 하나의 매개변수로 취급한다.

 

먼저 param1.sh 파일에 실행 권한을 부여해준다.

매개변수로 a b c 를 입력했으므로 $*에는 a b c가 출력되고, 매개변수의 수는 3개이므로 $#에는 3이 출력된다.

쉘 스크립트 이름은 param1.sh이므로 $0에 잘 출력되었고 $1, $2에는 매개변수 1(=a), 매개변수 2(=b)가 출력된 것을 확인할 수 있다.

 

위와 같이 date 명령어를 통해 날짜와 시간을 알 수 있다.

date +포맷을 입력하여 세부 정보를 알 수 있는데, 이 때 +와 포맷 사이에 공백은 없어야 한다.

 

※ 명령어 조건 실행에는 논리곱(&&)과 논리합(||)이 있다.

명령어1 && 명령어2는 논리곱으로 명령어1의 실행 결과가 성공이면 명령어2를 실행한다.

명령어1 || 명령어2는 논리합으로 명령어1의 실행 결과가 실패면 명령어2를 실행한다.

 

< 입력 >

 

vi 편집기로 read1.sh 파일에 위와 같은 내용을 입력한다.

read는 표준 입력을 문자열을 받는 쉘 내장 명령어로 형식은 read [옵션] [변수명]이다.

 

read1.sh 파일에 실행 권한을 부여한 후 실행시키면 read명령어로 인해 원하는 내용을 입력할 수 있고,

다음 행에서 입력한 내용이 잘 출력되는 것을 볼 수 있다.

※ 입력과 출력을 한 행에서 처리하고 싶다면 -p라는 옵션을 주면 된다.

 

vi 편집기로 read2.sh 라는 파일에 위와 같은 내용을 입력한다.

입력과 출력을 한 행에서 처리하기 위해 -p 옵션을 사용했다.

또한, if문으로 문자열을 비교하여 입력한 문자열이 같다면 same, 다르다면 not same, 끝났다면 end가 출력되도록 했다.

※ if문을 쓸 때 괄호([ ])와 비교 연산자(= 또는 ==) 앞뒤에 반드시 공백이 있어야 한다.

 

위와 같이 name1과 name2는 한 행에서 입력과 출력을 받을 수 있고,

입력한 문자가 같다면 same, 다르다면 not same, 조건문이 끝났으면 end가 출력되는 것을 확인할 수 있다.

 

vi 편집기로 terminator1 파일에 위와 같은 내용을 입력한다.

명령 << [입력 종료문자]를 입력하면 입력 종료문자가 입력될 때까지 키보드 입력을 받는다.

이것은 표준 입력을 사용자로부터 받아들이지 않고 자동으로 처리할 때 사용한다.

 

위와 같이 실행 권한을 부여한 후 실행시키면 vi 편집기에서 입력했던 내용이 잘 출력되는 것을 볼 수 있다.

 

< 실습 1 >

1. 홈디렉토리(~) 에 password라는 디렉토리 만들기
2. password 디렉토리로 이동하기
3. 현재 디렉토리로, /etc/passwd 파일을 복사해온다.

 

#! /bin/bash를 입력하여 실행할 쉘스크립트를 만들어 준다.

mkdir을 이용하여 홈 디렉토리(~)에 password라는 디렉토리를 만든다.

password 디렉토리로 이동하기 위해 cd라는 명령어를 사용하여 이동한 후

현재 디렉토리(.)로 /etc/passwd 파일을 복사해오기 위해 명령어 cp를 사용한다.

 

위와 같이 ls를 통해 password라는 디렉토리가 홈 디렉토리에 생성된 것을 볼 수 있고,

password 디렉토리로 이동한 후 ls로 파일 목록을 확인하면 passwd라는 파일이 잘 복사된 것을 확인할 수 있다.

 

< 실습 2 >

c 파일을 매개변수로 받아 컴파일 하여 실행해주는 스크립트 작성하기

 

vi 편집기로 param2.sh라는 파일에 인터프리터를 알려준 후

c 파일을 매개변수로 받아 컴파일 하기 위해 gcc $1을 입력해준다. ($1은 매개변수1을 의미한다.)

또한 a.out을 실행시키기 위해 echo $( )를 입력해준다.

 

vi 편집기로 hello.c라는 파일에 위와 같은 내용을 입력해준다.

 

param2.sh라는 파일에 실행 권한을 부여해준 후 hello.c라는 매개변수를 실행시킬 수 있도록 입력해주면

Hello Linux라는 hello.c의 파일 내용이 잘 출력되는 것을 확인할 수 있다.

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 4 - 3  (0) 2020.06.01
Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 3 - 3  (0) 2020.05.24
Linux Study Week 3 - 2  (0) 2020.05.24
Linux Study Week 3 - 1  (0) 2020.05.24

 < 포인터 > 

▶ 포인터란?

- 변수의 메모리 공간주소를 가리키는 변수

- 포인트 변수의 크기는 무조건 4byte이다.

- 포인터 선언 :  '*' 를 붙여준다.

                        → 선언 방식 : 자료형 * 포인터 변수 이름;

- 포인터 초기화 : 변수 이름 앞에 '&'를 붙여준다.

                           ※ 배열의 이름은 그 자체가 주소이므로 '&'를 붙이지 않는다.

 

< 변수인 경우 > < 배열인 경우 >
int a;
int* p;
p = &a
int a [10];
int* p;
p = a;

- 포인터 변수에는 변수의 주소가 들어간다.

- 포인터를 이용하면 메모리에 직접접근이 가능하고 함수를 넘나들어 사용할 수 있게 된다.

- 포인터 활용

char ch; // 문자형 변수 선언, 1byte 차지

char* p; // 포인터 변수 선언, 4byte 차지

ch = 'A'; // 문자형 변수에 문자 'A' 대입

p = &ch; // 포인터 변수에 변수 ch의 주소인 '&ch' 대입

- 포인터가 유용한 경우

  • 배열은 포인터를 사용하여 구현된다. 포인터는 배열을 반복할 때 사용할 수 있다. (배열 인덱스 대신 사용 가능)
  • C++에서 동적으로 메모리를 할당할 수 있는 유일한 방법이다. (가장 흔한 사용 사례)
  • 데이터를 복사하지 않고도 많은 양의 데이터를 함수에 전달할 수 있다.
  • 함수를 매개 변수로 다른 함수에 전달하는 데 사용할 수 있다.
  • 상속을 다룰 때 다형성을 달성하기 위해 사용한다.
  • 하나의 구조체/클래스 포인터를 다른 구조체/클래스에 두어 체인을 형성하는 데 사용할 수 있다. 

 

▶ 간접 참조 연산자

- 지정된 주소에 있는 값을 액세스하는 연산자

- 역 참조 연산자, 간접 연산자, * 연산자라고도 한다.

- 피연산자의 메모리에 접근하여 주소 값을 저장해가는 변수

- ex) a의 주소를 100번지를 가리킨다고 가정하자.

 

int a = 200;
int* p;
p = &a;

cout << p; // 이 경우 a의 주소값인 100이 출력됨
cout << *p; // 이 경우 a의 값인 200이 출력됨

위의 표처럼 포인터 변수 앞에 '*' 을 붙여주어야 값이 출력된다.

 

▶ 포인터 연산

- 포인터 연산 규칙

① 포인터끼리 더할 수 없다. ( 주소 값을 더하는 것은 쓸모가 없음 )

② 포인터끼리 뺄 수 있다. ( 주소 값의 거리를 구함으로써 메모리상에서 얼마나 떨어져 있는지 구해낼 수 있음 )

③ 포인터에 정수를 더하거나 뺄 수 있다.

④ 자료형 포인터의 값을 1 증가시키면 자료형의 크기만큼 증가된다.

⑤ 포인터끼리 대입은 가능하다. ( 단, 대입받을 포인터와 대입할 포인터의 타입이 일치해야함 )

⑥ 포인터에 정수를 대입할 수 없다.

⑦ 포인터와 실수와의 연산은 할 수 없다.

⑧ 포인터끼리 비교는 가능하다.

 

- 포인터 증감 연산

     ※ 증감 연산자(++, --)와 참조 연산자(*)는 함께 쓰일 수 있다.

 

 a = *ptr++ a에 ptr의 값을 대입한 후 ptr 증가 (주소가 증가)
 a = (*ptr)++ a에 ptr의 값을 대입한 후 *ptr 증가 (값이 증가)
 a = *++ptr ptr 증가한 후 a에 대입 (주소가 증가, 증가한 주소가 가리키는 값 대입)
 a = ++*ptr *ptr 증가한 후 a에 대입 (값의 증가, 증가한 값 대입)

- ex) a의 주소는 100번지, b의 주소는 200번지라고 가정하자.

 

int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = *ptr++;

cout << a; // 값을 대입 후 ptr이 증가하므로 10이 출력됨
cout << ptr; // b의 주소에서 4바이트 증가한 204가 출력됨
cout << *ptr; // a의 주소값인 100이 출력됨
int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = (*ptr)++;

cout << a; // 값을 대입 후 ptr이 증가하므로 10이 출력됨
cout << ptr; // ptr은 증가하지 않으므로 200이 출력됨
cout << *ptr; // ptr의 값이 증가하므로 11이 출력됨
int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = *++ptr;

cout << a; // ptr을 증가시킨 후 대입하므로 a의 주소값인 
                  100이 출력됨
cout << ptr; // b의 주소에서 4바이트 증가한 204가 출력됨
cout << *ptr; // a의 주소값인 100이 출력됨
int b = 10;
int* ptr = &b;
int a;

cout << ptr; // b의 주소값인 200이 출력됨
cout << *ptr; // b의 값인 10이 출력됨

a = ++*ptr;

cout << a; // ptr의 값을 증가시킨 후 대입하므로 a의 값인
                 11이 출력됨
cout << ptr; // ptr은 증가하지 않으므로 200이 출력됨
cout << *ptr; // ptr의 값이 증가하므로 11이 출력됨

 

▶ 포인터와 배열

- 포인터와 배열은 매우 긴밀한 관게를 갖고 있고, 어떤 부분에서는 서로를 대체할 수도 있다.

- 배열의 이름은 포인터 상수이다.

※ 포인터 상수란 포인터 변수가 가리키고 있는 주소 값을 변경할 수 없는 포인터를 의미

- 가변 문자열 길이를 저장할 때는 배열보다 포인터가 유용하다.

- 정수형 배열의 메모리 할당

ex) int aa[3] = {10, 20, 30};

- 배열의 주소 표현
• aa[0]의 주소(&aa[0]) = 1031번지
• aa[1]의 주소(&aa[1]) = 1035번지
• aa[2]의 주소(&aa[2]) = 1039번지
• 배열 이름 aa = 전체 배열의 주소 = 1031번지
• 배열 aa의 주소를 구할 때는 ‘&’를 쓰지 않고, 단순히 ‘aa’로 표현

- 배열 이름 활용법

ex) aa 값을 1031로 가정하고, aa+1을 계산한 결과는?
    • 예상결과 : aa+1 ➔ 1031 + 1 = 1032 (X)
    • 실제 결과: aa+1 ➔ 1031 + 4 = 1035 (O)

계산 과정)
 ‘+1’의 의미 : 배열 aa의 위치에서 한칸 건너뛰어라
 한칸 : aa가 정수형 배열이므로 4byte
 즉, aa+1 = &aa[1] = 1035

 

배열 첨자로 표현 배열 이름으로 표현 주소
&aa[0] aa + 0 1031
&aa[1] aa + 1 1035
&aa[2] aa + 2 1039

 

 

 

 

'2020-1 STUDY > C++ Study' 카테고리의 다른 글

C++ Study Week 1  (0) 2020.04.12

 < vi 편집기 > 

▶ vi의 세 가지 모드

모드 역할 및 특징
명령모드 - vi를 실행시키면 가장 먼저 접하는 기본이 되는 모드
- 커서의 이동, 수정, 삭제, 복사, 붙이기, 탐색 등을 한다.
- 입력모드 전환키인 i , a, o, I, A, O 등을 입력하면 입력모드로 전환되고
명령모드로 다시 전환하려면 [Esc]키를 누르면 된다.
입력모드
(Esc모드)
- 글자를 입력하는 문서를 만드는 모드
- 편집모드, input mode, insert mode 등으로 불린다.
- 명령모드에서 입력 전환키를 눌러서 전환하면 화면 아래에 '-- INSERT --'라고 표시된다.
콜론모드
(ex모드)
- 명령모드에서 ':'키를 입력했을 때 화면 맨 아랫줄에서 명령을 수행하는 모드
- 저장, 종료, 탐색, 치환, vi 환경설정 등의 역할을 한다.

 

▶ 입력모드

- 글자를 입력하기 위해서는 입력모드로 가야하는데, 'i'를 입력하면, 하단에 --INSERT--가 나오면서

글자를 입력할 수 있는 입력모드로 바뀐다.

※ 한/영 변환은 Shift + Spacebar를 입력하면 된다.

 

i 현재 커서의 위치부터 입력 I 현재 커서 줄의 맨 앞에서부터 입력
a 현재 커서의 위치 다음 칸부터 입력 A 현재 커서 줄의 맨 마지막부터 입력
o 현재 커서의 다음 줄에 입력 O 현재 커서의 이전 줄에 입력
s 현재 커서 위치의 한 글자를 지우고 입력 S 현재 커서의 한 줄을 지우고 입력

 

▶ 명령모드

- 입력모드에서 명령모드로 다시 전환하려면 Esc키를 누려면 된다.

- Esc키를 누르고 문자를 입력하려고 하면 비프음만 나고 입력은 되지 않는다.

- 명령모드는 편집모드라고도 하는데, 글을 입력시키는 방법이 아닌 수정과 편집을 할 수 있는 상태를 의미한다.

- 명령모드에서는 커서의 이동, 수정, 삭제, 복사, 붙이기, 탐색 등의 작업이 이루어진다.

- 잘못된 명령을 내렸을 때 'u'라는 명령어를 통해서 Undo, 즉 복구가 가능하게 할 수 있다.

 

G 파일의 맨 끝으로 ^ 현재 줄의 맨 앞으로 (빈칸무시)
0 현재 줄의 맨 앞으로 $ 현재 줄의 맨 뒤로
% 짝을 이루는 기호 확인 w 다음 단어로
b 이전 단어로 e 현재 단어의 끝 글자

 

▶ 콜론모드

- 명령모드에서 콜론모드로 전환하려면 Esc를 누른 후 ':' 명령을 실행시키면 된다.

- 콜론모드는 vi에서 사용할 수 있는 명령어들을 이용하는 곳이다.

- 윈도우 환경에서의 메뉴바와 같은 역할을 한다고 볼 수 있다.

- 파일 저장, 종료, 탐색, 치환, vi 환경설정 등의 역할을 한다.

 

:wq 편집한 데이터를 저장하고 종료
:q! 저장하지 않고 강제로 종료
:w vi를 끝내지 않고 현재 작업 중인 내용을 저장

 

▶ 정규표현식의 특수 기호들

. 한글자를 대표하는 기호 * 여러개의 문자를 동시에 대표하는 기호
^ 줄의 처음시작 $ 줄의 맨끝
% 처음줄부터 끝줄까지 \ 특수한 기호들이 가지는 뜻을 없앨 때 사용
\< 단어의 시작과 대응 \> 단어의 끝과 대응
[^] 묶여진 문자를 제외한 아무것이나 대응 \ 이어지는 기호를 문자 그대로 해석
[] 일정한 제한을 두어 글자를 대표하고자 하는 기호 [AB] A 또는 B

 

▶ 커서 움직이기

- 커서 이동은 키보드의 4개 화살표를 이용해서 이동해도 되지만, 기본적인 것은 빠르게 쓰기 위해 알아두도록 한다.

 

h 커서를 왼쪽으로 한 칸 이동 j 커서를 아래로 한 칸 이동
k 커서를 위로 한 칸 이동 l 커서를 오른쪽으로 한 칸 이동
w 다음 단어의 처음으로 이동 ^ 줄의 첫 문자로 이동
$ 현재 줄의 맨 끝으로 이동
(:$은 줄의 제일 끝으로 이동)
0 현재 줄의 처음으로 이동
(:0은 줄의 제일 처음으로 이동)
G 제일 끝 행으로 이동 gg 제일 첫 행으로 이동
nG n번째 행으로 이동 :숫자 + enter 해당 숫자의 행으로 이동
H 화면의 첫 줄로 이동 M 화면의 중간으로 이동
L 화면의 끝 줄로 이동 [ctrl] + b 이전 화면으로 이동
[ctrl] + d 반 정도 화면 이동 [ctrl] + f 다음 화면으로 이동
[ctrl] + e 커서는 현재 위치 그대로,
화면만 한줄씩 위로 이동
n% 입력한 n%에 해당하는 줄로 이동

 

▶ 편집하기

x 현재 커서가 위차한 문자를 삭제 dw 단어 삭제
dd 현재 커서의 행 삭제 숫자 dd 현재 커서부터 숫자만큼의 행을 삭제
yy 현재 커서가 있는 행을 복사 숫자 yy 현재 커서부터 숫자만큼의 행을 복사
p 복사한 내용을 현재 행 이후에 붙여넣기 P 복사한 내용을 현재 행 이전에 붙여넣기
u 직전에 내린 명령을 취소 U 현재 줄을 저장
 /exp + enter 'exp'와 같은 문자열을 현재 커서가 위치한 곳부터 아래 방향으로 검색 ?exp + enter 'exp'와 같은 문자열을 뒤에서부터
위 방향으로 검색
n 찾은 문자 중에서 다음 문자로 이동 N 찾은 문자를 이전 문자로(아래에서 위로) 이동

 

 

이외에도 vi편집기에서 사용되는 명령어들은 아주 많은데 기본적으로 리눅스 활용도를 높이기 위해 알아두면 좋을 것 같다.

필요한 명령어들은 그때그때 찾아서 활용하도록 한다.

출처 : kms0209.tistory.com/76

 

▶ 실습

 

- 입력모드

 

i를 누르면 하단에 -- INSERT -- 가 나오고 현재 커서의 위치부터 입력된다.

 

o를 누르면 현재 커서의 다음 줄부터 입력된다.

 

커서를 위 그림처럼 두었을 때

 

S를 누르면 현재 커서 위치의 한 줄을 지우고 입력된다.

 

 

- 명령모드

 

int main() 끝에 커서를 두고 0을 입력하면 현재 줄의 맨 앞으로 이동한다.

 

int main() 끝에 커서를 두고 w를 입력하면 다음 단어로 이동한다.

 

 

- 콜론모드

 

:wq를 입력하면 편집한 데이터를 저장하고 vi 편집기가 종료된다.

 

test.c 파일의 내용을 출력해보면 vi 편집기에서 입력했던 내용이 잘 들어가 있음을 확인할 수 있다.

 

:q!를 입력하면 편집한 데이터를 저장하지 않고 강제로 종료된다.

 

test.c 파일의 내용을 확인해보면 위에서 편집한 데이터가 저장되지 않은 것을 볼 수 있다.

 

 

- 커서 움직이기

 

위의 그림과 같이 커서의 위치를 고정하고 실습하도록 하자.

 

j를 누르면 커서가 아래로 한 칸 이동한다.

 

^를 누르면 커서가 그 줄의 첫 문자로 이동한다.

 

:숫자를 입력하고 enter키를 누르면 커서가 입력한 숫자의 행으로 이동한다.

 

ctrl키를 누른 후 e를 누르면 커서는 현재 위치 그대로 두고, 화면만 한줄씩 위로 이동한다.

커서가 i에 위치하고 있었기 때문에 화면이 한 줄 올라가면서 커서는 {에 위치하게 된다.

 

 

- 편집하기

 

화면 하단에 ?문자나 문자열을 입력하고 enter키를 누르면 입력한 문자나 문자열을 아래에서 위로 검색해준다.

 

커서를 int main()의 끝에 두고 dd를 입력하면 현재 커서의 행을 삭제한다.

 

커서를 main의 n에 두고 x를 입력하면 현재 커서가 위치한 문자(=n)를 삭제한다.

 

 

 

 

 

 

 

 

 

 

'2020-1 STUDY > Linux Study' 카테고리의 다른 글

Linux Study Week 4 - 2  (0) 2020.06.01
Linux Study Week 4 - 1  (0) 2020.06.01
Linux Study Week 3 - 2  (0) 2020.05.24
Linux Study Week 3 - 1  (0) 2020.05.24
Linux Study Week 2 - 4  (0) 2020.05.18

+ Recent posts