스터디 : 리눅스 커맨드라인 쉘 스크립트 바이블 11장

호밀빵 굽는 쿼카·2022년 8월 21일
0

목차

여러 명령 사용하기

여러 명령어를 한줄에 적어서 사용가능

date; who

스크립트 파일 만들기

스크립트 파일은 첫줄에 #!/bin/bash 필수입니다.

#!/bin/bash
date
who

하지만 꼭 필요한 과정이 있습니다. 아래 두가지 중 한가지를 해야합니다.

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

하지만, 위 과정을 진행하더라도 umask 설정값이 002로 되어있기 때문에 chmode로 파일 소유자에게 실행 권한을 제공해야합니다.

메시지 표시하기

ehco + 문자열 = 간단한 텍스트 문자열

# test 스크립트
#!/bin/bash
echo The time and date are:
date
echo "Let`s see who`s logged into the system:"
who
# test 스크립트 실행
$ ./test
The time and date are:
Mon Feb 21 15:41:13 EST 2014
Let`s see who`s logged into the system:
who 결과
who 결과
who 결과

여기서 참고로 명령 출력과 같은 줄에 텍스트 문자열을 표시하고 싶다면, echo 명령에 -n 옵션을 사용하면됩니다.

# test 스크립트
#!/bin/bash
echo -n "The time and date are: "
date
echo "Let`s see who`s logged into the system:"
who
# test 스크립트 실행
$ ./test
The time and date are: Mon Feb 21 15:41:13 EST 2014
Let`s see who`s logged into the system:
who 결과
who 결과
who 결과

변수 사용하기

변수는 쉘 스크립트 안에서 임시로 정보를 저장했다가 스크립트 안의 다른 명령에서 활용할 수 있습니다.

1. 환경변수

쉘은 특정한 시스템 정보를 추적하기 위해 환경변수를 유지합니다. set 명령을 사용하면 사용할 수 있는 환경 변수의 전체 목록 표시 가능합니다.

환경변수의 이름 앞에 달러 기호 사용하면 스크립트 안에서 환경 변수를 활용할 수 있습니다.

# 쉘스크립트 생성
$ cat test2
#!/bin/bash
echo "User info for userid: $USER"
echo UID: $UID
echo HOME: $HOME

# 권한 추가
$ chomod u+x test2

# 쉘스크립트 실행
$ ./test2
User info for userid: Samantha
echo UID: 1001
echo HOME: /home/Samantha

주의할점❗️

$ echo "The cost of the item is $15"
The cost of the item is 5

위 예는 변수 $1(정의되지 않음) 을 표시한 다음 숫자 5를 표시한합니다. 하지만 실제 달러 기호를 표시하고 싶다면 백슬래시 문자를 사용해야합니다.

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

2. 사용자 변수

사용자 변수를 설정하면 데이터를 임시로 저장하고 스크립트 안에서 사용할 수 있으며, 이는 쉘 스크립트를 좀 더 실제 컴퓨터 프로그램과 같이 만드는데 도움이 됩니다.

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

$ chmod u+x test3
$ ./test3
katie checked in 10 days ago
Jessica checked in 5 days ago

변수 언급할 때마다 현재 할당된 값을 돌려줍니다. 쉘 스크립트 변수는 쉘 스크립트 안에서 그 값이 유지되지만 쉘 스크립트가 완료되면 지워집니다.

주의할점❗️

# test4
#!/bin/bash
value1=10
value2=$value1
echo The resulting value is $value2
$ chmod u+x test4
$ ./test4
The reulting value is 10
# test4
#!/bin/bash
value1=10
value2=value1
echo The resulting value is $value2
$ chmod u+x test4
$ ./test4
The reulting value is value1

변수값을 참조할때에는 달러 기호를 사용해주어야하지만, 값이 할당되는 변수에는 달러 기호를 사용해서는 안됩니다!!

3. 명령 치환하기

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

  • 역따옴표 문자 (`) : testing=`date`
  • ()형식:testing=() 형식 : testing=(date)
#!/bin/bash
today=$(date+%y%m%d)
ls /usr/bin -al > log.$today
# 결과
-rw-r--r--  1 user   user          769 Jan 31 10:15 log.140131

date+%y%m%d = 140131

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

1. 출력 리다이렉트

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

command > outputfile

# 기본은 파일을 생성하고 출력 저장
# 이미 파일이 존재하면 리다이렉트연산자는 기존 파일을 새로운 파일 데이터로 덮어씌움
$ who > test6
$ cat test6
user	pts/0	Feb 10 17:55
# 파일의 내용을 덮어쓰는 대신 출력을 덧붙일 때에는 >> 사용
$ date >> test6
$ cat test6
user	pts/0	Feb 10 17:55
Thu Feb 10 18:00:14 EDT 2014

2. 입력 리다이렉트

입력 리다이렉트는 출력 리다이렉트의 반대입니다. 입력 리다이렉트 파일은 파일의 내용을 받아서 명령으로 보냅니다.

command < inputfile

기억해야할 점은, 리다이렉트 기호는 부등호가 아니라 데이터가 흐르는 방향을 '가리키는'기호입니다.

wc 명령어는 데이터의 텍스트 양을 계산합니다.
결과(텍스트의 줄수/텍스트의 단어 수/텍스트의 바이트 수)

$ wc < test6
	2	11	60

인라인 입력 리다이렉트 기호는 << 으로 표시합니다.

$ command << marker
data
marker

  • EOF : 쉘 스크립트에서 입력 한 텍스트를 파일에 저장 할 때 주로 사용
  • 보조 프롬포트는 텍스트 마커로 쓰이는 문자열 값을 입력할때까지 계속해서 데이터를 더 요구합니다.

입출력 리다이렉트 예제

user:~$ cat <<EOF > file1.txt
hello
world
EOF
user:~$ cat file1.txt
hello
world

파이프

때로는 어떤 명령의 출력을 다른 명령의 입력으로 보낼 필요가 있습니다. 리다이렉트도 할 수 있지만 깔끔하지 못한 때도 있습니다.

위와 같이 rpm 명령은 시스템에 설치된 소프트웨어 패키지를 관리합니다. -qa 매개변수를 사용해서 존재하는 패키지 목록을 만들어 내지만 어떤 특정한 순서로 출력되지는 않습니다. 따라서 특정 패키지를 찾으려면 rpm 명령의 출력을 이용해서 찾기는 어려울 수 있습니다.

sort 명령어를 사용한다고 해도 보기가 어렵습니다.

이럴때 rpm -qa | sort | more more 명령으로 파이프함으로써 정보가 한 화면분 만큼 출력될때마다 출력을 멈추게 합니다.

계산하기

프로그래밍 언어들은 숫자를 조작할 수 있는 기능에서 각각의 특징이 있는데 쉘 스크립트에서는 과정이 어색합니다. 쉘 스크립트에서 수학 연산을 수행하는 방법은 이렇습니다.

expr 명령

$ expr 1+5
6
$ expr 5*2
expr: syntax error
$ expr 5\*2
10

대괄호 사용하기

bash 쉘은 Bourne 쉘과 호환되는 expr 명령을 포함하지만 수식을 처리하는 훨씬 쉬운 방법을 제공합니다.

$ var1=$[1+5]
$ echo $var1
6
$ var2=$[$var1*2]
$ echo $var2
12
$ cat test7
#!/bin/bash
var1=100
var2=50
var3=45
var4=$[$var1*($var2-$var3)
echo The final result is $var4
$ chmod u+x test7
$ ./test7
The final result is 500

쉘 스크립트에서 수학 연산을 할 때 중요한 제한

$ cat test8
#!/bin/bash
var1=100
var2=45
VAR3=$[$VAR1/$VAR2]
echo The final result is $var3
$ chmod u+x test8
$ ./test8
The final result is 2

bash 쉘 수학연산은 정수 연산만 지원합니다.

부동소수점을 위한 해법

bash 가 정수 연산만 할 수 있는 한계를 극복하기 위한 방법

1. bc(bash calculator)의 기초

bash 계산기는 실제로는 커맨드라인에서 부동소수점 표현식을 입력할 수 있도록 한 다음 수식을 해석하고, 이를 계산하여 결과를 되돌려주는 프로그래밍 언어입니다. bash 계산기는 다음을 인식합니다.

  • 숫자
  • 변수
  • 주석
  • 수식
  • 프로그래밍문(if-then)
  • 함수

bc 명령 사용해서 쉘 프롬포트에 bash 계산기를 사용할 수 있습니다.

부동 소수점 계산은 scale 이라는 내장 변수가 제어합니다.scale 기본값은 0 이고 이를 적절히 정하지 않으면 원하는 답을 찾지 못할수도 있습니다.

2. 스크립트에서 bc 사용하기

bc 명령을 실행하고 출력을 변수에 할당하는 명령 치환 기능을 사용할 수 있습니다.

# options 에서는 변수를 설정할 수 있고, 두개 이상의 변수를 설정해야할때 세미콜론을 사용해서 구분
variable=$(echo "options; expression" | bc)
$ cat test9
#!/bin/bash
var1=$(echo "scale=4; 3.44/5" | bc)
echo The answer is $var1
$ chmod u+x test9
$ ./test9
The answer is .6880

한두가지의 계산 이상을 해야할때 같은 커맨드라인에서 여러 수식을 나열하는 것은 비효율적입니다. 가장 좋은 방법은 커맨드라인에서 직접 데이터를 리다이렉트하는 것으로, 인라인 입력 리다이렉트 사용하는 것 입니다.

variable=$(bc << EOF
options
statements
expressions
EOF
)
var5=$(bc << EOF
scale=4
a1=($var1*$var2)
b1=($var3*$var4)
a1+b1
EOF
)

echo The final answer for this mess is $var5

스크립트 종료하기

종료 상태 확인하기

리눅스는 마지막으로 실행된 명령의 종료 상태값을 보관하는 특별한 변수인 $? 변수를 제공합니다. 확인하고 싶은 명령이 종료된 즉시 $? 를 보거나 사용해야합니다. 이 변수는 쉘이 실행한 마지막 명령어의 종료 상태가 이 변수 값을 변경합니다.

명령이 오류를 내고 완료되면 양의 정수값이 종료 상태에 지정됩니다.

리눅스 종료 상태 코드


126 : 사용자가 명령을 실행할 적절한 권한이 없다는 것을 뜻함
1 : 명령에 유효하지 않은 매개변수를 제공할 때 오류 남

exit 명령

종료 상태 코드를 돌려주도록 변경할 수도 있습니다.

#!/bin/bash
var1=10
var2=30
var3=$[$var1+$var2]
echo The answer is $var3
exit 5

$ chmod u+x test13
$ ./test13
The answer is 40
$ echo $?
5
#!/bin/bash
var1=10
var2=30
var3=$[$var1+$var2]
exit $var3

$ chmod u+x test13
$ ./test13
40

주의할점

#!/bin/bash
var1=10
var2=30
var3=$[$var1*$var2]
exit $var3
$ chmod u+x test13
$ ./test13
44

종료 상태 코드는 255까지 쓸 수 있기 때문에 주의해야합니다!
코드 결과값이 300이라면 300%256=44 나머지값 연산으로 종료 코드를 바꿉니다.

profile
열심히 굽고 있어요🍞

0개의 댓글