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
'OS > Linux Server' 카테고리의 다른 글
[리눅스커널이야기] top 을 통해 살펴보는 프로세스 정보들 (0) | 2022.04.07 |
---|---|
[Shell Programming] 10. Backup (0) | 2022.03.17 |
[Shell Programming] 8. Branching (0) | 2022.03.08 |
[Shell Programming] 7. Input & Output (0) | 2022.03.07 |
[Shell Programming] 6. Positional Parameters (0) | 2022.03.07 |