//쉘 스크립트 생성
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을 써줄 수 있다.
[Linux] 4주 과제3 (0) | 2020.06.02 |
---|---|
[Linux] 4주 과제2 (0) | 2020.06.02 |
[Linux] vi편집기 (0) | 2020.05.26 |
[Linux] 디렉토리 생성 실습 및 파일의 시스템의 논리적 구조 작성 (0) | 2020.05.26 |
[Linux] 하드 링크, 소프트 링크 (0) | 2020.05.26 |