✏️[ if~else 문 ]
if [ 조건 ] -> 띄어쓰기 꼭! ifV[V조건V]
then
참일 경우 실행
else
거짓인 경우 실행
fi
✔️ if 문의 조건 안에 들어갈 수 있는 것 조건 형태
✔️ 파일과 관련된 조건
✔️예시
01 #!/bin/sh
02 fname=/lib/systemd/
system/cron.service
03 if [ -f $fname ]
-> 파일이 일반 파일이면
04 then
05 head -5 $fname
-> 앞부분 5줄을 출력한다.
06 else
07 echo “cron 서버가 설치되지 않았습니다."
08 fi
09 exit 0
✏️[ case~esac 문 ]
if 문이 2중 분기라고 하며 case문은 다중 분기라고 한다.
그리고 끝에 세미콜론 2개 찍는다.
✔️예시
01 #!/bin/sh
02 echo "리눅스가 재미있나요? (yes / no)"
03 read answer
04 case $answer in
05 yes | y | Y | Yes | YES) -> | 는 "또는"을 의미한다.
06 echo "다행입니다."
07 echo "더욱 열심히 하세요 ^^";;
08 [nN]*) -> n 또는 N이 앞에 들어가면
09 echo "안타깝네요. ㅠㅠ";;
10 *) -> 이외의 것들
11 echo "yes 아니면 no만
입력했어야죠"
12 exit 1;; -> 비정상적 종료
13 esac
14 exit 0
✏️ [ 관계연산자 (AND, OR) ]
- and = ‘-a’ 또는 ‘&&’
- or는 ‘-o’ 또는 ‘||’
*-a 또는 -o는 테스트문 ([ ] )안에서 사용할 수 있는데 이때 괄호 등의 특수 문자 앞에는 역슬래시(\)를 붙여야 한다.
✔️예시
#!/bin/sh
echo "보고싶은 파일명을 입력하세요"
read fname
if [ -f $fname ] && [ -s $fname ] ; then # if [ \\(-f $fname \\) -a \\(-s $fname \\) ]; 와 같다
head -5 $fname
else
echo "파일이 없거나, 크기가 0입니다"
if
exit 0
✏️ [ 반복문 (for ~ in 문) ]
for 변수 in 값1 값2 값3... -> 값1, 값2, 값3이 순서대로 변수에 들어가면서 실행
do
반복할 문장
done
✔️예시 1
#!/bin/sh
hap=0
for i in 1 2 3 4 5 6 7 8 9 10 #-> for((i=1;i<=10;i++)) 또는 for i in ‘seq 1 10’로 변경 할 수 있음
do
hap=`expr $hap + $i`
done
echo "1부터 10까지의 합 : "$hap
exit 0
✔️예시 2
01 #!/bin/sh
02 for fname in $(ls *.sh)
-> .sh 형식으로 된 파일 리스트가 만들어진다. 하나식 fname으로 들어간다. (파일의 개수만큼 실행된다)
03 do
04 echo "--------$fname-------"
05 head -3 $fname #앞의 3줄을 입력
06 done
07 exit 0
✏️ [ while 문 ]
- 무한루프 조건 → while[ : ], while[ 1 ]
✔️예시
01 #!/bin/sh
02 hap=0
03 i=1
04 while [ $i -le 10 ]
-> 10보다 작거나 같을 때 동안 반복
05 do
06 hap=`expr $hap + $i`
07 i='expr $i + 1'
08 done
09 echo "1부터 10까지의 합 : "$hap
10 exit 0
✏️ [ until 문 ]
while문과 용도는 같지만 until문은 조건식이 참(거짓인 동안)일 때까지 계속 반복한다.
✏️ [ break, continue, exit, return 문 ]
- break - 반복문 종료
- continue = 반복문의 조건식으로 다시 돌아감
- exit = 프로그램을 종료함
- return = 함수 안에서 사용할 수 있으며 함수를 호출한 곳으로 돌아간다.
✏️ [ 사용자 정의 함수 ]
[형식]
함수이름() {
내용들
}
함수이름 -> 함수를 호출한다.
01 #!/bin/sh
02 myFunction () {
03 echo "함수 안으로 들어 왔음"
04 return #return 문이 없어도 된다.
05 }
06 echo "프로그램을 시작합니다."
-> 호출하는 부분
07 myFunction
08 echo "프로그램을 종료합니다."
09 exit 0
[ 함수의 파라미터 사용 ]
함수이름(){
$1, $2 .. 등을 사용
}
함수이름 파라미터1 파라미터2 -> 함수를 호출
01 #!/bin/sh
02 hap () {
03 echo `expr $1 + $2`
04 }
05 echo "10 더하기 20을 실행합니다"
06 hap 10 20
07 exit 0
- 호출할 때 함수 이름에 넘겨줄 파라미터를 공백으로 분리해서 차례대로 적어준다.
✏️ [ eval ]
= 문자열을 명령문으로 인식하고 실행
eval 자체가 명령 키워드이다.
01 #!/bin/sh
02 str="ls -l eval.sh"
03 echo $str
04 eval $str
05 exit 0
- $(명령어) 와 eval의 차이
$() = command substitution = 쉬운말로 명령어 결과값
결과값이 어떠한 변수에 대입된다고 볼 수 있다.
하지만 eval은 실행만 해주는 것이다.
✏️ [ export ]
- 외부 변수로 선언해준다.
- 즉, 선언한 변수를 다른 프로그램에서도 사용할 수 있도록 해준다.
- 파일 2개를 만들고 앞에서 만든 파일에 들어있는 명령을 실행하게 만든다.
⦁ exp1.sh
01 #!/bin/sh
02 echo $var1
03 echo $var2
-> 외부변수를 참조하고 있으므로 출력 가능
04 exit 0
⦁ exp2.sh
01 #!/bin/sh
02 var1="지역 변수"
03 export var2="외부 변수"
04 sh exp1.sh
05 exit 0
✏️ [ printf ]
C언어의 printf() 함수와 비슷하게 “형식을 지정해서”출력한다.
01 #!/bin/sh
02 var1=100.5
03 var2="재미있는 리눅스~~"
04 printf "%5.2f \\n\\n \\t %s \\n" $var1 "$var2"
05 exit
- 공백이 있으므로 printf를 “”로 묶어야 한다.
- %5.2f는 총 5자리이며 소수점 아래 2자리까지 출력하라는 의미이다.
- %s는 문자열을 출력한다.
✏️[ set과 $(명령어) ]
- 리눅스 명령어를 결과로 사용하기 위해서는 $(명령어) 형식을 사용한다.
- 결과를 파라미터로 사용하고자 할 때 set과 함께 사용
01 #!/bin/sh
02 echo "오늘 날짜는 $(date) 입니다."
03 set $(date)
04 echo "오늘은 $4 요일 입니다."
05 exit 0
- date명령을 실행한 결과를 보여준다.
- $(date) = 를 통해 “2020. 05. 20 (수) 10:08:57 KST 입니다”라는 결과를 얻을 수 있다.
- $(date)의 결과가 $1, $2~ 등의 파라미터 변수에 저장된다.
- set을 통해 위의 결과를 파라미터 $1 = 2020. $2 = 05. $3 = 20 $4 = (수) $5 = 10:08:57 $6 = KST로 저장된다.
그래서 $4 = (수)이므로 $4를 통해 (수)라는 값을 가져올 수 있다.
✏️ [ shift ]
파라미터 변수를 왼쪽으로 한 단계씩 이동시킨다.
파라미터가 많을 때 이런 방식으로 하나씩 읽어오면 좋을 것이다.
01 #!/bin/sh
02 myfunc() {
03 str=""
04 while [ "$1" != "" ] ; do
05 str="$str $1"
-> $1자리에 shift가 되면서 AAA, BBB, ...순서대로 $1이 된다.
06 shift
07 done
08 echo $str
09 }
10 myfunc AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
11 exit 0
-> 결과 : AAA BBB CCC DDD EEE FFF GGG HHH III JJJ KKK
- shift = 전체 파라미터를 왼쪽으로 시프트시킨다. 즉, $2 → $1, $3 → $2, 의 형태로 작업이 일어난다.
이 글은 "이것이 우분투 리눅스다" 책을 읽고 쓴 글입니다.
'CS > 리눅스' 카테고리의 다른 글
Shell 스크립트_특징 (0) | 2022.06.25 |
---|