shell script

#2 변수 선언, 기호

Sila 2022. 12. 13. 00:51

1. intro

쉘 스크립트 파일의 확장자는 .sh라고 표기한다.

 

shell script 카테고리에서 공부할 것은 대부분의 프로그래밍 언어의 기본적인 기능인

 

- 변수 선언 및 사용

- 제어문 (조건문, 반복문 등..)

- 스크립트 명령어 (echo, read, exec 등..)

- 배열

- 함수

 

등이 있다. 하나씩 알아보자.

 

우선 .sh 확장자를 가진 파일을 만들고 가장 윗줄에 다음과 같이 작성한다.

 

#!/bin/bash

 

이는 html의 head 부분에 메타데이터를 넣어줄 때가 있는 것처럼 sh 파일의 가장 윗줄에도 메타 데이터가 들어간다.

 

이는 이 파일을 어떤 쉘로 읽을 것인지를 나타내주는데, 위처럼 마지막에 /bash로 끝난다면

 

bash를 이용해 이 파일의 코드를 해석하겠다는 것을 의미한다.

 

2. 변수 선언, 출력

 

다음으로 변수에 값을 할당해주자.

 

쉘 스크립트에서 변수는 따로 선언할 필요없이 바로 값을 대입할 수 있다.

 

#!/bin/bash

name=lsj
# 주석을 달고 싶다면 //대신 #을 사용한다.

 

이러면 name 변수 안에 lsj라는 string값이 할당된다.

 

파일을 실행했을 때 이 값을 출력하고 싶다면 echo 명령어를 사용하면 된다.

 

(js의 console.log와 동일한 기능)

 

#!/bin/bash

name=lsj

echo $name
# 변수를 사용하려면 $를 붙이고 변수명을 쓰면 된다.

echo ${name}
# 중괄호는 없어도 되지만, shell 종류에 따라 필요한 경우도 있다는 것을 기억해두자.

 

이 파일을 실행하면 name의 value가 출력될 것이다.

 

실행은 다음과 같이 ./[파일명].sh를 터미널에 입력하면 된다.

 

./shell.sh

 

실행 권한이 없다고 에러가 뜨면 관리자 권한 (sudo)로 실행을 하거나 다음과 같이 실행 가능하도록 파일을 수정하면 된다.

 

chmod +x ver.sh

 

파일이 읽기 가능한지, 쓰기 가능한지, 실행 가능한지는 ls -al 명령어를 이용해 확인할 수 있고,

 

방금 한 작업은 파일이 실행가능하도록 수정해준 것이다.

 

 

쉘 스크립트는 다른 언어에 비해 예약어들의 종류와 역할을 기억하는 것이 다른 언어에 비해 중요하다.

 

쉘 스크립트 자체가 어떤 기능을 하기보다는

 

컴퓨터의 다른 파일들이 작동하는 매개 역할을 주로 수행하는 언어라서 그런 것 같다.

 

그래서 파일을 실행할 때 그 시점에서 변수를 함께 넣어줘야 하는 경우도 많고,

 

(즉, 스크립트 파일 외부에서 변수를 넣어줘야 하는 경우가 많다.)

 

그 변수를 어떤 식으로 읽어서

 

사용할 것인지도 중요하기 때문에 예약어의 역할이 커지는 것 같다.

 

아무튼 자주 사용되는 예약어를 확인해보자.

 

$0 : 현재 스크립트의 이름

$$ : 현재 스크립트의 process id

$? : 프로세스의 exit 상태
# 정상적으로 종료되었다면 0이 출력

$1 ~ $9 : 첫 9개의 변수

$# : sh 파일에 전달된 변수의 총 갯수

$@ : 파일에 전달된 모든 변수

 

위에 3개는 메타 데이터에 가깝고, 아래 3개는 실제로 스크립트에서 사용하는 데이터들에 가깝다.

 

다음과 같이 스크립트를 작성해보자.

 

# res.sh

#!/bin/bash

echo "\$$ : " $$

echo "\$0 : " $0

echo "\$1 : " $1 

echo "\$2 : " $2 

echo "\$3 : " $3

echo "\$# : " $#

echo "\$@ : " $@

echo "\$? : " $?

 

이를 실행해보면 다음과 같이 출력된다.

 

sila@DESKTOP:~/study/shell$ ./res.sh

$$ :  778
# res.sh를 실행했을 때의 process id
# 실행할 때마다 다른 값이 나온다.

$0 :  ./res.sh
# process의 이름

$1 :
# 스크립트에 준 첫번째 변수
# 변수 없이 ./res.sh만 실행하면 공란으로 나온다.

$2 :
# 스크립트에 준 두 번째 변수
# 변수 없이 ./res.sh만 실행하면 공란으로 나온다.

$3 :
# 스크립트에 준 세 번째 변수
# 변수 없이 ./res.sh만 실행하면 공란으로 나온다.

$# :  0
# 변수를 주지 않았으므로 0으로 나온다.

$@ :
# 파일에 전달된 변수가 없으므로 공란이 나온다.

$? :  0
# 정상적으로 실행 후, 종료되었으므로 0이 출력된다.

 

변수를 주려면 쉘 스크립트 파일을 실행 시 옆에 넣어줄 변수를 적어주면 된다.

 

sila@DESKTOP:~/study/shell$ ./res.sh aa11 bb22

 

실행할 sh파일 옆에 넣고 싶은 변수를 자유롭게 적어주면 된다.

 

나는 aa11, bb22를 넣었다. 이를 실행하면 공란이었던 $1, $2, $@ 항목에 내가 입력한 변수들이 출력될 것이다.

 

(변수를 두 개만 입력했으므로 $3은 여전히 공란이다.)

 

4개를 넣는다면 $#에만 $4 변수가 출력된다.

 

 

다음과 같은 예약어들도 알아두면 좋다.

 

echo $USER
# script를 실행하는 류저의 이르ㅜㅁ

echo $HOSTNAME
# 스크립트가 실행되는 머신의 hostname

echo $RANDOM
# 난수 (실행마다 다른 숫자를 리턴)

 

3. 변수 읽기

프로그램 실행 중, 사용자가 변수를 입력하면 그걸 읽어주는 기능도 있다.

 

read 명령어를 사용하면 사용자가 중간 중간 데이터를 첨가해줄 수 있다.

 

#!/bin/bash

read var1
# 입력한 값을 var1 변수의 값으로 넣는다.

read -n 3 var2
# 입력한 값을 var2에 저장하되, 3글자까지만 입력받는다.

read -p "Input data : " var3
# 문자열을 프롬프트에 출력하며 변수를 받아 var3에 저장한다.

echo 
echo $var1
echo $var2
echo $var3

 

이상의 변수 선언과 사용은 sh 파일 내부가 아닌 터미널에서 바로 사용해도 되는 것들이다.

 

쉘에 입력할 명령들을 모아 둔것이 .sh 파일들이니 당연하다면 당연하다.

 

그런데 환경 변수 같은것들은 잘못 건들면 큰일나니 이왕이면 vs code에서 .sh 파일 내부에

 

작성을 해주는 것이 좋을 것 같다.

 

4. 기타 에러 해결

.sh 파일을 실행하는데 크게 두 가지의 에러를 마주칠 수 있다.

 

첫 번째는 위에서 언급한 권한 에러이고, 하나는 bad interprater 에러인데,

 

윈도우와 리눅스의 파일 저장 방식이 달라서 생기는 문제이다.

 

이를 해결하려면 파일의 형식을 바꿔주면 된다.

 

다음과 같이 터미널에 입력해 파일의 형식을 알아볼 수 있다.

 

file shellScript.sh
>> shellScript.sh : Bourne-Again shell script, UTF-8 Unicode text executable, with CRLF line terminators

 

이제 수정하고 싶은 파일을 vi로 열어준다.

 

vi shellScript.sh

 

esc를 눌러 명령 모드로 진입한 후, 다음과 같이 파일 포맷을 바꿔줄 수 있다.

 

:set fileformat=unix

 

저장, 종료 후 다시 file 명령어로 포맷을 보면 가장 마지막 wiht CRLF line terminator 부분이 사라졌을 것이다.

 

이제 다시 파일을 실행해보면 된다.

'shell script' 카테고리의 다른 글

#4 switch-case문, 함수  (0) 2023.01.14
#3 조건문, 반복문  (0) 2022.12.18
#1. shell  (0) 2022.12.10