회사 업무 중 모듈 제작 작업 과정에서 반복된 커맨드를 작성하다 보니 그냥 스크립트 하나 만들어서 동작하는 게 효율적일 거란 생각이 들어서 생애 처음으로 쉘 스크립트를 작성해 보았다. 쉘 스크립트는 반복작업의 자동화와 컴파일 과정 없이 빠른 속도로 진행된다는 점의 장점이 있기에 만약 어떤 반복적인 작업이 있는 경우 사용하는 것을 추천한다.
쉘 스크립트를 활용한 업무 효율은 정말 좋았고 내가 사용하면서 느꼈던 쉘 스크립트에 사용하면 좋은 명령어와 기본 문법들을 알아보겠다.
1. 쉘 스크립트 생성
리눅스 서버 내 원하는 디렉토리에서 진행하면 된다.
# /home/test
vi test.sh
# test.sh
echo "Hello!"
우선 sh 확장자로 파일을 생성해준다. vi를 사용해 에디터를 활성화한 뒤 i를 입력해 INSERT 모드로 변경하고 간단하게 echo를 입력한 뒤 ESC 입력 후 :wq 를 입력해 저장하고 종료하면 된다.
# /home/test
chmod +x test.sh
# or
chmod 755 test.sh
파일이 생성이 되었다면 chmod를 사용해 실행 권한을 주자.
# /home/test
./test.sh
쉘 스크립트 실행은 위와 같이 입력하면 실행이 된다. 그럼 Hello! 가 출력되는 것을 확인할 수 있을 것이다.
편집은 다시 vi 명령어를 통해 에디터를 활성화해주고 수해주면 된다.
2. 변수 선언 및 사용
변수 선언을 할 땐 '변수명=값' 형태로 선언해주면 된다. 주의할 점으로 공백 없이 선언을 해주어야 한다.
선언 후 사용을 할 땐 '$변수명' 형태로 사용해주면 된다. '${변수명}' 형태로 사용해 주어도 되고 따옴표 안에 넣든 넣지 않든 편한 대로 호출하여 사용해 주면 된다. 아래를 참고하자
# test.sh
echo "출력 =>"
echo ""
A="TEST1"
B = "TEST2"
echo "$A"
echo "${A}"
echo "$B"
echo $A
echo ${A}
변수 B 선언 시 '=' 옆에 공백을 둔 상태로 선언을 했더니 아래처럼 출력이 되었다. 꼭 붙여서 변수를 선언해주자.
# /home/test
./test.sh
출력 =>
./test.sh: line 2: B: command not found
TEST1
TEST1
TEST1
TEST1
문자는 큰따옴표를 사용하여 선언, 숫자를 선언할 땐 쌍따옴표 없이 선언해 주면 된다.
그리고 ``을 사용해 명령어를 변수에 선언해 줄 수 있다.
# test.sh
# 문자는 "" 사용
A="문자"
# 숫자는 "" 미사용
B=1
# 명령어는 `` 사용
C=`cat ./test.sh`
echo $A
echo $B
echo $C
아래와 같이 출력되는 것을 확인할 수 있다.
# /home/test
./test.sh
문자
1
A="문자" B=1 C=`cat ./test.sh` echo $A echo $B echo $C
배열을 선언할 땐 아래와 같이 정의하면 된다.
# test.sh
A=("A1" "A2" "A3" "A4") # 문자 배열
B=(1 2 3 4 5) # 숫자 배열
echo ${A[1]} # 인덱스 1 출력
echo ${A[@]} # 모든 인덱스 출력
echo ${A[*]} # 모든 인덱스 출력
echo ${#A[@]} # 배열 길이 출력
A[1]="A5" # 인덱스 1 수정
echo ${A[*]}
정의할 땐 공백을 통해 배열 값을 정의되고 특정 인덱스 값을 수정할 땐 해당 인덱스에 값을 다시 넣어주면 된다.
위와 같이 작성하면 아래와 같이 출력이 될 것이다.
# /home/test
A2
A1 A2 A3 A4
A1 A2 A3 A4
4
A1 A5 A3 A4
변수를 숫자로 선언하고 해당 변수를 연산하는 방법은 아래와 같다.
# test.sh
# +, -, *, /, %
A=1
A=$((A+1))
echo $A
A=$[A+1]
echo $A
expr $A + 1
# 출력
2
3
4
연산을 할 때 $[] 또는 $(())를 사용하여 연산을 진행한다. expr을 사용하면 연산과 동시에 echo처럼 출력이 될 것이다.
2. 조건문 IF
쉘 스크립트에서의 기본적인 if 문 선언은 아래와 같다.
# test.sh
# 형식 => if [ 값1 조건식 값2 ]; then 실행문 fi
A=1
B=1
if [ $A -eq $B ]; then
echo "Success!"
fi
else 또는 else if는 아래와 같이 선언하면 된다.
# test.sh
# 형식 => if [ 값1 조건식 값2 ]; then 실행문 elif[ 값1 조건식 값2 ]; then 실행문 else 실행문 fi
A=1
B=1
if [ $A -gt $B ]; then # A가 더 클 경우
echo "A is bigger"
elif [ $A -eq $B ]; then # A B가 같을 경우
echo "A B is the same"
else # 위 조건에 해당하지 않을 경우
echo "B is bigger"
fi
조건문 종류는 아래와 같다.
- 비교식
[ -z $A ] | A 길이가 0이면 TRUE | [ -n $A ] | A 길이가 0이 아니면 TRUE |
[ $A -eq $B ] | A와 B가 같으면 TRUE | [ $A -ne $B ] | A와 B가 다르면 TRUE |
[ $A -gt $B ] | A가 B보다 크면 TRUE | [ $A -ge $B ] | A가 B보다 크거나 같으면 TRUE |
[ $A -lt $B ] | A가 B보다 작으면 TRUE | [ $A -le $B ] | A가 B보다 작거나 같으면 TRUE |
[ 조건식A -a 조건식B ] | 조건식이 모두 TRUE면 TRUE &&(AND 연산) 와 동일 |
[ 조건식A -o 조건식B ] | 조건식 하나라도 TRUE면 TRUE ||(OR 연산) 와 동일 |
- 파일 관련
[ -e $A ] | A가 존재하면 TRUE | [ -d $A ] | A가 디렉토리면 TRUE |
[ -f $A ] | A가 파일이면 TRUE | [ -S $A ] | A가 소켓이면 TRUE |
[ -L $A ] | A가 심볼릭 링크면 TRUE | [ -e $A ] | A가 Special character file이면 TRUE |
[ -r $A ] | A 파일이 읽기 가능하면 TRUE | [ -w $A ] | A 파일이 쓰기 가능하면 TRUE |
[ -x $A ] | A 파일이 실행 가능하면 TRUE | [ -s $A ] | A 파일 크기가 0 보다 크면 TRUE |
[ $A -nt $B ] | A 파일이 B 파일보다 최신이면 TRUE | [ $A -ot $B ] | A 파일이 B 파일보다 오래되면 TRUE |
[ $A -ef $B ] | A 파일과 B 파일 같으면 TRUE | [ !조건식A ] | 조건식A 의 부정형 (NOT 연산) |
파일 조건문은 쉘 스크립트를 실행하는 현재 디렉터리를 기준으로 경로와 파일 이름을 넣어주면 된다.
# test.sh
if [ -f ./test.sh ]; then
echo "Exists File !!"
fi
만약 다른 디렉터리의 파일을 확인하고 한다면 cd 명령어를 통해 이동을 한 뒤 조건문을 진행해 주면 된다.
# test.sh
cd /home/test
if [ -f ./test.sh ]; then
echo "Exists File !!"
fi
'Server > Linux' 카테고리의 다른 글
[Linux] 쉘 스크립트 사용하기(사용자 입력 read) (0) | 2024.07.15 |
---|---|
[Linux] 쉘 스크립트 사용하기(반복문 for, while) (0) | 2024.07.15 |