본문 바로가기

Linux

Linux 스크립트 구조, 실행권한, 환경변수, 변수, 확장

728x90

스크립트의 구조

vi script.sh

스크립트는 .sh 확장자를 갖는다.

[+] 참고 : Linux에는 확장자 개념이 존재하지 않는다. 다만, 사용자의 편의성을 위해 확장자처럼 보이도록 파일명을 지을 뿐이다.

 

#!/bin/bash

스크립트의 맨처음에는 셔뱅(Shebang)이 온다.

Bash 쉘의 경로를 지정해준다.

 

# 주석 : 'hello world!' 출력

주석은 #으로 단다.

 

echo hello world!

Linux 명령어가 스크립트에 그대로 사용될 수 있다.


실행권한

스크립트 실행 권한 부여 방법

chmod u+x script.sh

환경변수

Linux는 윈도우와 다르게 linux는 입력된 명령어를 환경변수에서 명령어를 검색한다.

즉, 현재 디렉토리(pwd)는 전혀 검색하지 않는다.

 

환경변수는 명령어 env 또는 echo $PATH를 통해 조회할 수 있다.

env

..
..
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

 

따라서 script.sh를 실행해도 스크립트 실행이 되지 않는다. script.sh가 위치한 경로가 환경변수에 등록되어 있지 않기 때문이다.

>> script.sh

script.sh: command not found

 

 

그래서 명령어에 script.sh가 위치한 경로를 아래와 같이 명시해줘야 한다.

>> ./script.sh
hello world!

 


변수 다루기

Linux 스크립트에서 변수는 '문자열'을 저장한다.


변수선언

변수명=값

주의할 점은 등호(=) 앞뒤에 공백이 있어서는 안된다.

예시

variable.sh ############
myblog=bithub
echo $myblog
########################
bithub

변수 작명 규칙

1. 변수의 이름은 숫자로 시작할 수 없다.

2. 언더바(_)를 제외하고 특수 문자 또는 공백 문자를 사용할 수 없다.

3. 알파벳 대소문자, 숫자, 언더바만 사용할 수 있다.

4. 대소문자를 구분한다.

 

123myblog (x)
_myblog (o)
my+blog (x)
myBlog (o)
my_blog (o)
myblog ↔ MYBLOG

[+] 참고 : myBlog처럼 대소문자로 단어를 구분하는 방식을 'camel case'라고 한다.

[+] 참고 : my_blog처럼 언더바(_)로 단어를 구분하는 방식을 'snake case'라고 한다.

 


변수확장 - 언제나 헷갈리는 { }, " ", ' ', \

echo $myblog
>> bithub

echo ${myblog}
>> bithub

echo "$myblog"
>> bithub

echo '$myblog'
>> $myblog
# 작은 따옴표는 단순 문자로 해석된다.

echo " '$myblog' "
>>  'bithub' 
# 작은 따옴표가 큰 따옴표 안에 있으므로 단순 문자로 해석된다.

echo \$myblog
>> $myblog
# 백슬래쉬(\) 다음에 오는 문자는 단순 문자로 해석된다.

echo '*'
>> *

echo \*
>> *
# \다음에 오는 문자는 단순 문자로 해석된다.

echo *
>> script.sh variable.sh...
# 현재 디렉토리(pwd)의 파일들이 출력된다.

echo "bit     hub"
>> bit     hub
# 큰 따옴표는 공백도 다 포함한다.

echo -e "bit\nhub"
>> bit
>> hub
# 큰 따옴표는 제어문자를 인식하게 한다. 단, echo 사용 시 제어문자 해석을 위한 -e 옵션을 사용해야한다.

echo "*"
>> *
# 큰 따옴표는 와일드카드를 확장하지 않는다. 단, 명령어와 변수는 확장한다.

echo "a{1,2,3}"
>> a{1,2,3}
# 큰 따옴표는 와일드카드를 확장하지 않는다. 단, 명령어와 변수는 확장한다.

echo "$(date)"
>> Fri Mar 14 15:29:49 KST 2024
# 큰 따옴표는 명령어와 변수를 확장한다.

echo "`date`"
>> Fri Mar 14 15:29:49 KST 2024
# 큰 따옴표는 명령어와 변수를 확장한다.

echo "bit"hub""
>> bithub
# 큰따옴표 안에 있는 큰따옴표는 출력되지 않음. 큰따옴표 안에 있는 큰따옴표를 출력하려면 백슬래쉬(\) 사용

 

간단하게 큰따옴표는(" ")는 와일드카드와 중괄호를 제외하고 모든 것(명령어, 변수)을 확장한다고 생각하면 쉽다.

* 참고로 { }는 와일드카드가 아니다.

즉, 평상 시에는 큰따옴표(" ")를 쓰는 습관을 들이면 \n, \t, 여러 공백(     ) 모두 원하는대로 출력된다.

단, 문자 그대로 출력하길 원할 때만 작은따옴표(' ')를 쓰면 된다.

 


명령어확장

$() 또는 `명령어`를 이용하여 명령어 확장을 할 수 있다.

예제

today=$(date) # today=`date`
echo $today
>> Tue Mar 22 11:34:01 KST 2024

산술확장

$(())를 이용하여 연산식을 확장 할 수 있다.

예제

result=$((10 + 5))
echo $result
echo $(($result + 1))
echo $((result + 1))

참고로 산술식 안에서 변수 사용 시 $ 기호를 생략할 수 있다.

즉, echo $((result + 1))와 등가다.

* 주의 : 실수 연산을 불가능하다. 실수 연산은 bash calculator를 사용해야 한다.* 제곱 : ** (ex) 3**2 = 9

 

중괄호확장

<< echo a{1,2,3}
>> a1 a2 a3
<< echo a{0..9}
>> a0 a1 a2 a3 a4 a5 a6 a7 a8 a9

 

 

+번외. [  ]와 {  }의 차이

[]은 와일드카드, {}은 중괄호다.

와일드카드는 "특정 문자열을 찾을 때" 사용된다.

중괄호는 "단순한 패턴의 긴 문자열을 쉽게 생성할 때" 사용된다.

 

예를 들어,

echo a[123]

위 명령어는 파일 이름 a로 시작하고 1~3으로 끝나는 파일을 찾는데 사용된다.

echo a{123}

위 명령어는 단순히 echo a1 a2 a3를 일일이 치기 너무 귀찮으니까 줄여서 echo a{123}으로 줄여놓은 것이다.


입력받기

read 명령어를 사용하여 사용자로부터 입력을 받아 변수에 저장할 수 있다.

read -p 'input your blog name : ' yourblog
echo "Your blog name is $yourblog."

>> input your blog name : bithub
>> Your blog name is bithub.