개발/Linux

bash shell looping (반복문)

달리초이 2023. 1. 2. 16:33


[목차]

1. 산술연상 expr, let

2. while and until loop

3. for-loop


 

1. 산술연상 expr, let

expr

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

expr 10 + 5
expr 10 - 5
expr 5 '*' 2
expr 25 '/' 5
expr 25 % 4
x=5
expr $x > 4
espr $x = 8
sum=`expr $x + 10`
type expr

let

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

let sum=x+5
let x++
let x+=1
type let
((sum=x+5))
((x++))
((x-=1))

 

 

 

2. while and until loop

조건부 loop

whlie

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

while 조건명령어
do
  반복명령어
done

num=1
while test $num -le 5
do
  echo Number: $num
  ((num++))
done

until

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

until 조건명령어
do
  반복명령어
done

num=1
until test $num -gt 5
do
  echo Number: $num
  ((num++))
done

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

# '&>' 는 표준입력과 표준에러를 모두 리다이렉트한다는 의미
getent passwd jack &> /dev/null
echo $?
# 2
cat > newuser
#!/bin/bash
#Description: Create a user account.
echo -n "New username: "
read username
while getent passwd $username &> /dev/null
do
  echo "Sorry, that account $username is already taken. Please pick a different username."
  echo -n "New username: "
  read username
done
sudo useradd -m -s /bin/bash $username
 
chmod +x newuser

- 문제풀이

newuser 스크립트를 참고하여 until 명령어를 사용하여 계정 삭제하는 스크립트 작성하기

cat > remove-user
#!/bin/bash
echo -n "username to remove: "
read username
until getent passwd $username &> /dev/null
do
        echo "username does not exist."
        echo -n "username to remove: "
        read username
done
sudo userdel $username

chmod +x remove-user

- while loop과 if 문을 함께 사용한 예제

cat > while-if.exam
#!/bin/bash
num=0
while [ $num -lt 5 ]
do
  echo "Number: $num"
  ((num++))
  if [[ "$num" == '2' ]];then
    break
  fi
done

 

 

 

3. for-loop

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

for item in [LIST]
do
  [COMMANDS]
done

- 사용 형식

for NUM in 1 2 3 4 5 6 7 8 9 10
do
  echo $NUM
done
for NUM in $(seq 10)
do
  echo $NUM
done
# '*' : 현재 디렉토리 안에 있는 모든 파일
for file in *
do
  ls $file
done
if [ ! -d ~/backup ]
then
  mkdir ~/backup
fi
for FILE in *
do
  cp $FILE ~/backup/$FILE.old
done

- 문제풀기

작업 디렉토리를 입력 받아 해당 디렉토리에 파일의 수와 디렉토리 수를 출력하는 프로그램 작성하기

cat > lab9.sh
#!/bin/bash
echo -n "Input a directory name: "
read dirname
until [ -d $dirname ]
do
        echo "It is not a directory."
        echo -n "Input a directory name: "
        read dirname
done
echo "--------------------------"
echo $dirname :
echo "echo files: $(ls -l $dirname | grep ^- | wc -l)"
echo "echo dirs: $(ls -l $dirname | grep ^d | wc -l)"
echo "--------------------------"

chmod +x lab9.sh

 

 

 

- 출처 : 따배셸

9. looping

https://youtu.be/SChc2ye4gcg

728x90
반응형