목차
여러 명령어를 한줄에 적어서 사용가능
date; who
스크립트 파일은 첫줄에 #!/bin/bash
필수입니다.
#!/bin/bash
date
who
하지만 꼭 필요한 과정이 있습니다. 아래 두가지 중 한가지를 해야합니다.
하지만, 위 과정을 진행하더라도 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 결과
변수는 쉘 스크립트 안에서 임시로 정보를 저장했다가 스크립트 안의 다른 명령에서 활용할 수 있습니다.
쉘은 특정한 시스템 정보를 추적하기 위해 환경변수를 유지합니다. 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
사용자 변수를 설정하면 데이터를 임시로 저장하고 스크립트 안에서 사용할 수 있으며, 이는 쉘 스크립트를 좀 더 실제 컴퓨터 프로그램과 같이 만드는데 도움이 됩니다.
# 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
변수값을 참조할때에는 달러 기호를 사용해주어야하지만, 값이 할당되는 변수에는 달러 기호를 사용해서는 안됩니다!!
명령의 출력을 변수에 지정하는 방법
#!/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
리다이렉트의 가장 기본적인 형태는 파일 명령의 출력을 전송합니다. 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
입력 리다이렉트는 출력 리다이렉트의 반대입니다. 입력 리다이렉트 파일은 파일의 내용을 받아서 명령으로 보냅니다.
command < inputfile
기억해야할 점은, 리다이렉트 기호는 부등호가 아니라 데이터가 흐르는 방향을 '가리키는'기호입니다.
wc 명령어는 데이터의 텍스트 양을 계산합니다.
결과(텍스트의 줄수/텍스트의 단어 수/텍스트의 바이트 수)
$ wc < test6
2 11 60
인라인 입력 리다이렉트 기호는 << 으로 표시합니다.
$ command << marker
data
marker
입출력 리다이렉트 예제
user:~$ cat <<EOF > file1.txt hello world EOF user:~$ cat file1.txt hello world
때로는 어떤 명령의 출력을 다른 명령의 입력으로 보낼 필요가 있습니다. 리다이렉트도 할 수 있지만 깔끔하지 못한 때도 있습니다.
위와 같이 rpm 명령은 시스템에 설치된 소프트웨어 패키지를 관리합니다. -qa 매개변수를 사용해서 존재하는 패키지 목록을 만들어 내지만 어떤 특정한 순서로 출력되지는 않습니다. 따라서 특정 패키지를 찾으려면 rpm 명령의 출력을 이용해서 찾기는 어려울 수 있습니다.
sort 명령어를 사용한다고 해도 보기가 어렵습니다.
이럴때 rpm -qa | sort | more
more 명령으로 파이프함으로써 정보가 한 화면분 만큼 출력될때마다 출력을 멈추게 합니다.
프로그래밍 언어들은 숫자를 조작할 수 있는 기능에서 각각의 특징이 있는데 쉘 스크립트에서는 과정이 어색합니다. 쉘 스크립트에서 수학 연산을 수행하는 방법은 이렇습니다.
$ 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 가 정수 연산만 할 수 있는 한계를 극복하기 위한 방법
bash 계산기는 실제로는 커맨드라인에서 부동소수점 표현식을 입력할 수 있도록 한 다음 수식을 해석하고, 이를 계산하여 결과를 되돌려주는 프로그래밍 언어입니다. bash 계산기는 다음을 인식합니다.
bc 명령 사용해서 쉘 프롬포트에 bash 계산기를 사용할 수 있습니다.
부동 소수점 계산은 scale 이라는 내장 변수가 제어합니다.scale 기본값은 0 이고 이를 적절히 정하지 않으면 원하는 답을 찾지 못할수도 있습니다.
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 : 명령에 유효하지 않은 매개변수를 제공할 때 오류 남
종료 상태 코드를 돌려주도록 변경할 수도 있습니다.
#!/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
나머지값 연산으로 종료 코드를 바꿉니다.