리눅스

리눅스 쉘 스크립트 연습 및 분석

coling 2021. 5. 17. 00:47

**뛰어쓰기로도 error나니 주의하기!!

 

Tip) 터미널에서 에디터로 sh파일을 열면 터미널 사용이 불가능하므로

gedit 파일명.sh & 로 백그라운드로 열어 Ctrl+S로 저장하고 터미널에서 결과 바로 출력해보기. 

(gedit이 행번호도 나와서 오류확인에도 편리함.)

 

코드1)

if ~else문

#!/bin/sh
num1=100
num2=$num1+200
#위와 같이 입력시 계산이 아니라 문자열이 더해진것으로 인식하므로 100+200 출력

echo $num2
num3=`expr $num1 + 200`
echo "$num3"
num4=`expr \( $num1 + $num3 \) / 2 \* 3 `
#()괄호와 *곱기호 사용시 앞에 \(역슬러쉬)를 붙여야한다.

echo $num4
echo ===============================
num5=`expr \( $num1 + 100 \) / 2`
if [ num1=100 ]
then echo helloworld
else error
fi
exit 0

1. 쉘 파일은 확장자명을 *.sh로 끝내는게 일반적이다.

2. 스크립트 파일 첫 줄은 #!/bin/sh

3. 변수는 대소문자를 구분한다.

4. 변수는 값을 등호(=)를 통해 대입시키는 방식으로 간단하게 생성가능하며 자료형따로 X

5. 변수 사용시 $변수명

6. 값을 대입받는 변수는 $ 붙이면 안된다. (에러)

7. 숫자 계산을 해야될경우 `(역따움표)expr (계산)`(역따움표) 구조

8. 7번과 같이 사용하여 계산할때 괄호()나 곱*계산시엔 각각 \를 붙여 줘야함 ex. \(  , \) , \*

9. 변수명='expr 까지는 붙여쓰고 뛰어쓰기 필요.

10. 각 연산부호 앞뒤로도 뛰어쓰기를 해줘야함.(뛰어쓰기 없을경우 에러발생)

11. [ 과  ] 도 앞뒤 뛰어쓰기 필수

12. if 로 시작 fi로 끝

13. exit 0는 정상종료의미 (exit 1은 error상태로 종료)(exit와 숫자사이에 뛰어쓰기 필수) 

 

 

 

코드2)

case~in문

#!/bin/sh
case "$1" in
	a)
	echo "enter a";;
	b)
	echo "enter b";;
	c)
	echo "enterc";;
	*)
	echo "???";;
esac

echo ===========
echo yes or no?

read answer
case $answer in
	yes|y|Y|Yes|YES)
		echo yes입력함;;
	[nN]*)
		echo no입력함;;
	*)
		echo ??yes or no plz;;
esac
exit 0

1. $1, $2, $3 은 parameter(인자)(매개변수)로 sh형태의 쉘 스크립트 파일 실행시 값을 같이 넣어줘야 한다.

                ex)sh caseTest.sh a b c  ($1: caseTest.sh  ,  $2: a  ,  $3: b  ,  $4: c)

2. case ~ in 문의 경우 각 케이스에 대한 수행이 끝났다는 의미로 마지막 부분에 ;(세미콜론)을 2개씩

3. case가 끝났다는 의미로 esac(case거꾸로) 적어주기

4. read 변수명 의 경우에는 사용자 입력을 기다렸다 입력값을 변수명에 넣어줌

5. case 나눌때 |(파이프라인)으로 or연산 가능

6. [Nn]*) 의 경우는 N또는n으로 시작하는 아무 단어를 의미한다. ex)no, Nooooo,Nasdg,nvvvv등등

7. *)는 위 케이스 외의 나머지 경우들.(C의 defaults문과 동일)

 

 

 

코드3)

for~in문(1)

#!/bin/sh
hap=0
for i in `seq 1 10`
do
hap=`expr $hap + $i `
done
echo "합은 $hap 입니다."
exit 0

1. for 변수명 in 값1 값2 값3 ...일 경우 값1부터 차례대로 대입

2-1. `(역따움표)seq 시작값 끝값`으로 간단하게 표현 가능.

2-2. `seq 시작값 증가값 끝값`도 가능 

3. for ((i=0;i<=10;i++))으로 c와 비슷하게도 가능하다고 하는데 현재 버전이 낮아서인지 실행안됨

4. for i in {1..10} 1부터10까지 차례대로, 또는 for i in {1..10..2} 1부터 10까지 2씩 증가하며..도 3번과 마찬가지로 실행X

5. "(겹따움표)안에 쓰거나 그냥 쓰면 변수 인식가능

6. '(홀따움표)안에 쓰거나 앞에 \를 붙이면 문자로 취급함.

 

 

 

코드4)

for~in문(2)

#!/bin/sh
for fname in $(ls *.sh)
do
	echo "========$fname========"
	head -3 $fname
done
exit 0

1. fname변수에 ls *.sh의 결과 값을 차례대로 넣는다.

 

 

 

 

코드5)

while문(1)

#!/bin/sh
hap=0
i=1
while [ $i -le 10 ]
do
	hap=`expr $hap + $i` 
	i=`expr $i + 1`
done
echo "1부터10까지의 합$hap"
exit 0

1. []앞뒤로 뛰어쓰기

2. 변수로 연산하기전에 값을 넣어 초기화(hap=0, i=1)하지 않으면 에러 발생.

3. -le는 less either로 적거나 같다를 의미

4. 변수명=`expr까지는 붙여쓰기 이후 뛰어쓰기. 연산부호 앞뒤로 꼭 뛰어줘야함.

 

 

 

 

코드6)

while문(2)

#!/bin/sh
echo 비밀번호를 입력하세요.
read pwd
while [ $pwd != 1234 ]
do
	echo 틀렸습니다. 다시입력하세요
	read pwd
done
echo 통과!
exit 0

1. 1234부분을 1234, '1234', "1234", \1234 네가지 중 하나로 쓰면 1234설정됨.

   단, \1234의 경우 \1234와 1234 모두 맞게 인식.(\를 2개 입력시 틀렸다고 나오는걸 봐서는 \를 인식 못하는것은X)

2. []앞뒤로는 뛰어쓰기 해야한다.

 

 

 

 

코드7)

shift

#!/bin/sh
myfunc(){
	str="ooooo"
	while [ "$1" != "" ]; do
		str="$str $1"
		shift 2
	done
	echo $str
}
myfunc aa bb cc ddd eeee fff gggg hhhhh ii jjjj
exit 0

1-1. shift만 쓸경우 인자(parameter)값을 1개씩 앞당긴다.

1-2. 위 코드의 경우에는 shift 2를 썼으므로 2개씩 앞당겨진다.

2-1. 처음 파라미터(parameter)에서 $0값은 스크립트파일명.sh이다.

2-1. 또한 $1값=aa $2값=bb $3값은=ddd ... (이하생략) ... 

3. 파일 실행시 ooooo aa cc eeee gggg ii 출력됨.

 

*parameter=인자값=매개변수