상세 컨텐츠

본문 제목

[Linux] 4주 과제 1

운영체제/Linux

by 밍구21 2020. 6. 2. 20:32

본문

//쉘 스크립트 생성

 

 

vi편집기로 hello.sh라는 이름의 파일을 만든다. 뒤에. sh는 쉘 스크립스라는 것을 나타낸다.

안 적어도 전혀 상관 없지만 내가 알아보는 용이다.

 

 

 

vi편집기 내용이다. 

#!은 매직넘버이다. 그 뒤는 어떤 인터프리터를 사용하여 명령어를 해석할지 알려준다.

나는 bash 쉘을 사용하므로 뒤에 bash쉘의 경로를 나타낸다.

 

echo는 문자열 출력 명령어로 뒤에 오는 작은따옴표 안의 내용인 Hello, World! 를 출력할 것이다.

 

#은 주석으로 주석 뒤에 오는 내용은 해석이나 명령이 되지 않는다.

 

exit은 종료 상태이다. 이따 좀 더 자세히 다뤄보자.

 

vi 편집기로 위 내용 작성을 마치고 실행을 해주겠다.

 

 

허용이 거부된다고 뜬다.

 

 

ls를 통해 권한을 확인해보자 실행 권한인 x는 부여되어있지 않다.

 

 

그래서 x를 부여해줬다. 앞으로 만드는 모든 vi편집기 파일은 생성 후 실행권한을 부여했다. 

 

 

 

그러자 정상 작동 됐다! 

 

 

일반 파일 실행 명령어인 ./파일이름 을 사용해도 되지만

bash쉘 스크립트 실행 명령어인 bash 파일이름 을 사용해도 실행된다.

 

 


//종료 exit - exit 종료상태

 

-종료 상태의 범위는 0 ~ 255

-종료 상태는 $? 변수에 저장된다.

 

확인해보도록 하겠다!

 

 

위에 vi편집기를 이용해 만든 파일인 ./hello.sh를 실행한 뒤 $? 변수를 출력하였다.

내가 편집 마지막에 설정한 변수 10이 저장되어있는 걸 확인할 수 있다.

 

 

 

ls 명령어를 확인한 뒤 종료 상태를 확인해보니 0으로 성공적으로 종료가 된 걸 알 수 있다.

$? 는 가장 최근에 실행한 명령어의 종료 상태를 나타낸다.

 

 

 


//변수 사용

 

 

//변수 선언- 변수이름=

변수 선언을 할 때는 =앞 뒤에 공백이 없게 한다.

 

 

 

위 명령어 출력 결과이다.

$변수명 을 사용한 결과는 변수의 값이 출력되었다.

하지만 그냥 변수명을 입력한 것은 그대로 변수명이 출력되었다.

 

 

 

//명령어 변수 선언 - 변수이름=$(명령어)

 

 

ls명령어를 ming이라는 변수에 선언하였다.

 

 

 

 

"$변수명" 을 사용해 출력해보도록 하겠다.

 

 

ls결과가 잘 출력됐다.

 



 

 

"(큰 따옴표)를 사용하지 않고 같은 명령어를 출력을 하면

 

 

줄이 띄어지지 않고 결과가 출력된다.

 

 




'(작은 따옴표)를 사용해 같은 명령어를 출력하면

 

 

ls가 아닌 작은 따옴표 안 글자가 그대로 출력된다.

 

작은따옴표는 $의 의미를 없앤다.

 

 

 


 

//계산 변수 선언 - 변수명=$((계산 내용))

 

 

mimz라는 변수에 6 곱하기 18 선언했다.

 

 

위 명령어를 실행한 결과

 

 

잘 실행된다.

 

 

 


//변수 사용 - "" vs ''

아래 명령어는 x=5로 선언한 변수이다.

 

 

"(큰 따옴표)는 정상적으로 값이 출력되지만

'(작은따옴표)는 $를 무효화 시켜 변수가 아닌 작은 따옴표 안에 있는 내용을 출력시킨다.

 

//변수 사용 - "" vs 그냥 echo

 

 

큰 따옴표를 사용하면 화이트 스페이스는 보존이 잘 되지만

그냥 echo를 사용하면 공백 열이 보존이 안 된 채로 출력된다

 

//명령어 실행 - $() vs ``(역 따옴표)

 

 

둘 다 명령어 출력이 된다.

 

 


//실습1

 

#1 ~디렉토리에 password 디렉토리 만들기

 

 

~에 mkdir 명령어를 사용하여 password 디렉토리를 만들었다.

 

#2 password 디렉토리로 이동하기

사진은 생략되었지만 cd password 명령어를 사용해 디렉토리로 이동하였다.

 

#3 현재 디렉토리로 /etx/passwd 파일 복사해오기

 

 

vi편집기를 사용하여 쉘 스크립트를 만들어주었다

 

 

 

쉘 스크립트에 

 // 복사 명령어 - cp 복사파일 복사할위치

를 사용하였다.

 

 

 

그 결과 옮겨와 졌고 cat 명령어를 이용해 passwd 파일 내 글을 출력했다.

 

(ls명령어를 사용해 passwd 파일이 password 디렉토리 밑에 있는 걸 캡처해놨었는데 사진이 저장이 안 되었다. 대신 passwd 파일을 password 디렉토리에서 읽는 사진으로 대체한다.)

 

 

 


 

//매개변수 명령어

 

 

vi편집기를 이용해 param1.sh라는 이름의 쉘 스크립트를 작성한다.

 

 

큰 따옴표 안 \(역슬래시)는 $의 의미를 잃어 매개 변수 명령어가 아닌 그대로 출력된다. 

 

$0 - 쉘 스크립트 이름 

$1, $2 , …  - 매개변수1,2,…

$* - 입력된 매개변수들을 나열

$# - 입력된 매개변수의 개수

 

 

 

 

./위파일이름 매개변수 a b c d를 실행한 결과이다.

 

 

 


//실습 2 - c파일을 매개 변수로 받아 컴파일한 후 실행하는 스크립트

 

 

 

vi편집기를 사용하여 hello.c이름의 c언어를 이용하여 파일을 작성하였다.

 

 

그 후 param2.sh 라는 이름의 쉘 스크립트를 작성해주었다.

 

 

 

gcc를 사용해 컴파일 해준 뒤 컴파일된 실행파일을 작동시킨다.

 

 

완-료

 

 

 


 

//date 출력

 

 

그냥 date만 입력하면 요일 날짜 달 년 시:분:초 오전/오후 기준시간 이 뜬다

 

하지만 포맷을 추가하면 원하는 정보만 출력할 수 있다.

 

%Y - 년도 (4자리 전부)

%y - 년도 (뒤 2자리)

%m - 월

%d - 일

 

 

 


//명령어 조건 실행

# 명령어1 && 명령어2 - 명령어 1의 실행 결과가 성공(exit status가 0)이면, 명령어 2 실행

 

 

명령어 1은 swing 파일을 생성하는 것으로 하였고

이 결과가 성공하면 명령어 2인 ls를 실행한다.

그 결과, swing파일이 제대로 생성돼 ls명령어가 실행되었다.

 

 


 

# 명령어1 || 명령어2 - 논리 합 명령어 1의 실행 결과가 실패 (exit status!=0)이면, 명령어 2 실행

 

 

명령어 1은 hello.sh 파일을 실행하는 것이다.

그 결과가 실패(종료 상태가 0이 아닌 경우)이면 큰 따옴표 안 내용을 출력한다.

그 결과, 실행이 정상적으로 실행되었지만 따옴표 안 내용도 출력이 되었다.

 

hello.sh파일은 아까 만든 파일이었다. 명령어1이 실행되었지만 명령어2가 실행된 이유는

내가 종료 상태를 10으로 지정하여 스크립트를 종료했기 때문이다.

 

기억 안 날까봐 hello.sh 파일 코드를 가져왔다.

 

 

 

 

 


//사용자 입력 - read 변수명

 

 

vi편집기를 이용하여 read1.sh를 생성해준다.

 

 

사용자에게 변수명 name으로 이름을 입력받는다.

그 뒤 my name is $name을 출력한다

$name은 사용자가 입력한 이름이다.

 

 

 

read1.sh 파일을 실행시키자 입력을 하도록 커서가 뜬다.

ming을 입력하고 엔터를 누르자 My name is ming이 뜨는 걸 알 수 있다.

 

 


//사용자 입력 옵션 - read -p 변수명

옵션 -p는 입출력을 한 행에서 처리한다.

 

 

 

vi편집기를 사용하여 rea2.sh라는 이름의 파일을 생성해준다 

(read2.sh로 하려 했는데 실수했다...)

 

 

 

명령어를 하나하나 천천히 뜯어보도록 하자.

 

read -p 명령어를 사용해 입출력을 동시에 받는다.

"name1: "을 출력한 뒤 사용자에게 이름을 입력받고 이를 name1이라는 변수에 저장한다.

그리고 name2도 똑같은 방식으로 입출력된다.

 

그 후 if문을 사용해 name1과 name2의 동일 여부를 확인한다.

이때 코드에서는 name1과 name2가 문자열이 아닌 변수라는 걸 프로그램에게 알려주기 위해 변수 이름 앞에 $를 붙여야 한다.

 

만약 name1과 name2가 같다면 same을 출력하고 그렇지 않다면 not same을 출력한다.

 

fi는 if문이 끝난 것을 나타내는 finish의 준말,,, 이후 end를 출력해낸다.

 

 

 

해당 파일을 실행한 결과

name1: 이 출력되고 입력을 하도록 커서가 뜬다. 나는 ming을 입력해주고 엔터를 눌렀다.

그 후 name2: 가 출력되고 사용자가 입력하도록 커서가 뜬다. 난 nyuk을 입력해주었다.

두 변수에 저장된 값이 다르자 not same이 뜨는 걸 알 수 있다. 그 후 end가 뜨고 실행이 종료되었다.

 

한 번 더 실행해 name1과 name2에 같은 값을 입력해주자 same 이 뜨고 end가 출력된 뒤 실행이 종료되었다.

 

 

 

 


//사용자 입력 -문서를 통한 입력 

위에 나온 명령어 read를 사용하는 표준 입력이 아닌 문서를 통해 입력받는 방식이다.



TERMINATOR

바로 실습을 통해 명령어를 이해해보자.

 

 

terminator1이라는 이름의 파일을 vi편집기를 통해 만들어준다.

 

 

cat명령어를 입력해준 뒤 << 터미네이터를 입력해줬다. 나는 end를 사용했다.

원하는 내용을 입력하다가 다시 터미네이터 end를 입력해주었다.

 

 

 

다른 명령어는 출력되지 않고 입력 내용만 잘 출력되었다.

하지만 내가 터미네이터 뒤에 입력한 내용은 위 사진처럼 뜨는 걸 볼 수 있다.

 

 

 

 


//if문

 

 

조건을 입력해주는 []와 괄호 안 조건식 사이에는 무조건 공백이 있어야 한다.

 

 

문자열 사이 비교 기호는 =또는 == 둘 다 사용할 수 있다.


 

 

 

if ~else문에서는 then을 다음과 같이 다음 행에 써도 되고

 

 

if 조건문 다음에 ;(세미콜론)을 붙인 뒤 띄어 쓰고 then을 써줄 수 있다.

관련글 더보기