쉘 스크립트 기초

박정훈·2022년 5월 20일
0

shell_script

목록 보기
1/1

1. 쉘 스크립트 파일 만들기 및 실행

쉘 스크립트 파일을 만들 때에는 파일의 첫 번째 줄에 사용하고 있는 쉘을 지정해야 한다. 형식은 다음과 같다.
#!/bin/bash
쉘은 파일에 나타나는 순서대로 명령을 처리한다.
쉘은 명령을 찾기 위해 PATH라는 환경변수를 사용한다.
쉘이 특정 스크립트를 찾을 수 있게 하는 방법은 2가지가 있다.

  • PATH 환경 변수에 쉘 스크립트 파일이 있는 디렉토리 추가
  • 프롬프트에서 쉘 스크립트 파일을 참조하는 절대 또는 상대 파일 경로 사용하기
    예) ./test1

쉘이 특정 파일을 실행하려면 파일에 실행권한이 있어야한다.
chmod u+x test1를 통해 파일 소유자에게 실행권한을 줄 수 있다.

2. 변수 사용하기

2-1. 환경 변수

set 명령어를 사용하면 사용할 수 있는 환경 변수의 전체 목록을 표시할 수 있다.
를이용하면스크립트안에서환경변수를사용할수있다.를 이용하면 스크립트 안에서 환경변수를 사용할 수 있다.{변수}형식으로도 변수를 참조할 수 있다. 더 명확한 방식이다.

#!/bin/bash
display user information from the system.
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME

실제 달러 기호를 사용하고 싶다면 \를 이용해서 이스케이프 시퀀스를 사용해야한다.

echo "The cost of the item is \$15"
>> The cost of the item is $15

2-2. 사용자 변수

사용자 변수는 대소문자를 구분한다. 최대 20글자로 알파벳, 숫자 또는 밑줄로 이루어진 텍스트 문자열이 될 수 있다.
값은 등호를 사용하여 사용자 변수에 할당된다. 이 때, 변수, 등호, 값 사이에는 빈 칸을 둘 수 없다.

var1=10
var2=-57
var3=testing
var4="still more testing"

쉘 스크립트는 변수 값을 사용하는 데이터 유형을 자동으로 결정한다. 쉘 스크립트 안에서 정의된 변수는 쉘 스크립트의 수명이 다할 때까지 그 값을 유지하지만 쉘 스크립트가 완료되면 지워진다. 사용자 변수도 환경 변수처럼 $를 사용하여 참조할 수 있다.

#!/bin/bash
days=10
guest="Katie"
echo "$guest checked in $days days ago"
>> Katie checked in 10 days ago

3. 명령 치환하기

명령의 출력을 변수에 저장하는 것
명령의 출력을 변수에 지정하는 방법

  • 역따옴표 문자(`)
  • $() 형식
    쉘은 명령 치환 구문 안에 있는 명령을 실행하고 변수에 출력 결과를 저장한다. 할당 등호와 명령 치환 구문 사이에 빈 칸이 없어야 한다.
#!/bin/bash
today=$(date +%y%m%d)
ls /usr/bin -al > log.$today

위와 같은 방식으로 로그 파일을 생성할 수 있다.

명령 치환은 포함된 명령을 실행시키기 위해 서브쉘을 만든다. 서브쉘은 스크립트를 실행 중인 쉘에서 만들어진 별도의 자식 쉘이다. 따라서 스크립트에서 만든 모든 변수는 서브쉘 명령에 사용할 수 없다.
./ 경로를 사용하여 명령 프롬프트에서 명령을 실행할 때도 서브쉘이 만들어지지만, 경로 없이 명령을 실행한 경우에는 만들어지지 않는다. 그러나 내장된 쉘 명령을 사용하는 경우에는 서브쉘이 만들어지지 않는다. 명령 프롬프트에서 스크립트를 실행하는 경우에는 주의!

4. 입력과 출력 리다이렉트하기

입력을 키보드로 받는 것이 아니라 파일로도 받는 것을 의미한다. 출력을 화면에만 출력하는 것이 아니라 파일이나 매개변수로 주는 것을 의미한다.

4-1. 출력 리다이렉트

리다이렉트의 가장 기본적인 형태는 파일 명령의 출력을 전송한다. bash 쉘은 이를 위해 >기호를 사용한다.

command > outputfile

출력 파일이 이미 존재하면 리다이렉트 연산자는 기존의 파일을 새로운 파일 데이터로 덮어 씌운다.(이전 데이터는 사라지므로 주의!)

>>를 사용하면 파일의 내용을 덮어쓰는 대신 기존 파일의 내용에 덧붙인다.

4-2. 입력 리다이렉트

입력 리다이렉트의 기호는 <이다.
입력을 리다이렉트하는 또 다른 방법은 인라인 입력 리다이렉트라고 한다.
인라인 입력 리다이렉트 기호는 <<이다. 이 기호이외에도 입력에 쓸 데이터의 시작과 끝을 지정하는 텍스트 마커를 정해야 한다. 사용자는 텍스트 마커로 어떤 문자열 값이든 사용할 수 있으나 데이터 시작 및 데이터의 끝이 똑같아야 한다.

command << marker
data
marker

5. 파이프

명령의 출력을 파일에 리다이렉트 하는 대신 다른 명령으로 리다이렉트 하는 것을 파이프라고 한다. 기호는 |이다.
파이프는 두 개의 명령을 연속으로 실행하는 것이 아니다. 리누스 시스템은 내부적으로 이 두명령을 결합하고 동시에 실행시킨다. 첫 번째 명령은 출력을 생성하고 두 번째 명령에 즉시 전송된다. 데이터를 전송하는데 어떠한 중간 파일 또는 버퍼 영역도 사용되지 않는다.

6. 계산하기

쉘에서 수학 연산을 수행하는 방법

6-1. expr 명령

6-2. 대괄호 사용하기

#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1 * ($var2 - $var3)]
echo The final result is $var4

6-3. 부동소수점을 위한 해법 bc사용

부동소수점 계산은 scale이라는 내장 변수가 제어한다. scale의 기본값은 0이다.

6-3-1. 스크립트에서 bc사용하기

#!/bin/bash
var1=$(echo "scale=4; 3.44 / 5" | bc)
echo The answer is $var1
>> The answer is .6880
#!/bin/bash
var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ( $var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)

echo The final answer for this mess is $var5

위 코드는 인라인 입력 리다이렉트를 이용한다.

7. 스크립트 종료하기

쉘에서 실행되는 모든 명령은 쉘에 처리가 끝났음을 알려주는 종료 상태를 사용한다. 종료 상태는 명령 실행이 완료되면 0과 255 사이의 정수 값을 명령으로부터 쉘로 전달한다.

리눅스는 마지막으로 실행된 명령의 종료 상태 값을 보관하는 특별 변수인 $?변수를 제공한다.
관례에 따라 성공적으로 완료된 명령의 종료 상태는 0이다. 명령이 오류를내고 완료되면 양의 정수 값이 종료 상태에 저장된다.

  • 0: 성공
  • 1: 알 수 없는 오류, 유효하지 않은 매개변수 제공
  • 2: 쉘 명령을 잘못 사용
  • 126: 명령을 실행할 수 없음, 사용자가 명령을 실행할 권한이 없음
  • 127: 명령을 찾을 수 없음

7-1. exit 명령

exit 명령은 스크립트가 종료될 때 종료 상태를 지정할 수 있다.
exit 명령의 매개변수로 변수를 지정할 수도 있다.

#!/bin/bash
echo The answer is 10
exit 5
profile
정팔입니다.

0개의 댓글