본문 바로가기
OS/Linux Server

[Shell Programming] 9. Looping

by Haengsin 2022. 3. 11.
Looping

1. 산술연산 expr, let

(1) expr

  • 정수형 산술연산( +, -, *, /, % ), 논리연산( | , & ), 관계연산( =, !=, >, >=, <, <= )

[centos@linux-mypc bin]$ expr 5+5
5+5
[centos@linux-mypc bin]$ expr 5 + 5
10
# 띄어쓰기 주의

[centos@linux-mypc bin]$ x=5
[centos@linux-mypc bin]$ expr $x - 2
3

[centos@linux-mypc bin]$ expr $x * 2
expr: syntax error
[centos@linux-mypc bin]$ expr $x '*' 2
10
# *, / 등의 연산에는 '' 혹은 백슬래쉬(\)로 묶어서 표현해야 함.

[centos@linux-mypc bin]$ x=1
[centos@linux-mypc bin]$ sum=$(expr $x + 2)
[centos@linux-mypc bin]$ echo $sum
3

 

(2) let

  • 정수형 산술연산, bit연산( <<, >>, &, | ), 논리연산( &&, || ), 단항연산( ++, +=, -= )

[centos@linux-mypc bin]$ let sum=x+5
[centos@linux-mypc bin]$ echo $sum
6
[centos@linux-mypc bin]$ x=1
[centos@linux-mypc bin]$ let sum=x+5
[centos@linux-mypc bin]$ echo $sum
6
[centos@linux-mypc bin]$ let x++
[centos@linux-mypc bin]$ echo $x
2
[centos@linux-mypc bin]$ let x+=2
[centos@linux-mypc bin]$ echo $x
4
[centos@linux-mypc bin]$ ((x=x+1))
[centos@linux-mypc bin]$ echo $x
5
[centos@linux-mypc bin]$ ((x++))
[centos@linux-mypc bin]$ echo $x
6

 

2. while and until loop

조건부 loop

(1) while

  • while 다음의 command가 성공하는 동안 do~done 사이의 명령어를 반복 실행.

while 조건명령어

do

    반복명령어

done

 

[centos@linux-mypc bin]$ num=1
[centos@linux-mypc bin]$ while test $num -le 5
> do
> echo Number: $num
> ((num++))
> done
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

 

 

(2) until

  • until 다음의 command가 성공할 때 까지 do~done 사이의 명령어를 반복 실행.

until 조건명령어

do

    반복명령어

done

[centos@linux-mypc bin]$ num=1
[centos@linux-mypc bin]$ until test $num -gt 5
> do
> echo Number: $num
> ((num+=1))
> done
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

 

3. for-loop

  • 주어진 list만큼 do~done 사이의 명령어를 반복 실행.

     for item in [LIST]

     do

     [COMMANDS]

     done

  • 사용 형식
[centos@linux-mypc bin]$ cat > for-exam.sh
for num in 1 2 3 4 5
do
  echo "num: $num"
done

[centos@linux-mypc bin]$ sudo chmod +x for-eaxm.sh
[centos@linux-mypc bin]$ for-eaxm.sh
num: 1
num: 2
num: 3
num: 4
num: 5



[centos@linux-mypc bin]$ for NUM in $(seq 10)
> do
> echo $NUM
> done
1
2
3
4
5
6
7
8
9
10


[centos@linux-mypc bin]$ for file in *
> do
> ls $file
> done
2022-03-07.txt
case2.sh
case3.sh
case.sh
deluser.sh
dir-list.sh
exam2.sh
exam.sh
input.sh
lab2.sh
lab.sh
newuser.sh
out.sh
parm.sh
sample2.sh
sample.sh
tt.sh
varUsage.sh


[centos@linux-mypc bin]$ for file in /home/*
> do
>   echo $file
> done
/home/centos
/home/metalk2003

 

Loop을 통해 특정 경로에 있는 파일들 backup 하기

[centos@linux-mypc bin]$ cat > for-exam3.sh

if [ ! -d ~/backup ]
then
  mkdir ~/backup
fi
for FILE in *
do
  cp $FILE ~/backup/$FILE.old
done

 

※ 예제 1

계정 생성 셸 : username 을 입력 받고 해당 계정이 있을 때는 "계정이 존재합니다." 표시하고 계정이 new user인 경우 생성하기.

#!/bin/bash

echo -n "username:"
read username
while getent passwd $username &> /dev/null
# getent 명령은 모든사용자 목록을 쿼리하는 데 사용할 수 있는 passwd 를 포함하여
# /etc/passwd 파일 내용과 동일. LADP를 사용자 인증에 사용하는 경우 getent는 /etc/passwd
# 파일과 LDAP 데이터베이스의 모든 Linux 사용자를 표시
do
        echo "Sorry, that account $username is already taken"
        echo -n "new username:"
        read username
done
sudo useradd -m -s /bin/bash $username
# useradd -m : 사용자를 생성할 때 홈 디렉터리를 생성해주는 옵션.
# useradd -s : 사용자 생성 시 사용자가 사용할 셸을 지정.

getent passwd [유저명] : /etc/passwd 파일에서 유저를 검색.

 

※ 예제 2

계정 삭제 셸

[centos@linux-mypc bin]$ cat deluser.sh
#!/bin/bash

echo -n "username:"
read username
until getent passwd $username &> /dev/null
# getent 명령은 모든사용자 목록을 쿼리하는 데 사용할 수 있는 passwd 를 포함하여
# /etc/nsswitch.conf 파일에 구성된 데이터베이스의 항목을 표시
do
        echo "Sorry, that account $username does not exist"
        echo -n "new username:"
        read username
done
sudo userdel -f $username

[centos@linux-mypc bin]$ deluser.sh
username:metalk2003
[centos@linux-mypc bin]$ getent passwd metalk2003
[centos@linux-mypc bin]$

 

 

Reference

- https://www.youtube.com/watch?v=SChc2ye4gcg&list=PLApuRlvrZKog2XlvGJQh9KY8ePCvUG7Je&index=10