쉘 스크립트 프로그래밍 - 2

2019. 10. 5. 14:56임베디드/리눅스시스템프로그래밍

쉘 스크립트 문법은 까다로운 부분이 많다. 기본 문법이 있고, 가변적으로 사용할 수 있는 문법도 있다. 다만 가변적인 문법은 개발 환경에 따라서 실행되기도 하고, 아니기도 하기때문에 최대한 기본 문법을 익히는 편이 낫다

 

이전 포스팅에서 마지막으로 짠 쉘 스크립트 코드다

#!/bin/bash

array_list=("hello" "our" "world")
echo ${array_list[0]}
echo ${array_list[*]}
echo ${array_list[@]}
echo ${#array_list[*]}

filelist=($(ls))
echo ${filelist[*]}

 

만일 여기서 중괄호를 빼고 출력한다면 어떻게 될까?

#!/bin/bash

array_list=("hello" "our" "world")
# echo ${array_list[0]}
echo $array_list[0]

 

즉 중괄호를 하지 않는다면 $array_list로 인식해서 디폴트인 0번 인덱스를 출력한다

 

echo 출력과 더불어 printf도 출력 함수로 사용할 수 있다. echo는 기본적으로 줄바꿈이 되지만, printf는 따로 개행을 넣어야만 한다. 그리고 printf는 형식지정자가 지원된다는 점이 있다

#!/bin/bash
echo "hello world"
printf "hello world\n"
printf "%s %s\n" hello world

 

쉘 스크립트에는 사전에 정의된 지역 변수 조합이 있다

$$ 쉘 스크립트의 pid

$0 쉘 스크립트의 이름

$1 ~ $9 명령 인수

$* 명령 인수 리스트

$# 명령 인수 리스트 개수 

#!/bin/bash

echo $$ $0 $* $#

 

expr 명령어로 숫자 연산이 가능은 한데, 쉘 스크립트에서는 매우 복잡하게 진행된다

1) 역 작은 따옴표 `로 식을 묶는다. expr부터 묶어야 한다

2) 모든 연산자에 대해서 띄어쓰기로 구분해야만 한다

3) 괄호와 곱하기만 역슬래시로 묶어야 한다 

#!/bin/bash

# expr (10+20)/8-8

num=`expr \( 10 + 20 \) / 8 - 8`
echo $num

 

if 조건문을 사용할 수 있다. 대괄호 [ ]에 condition을 넣을 땐 반드시 양쪽에 공백을 포함해야만 한다. 그렇지 않으면 syntax error를 출력하게 된다. 쉽게 생각해서 then과 fi는 { }로 생각하면 좋다

#!/bin/bash

if [ $1 != $2 ]
then
    echo "different"
else
    echo "same"
fi

 

-z -n 옵션으로 널 문자인지 아닌지 확인할 수 있다. -z 옵션은 널 문자이면 참, -n 옵션은 널 문자가 아니라면 참이 된다

#!/bin/bash

num=1
if [ -n $num ]
then
    echo "hello world"
fi

1은 널 문자가 아니기 때문에 Hello world를 출력하게 된다

 

대소비교는 조금 까다롭다 <, >는 가능하지만, <=, >=는 조건문 양쪽을 한 번 더 []로 덮거나 혹은 기초 문법을 사용하는 방법밖에 없다. 

 #!/bin/bash

# 값1 -gt 값2 : 값1 > 값2 (greater than)
# 값1 -lt 값2 : 값1 < 값2 (lesser than)
# 값1 -ge 값2 : 값1 >= 값2 (greater or equal)
# 값1 -le 값2 : 값1 <= 값2 (lesser or equal)
# 값1 -eq 값2 : 값1 == 값2 (equal)
# 값1 -ne 값2 : 값1 != 값2 (not equal)

if [ $1 -gt $2 ]
then
    echo "$1 is greater than $2"
fi

if [ $1 -lt $2 ]
then
    echo "$1 is lesser than $2"
fi

if [ $1 -ge $2 ]
then
    echo "$1 is greater than or equal $2"
fi

if [ $1 -le $2 ]
then
    echo "$1 is lesser than or equal $2"
fi

if [ $1 -eq $2 ]
then
    echo "$1 is equal to $2"
fi

if [ $1 -ne $2 ]
then
    echo "$1 is not equal to $2"
fi