아이티윌_데이터 분석 55기/강의내용_Linux

#5 5일차_반복문, 산술연산, 색 변수 설정, 지역변수/전역변수, 아나콘다 설치

ecosso 2026. 7. 21. 16:15

01 반복문

 -01 for문

 -02 while문

 

02 산술연산

 -01 expr

 -02 bc

 

03 색 변수 설정

 

04 지역변수와 전역변수

 -01 지역변수

 -02 전역변수

 

05 아나콘다 설치


01 반복문

 -01 for문

** 문법

for 반복변수 in 대상

do

  명령어

done

 

# 파일명과 파일 사이즈 출력하기

vi 9_for1.sh

#!/bin/sh

# 디렉토리를 입력받고 디렉토리 하위 *.sh 파일들에 대해
# 파일명과 파일 사이즈를 출력

echo "디렉토리 경로를 입력하세요(절대경로) : \c"
read dir

if [ ! -d $dir ]
then
  exit 1
fi

flist=$(ls $dir/*.sh)
for fname in $flist
do
  fsize=$(ls -l $fname | cut -d" " -f5)
  echo "파일명 : ${fname}, 사이즈 : ${fsize}"
done

exit 0

 

sh 9_for1.sh

itwill@ubuntu:~/linux_ex/ch9$ sh 9_for1.sh
디렉토리 경로를 입력하세요(절대경로) : /home/itwill/linux_ex/ch9
파일명 : /home/itwill/linux_ex/ch9/1_grep.sh, 사이즈 : 377
파일명 : /home/itwill/linux_ex/ch9/2_cut.sh, 사이즈 : 242
파일명 : /home/itwill/linux_ex/ch9/3_wc.sh, 사이즈 : 480
파일명 : /home/itwill/linux_ex/ch9/4_if1.sh, 사이즈 : 303
파일명 : /home/itwill/linux_ex/ch9/5_backup.sh, 사이즈 : 721
파일명 : /home/itwill/linux_ex/ch9/6_case.sh, 사이즈 : 767
파일명 : /home/itwill/linux_ex/ch9/7_head.sh, 사이즈 : 389
파일명 : /home/itwill/linux_ex/ch9/8_cron.sh, 사이즈 : 79
파일명 : /home/itwill/linux_ex/ch9/9_for1.sh, 사이즈 : 390

 

# 500 이상의 파일 사이즈를 가진 파일만 백업 디렉토리에 백업 진행하기

 

vi 10_for2.sh

#!/bin/sh

# 디렉토리를 입력받고 디렉토리 하위 *.sh 파일들에 대해
# 파일 사이즈가 500 이상이면 백업디렉토리에 백업일

echo "디렉토리 경로를 입력하세요(절대경로) : \c"
read dir

backdir=/home/itwill/linux_ex/ch9/backup

# 사용자 입력 디렉토리 존재 여부 체크
if [ ! -d $dir ]
then
  exit 1
fi

# 백업 디렉토리 존재 여부 체크
if [ ! -d $backdir ]
then
  mkdir -p $backdir
fi

# main
flish=$(ls $dir/*.sh)

for fname in $flist
do
  fsize=$(ls -l $fname | cut -d" " -f5)
  if [ $fsize -ge 500 ]
  then
    cp $fname $backdir
    echo "$fname 파일을 백업하였습니다."
  else
    echo "빅파일이 아닙니다."
  fi
done

exit 0
itwill@ubuntu:~/linux_ex/ch9$ sh 10_for2.sh
디렉토리 경로를 입력하세요(절대경로) : /home/itwill/linux_ex/ch9
파일명 : /home/itwill/linux_ex/ch9/10_for2.sh, 사이즈 : 607
파일명 : /home/itwill/linux_ex/ch9/1_grep.sh, 사이즈 : 377
파일명 : /home/itwill/linux_ex/ch9/2_cut.sh, 사이즈 : 242
파일명 : /home/itwill/linux_ex/ch9/3_wc.sh, 사이즈 : 480
파일명 : /home/itwill/linux_ex/ch9/4_if1.sh, 사이즈 : 303
파일명 : /home/itwill/linux_ex/ch9/5_backup.sh, 사이즈 : 721
파일명 : /home/itwill/linux_ex/ch9/6_case.sh, 사이즈 : 767
파일명 : /home/itwill/linux_ex/ch9/7_head.sh, 사이즈 : 389
파일명 : /home/itwill/linux_ex/ch9/8_cron.sh, 사이즈 : 79
파일명 : /home/itwill/linux_ex/ch9/9_for1.sh, 사이즈 : 390
itwill@ubuntu:~/linux_ex/ch9$ ls backup
5_backup.sh

 -02 while문

** 문법

while [ $fname -ne 조건 ]  # 띄어쓰기 유의

do

  명령어

done


02 산술연산

shell은 기본적으로 숫자 연산이 불가능하다. (쉘은 기본적으로 명령어로 해석한다.)

연산을 도와주는 명령어 (expr, bc)를 통해서만 연산이 가능하다.

itwill@ubuntu:~/linux_ex/ch9$ 1+1
1+1: command not found

 

 -01 expr

이를 가능하게 해주는 것이 expr이다.

정수만 리턴한다.

 

* 사용법

expr 연산식

 

ex)

$ echo $(expr 100 + 200)

$ echo $(expr 100 \* 200)  # expr 연산시 *는 \와 함께 전달

$ echo $(expr 200 / 100)   # expr 연산시 *는 \와 함꼐 전달

 

vi 11_expr.sh

#!/bin/sh

num1=10
num2=20
num3=30

echo "연산결과 : $num1 + $num2"
echo "연산결과 : $(expr $num1 + $num2)"
echo "연산결과 : $(expr $num1 - $num2)"
echo "연산결과 : $(expr $num1 * $num2)"
echo "연산결과 : $(expr $num1 / $num2)"
itwill@ubuntu:~/linux_ex/ch9$ sh 11_expr.sh
연산결과 : 10 + 20
연산결과 : 30
연산결과 : -10
expr: syntax error: unexpected argument '10_for2.sh'
연산결과 :
연산결과 : 0

 

곱하기, 나누기에서 문제가 발생하였다.

linux에서 곱하기는 '모든' 으로 해석이 된다. (ex : *.sh)

#!/bin/sh

num1=10
num2=20
num3=30
num4=5

echo "연산결과 : $num1 + $num2"
echo "연산결과 : $(expr $num1 + $num2)"
echo "연산결과 : $(expr $num1 - $num2)"
echo "연산결과 : $(expr $num1 \* $num2)"
echo "연산결과 : $(expr $num1 / $num2)" # expr은 정수만 리턴
echo "연산결과 : $(expr $num3 / $num4)" # expr은 정수만 리턴
itwill@ubuntu:~/linux_ex/ch9$ sh 11_expr.sh
연산결과 : 10 + 20
연산결과 : 30
연산결과 : -10
연산결과 : 200
연산결과 : 0
연산결과 : 6

 -02 bc

또는 bc를 사용할 수 있다.

실수를 리턴한다.

 

* 사용법

echo "연산식" | bc

 

ex)

$ echo "100 + 200" | bc

$ echo "100 * 200" | bc  # bc 연산시 *만 전달 가능

$ echo "10 / 3" | bc         # 정수 리턴

$ echo "10 / 3" | bc-1      # 실수 리턴

itwill@ubuntu:~/linux_ex/ch9$ echo `expr 1 + 1`
2

itwill@ubuntu:~/linux_ex/ch9$ bc 1 + 1
File 1 is unavailable.

itwill@ubuntu:~/linux_ex/ch9$ echo 1 + 1 | bc
2

 

vi 12_bc.sh

#!bin/sh

num1=10
num2=20

echo "$num1 + $num2" | bc
echo "$num1 - $num2" | bc
echo "$num1 * $num2" | bc        # bc일때는 * 앞에 \ 안써도 됨
echo "$num1 / $num2" | bc        # 정수 출력
echo "$num1 / $num2" | bc -l     # 실수 출력
itwill@ubuntu:~/linux_ex/ch9$ sh 12_bc.sh
30
-10
200
0
.50000000000000000000

03 색 변수 설정

vi 13_color.sh

#!/bin/sh

# 색 변수 설정 : [x;y;zm -> x(글자색), y(배경색), zm(특수:반짝 등)
# ^[ => ctrl + v + [

red="^[[31m"
green="^[[32m"
blue="^[[34m"
nc="^[[0m"
mycol="^[[37;40;5m"

echo "${red}테스트입니다......${nc}"
echo "${blue}정상입니다......${nc}"
echo "${mycol}mycol 테스트입니다......${nc}"

깜빡임은 ubuntu 터미널에서 확인할 수 있다.

 

itwill@ubuntu:~/linux_ex/ch9$ cp 13_color.sh color.env
itwill@ubuntu:~/linux_ex/ch9$ vi color.env


itwill@ubuntu:~/linux_ex/ch9$ vi 14_text_color.sh

#!/bin/sh

# 파일명을 입력받고 파일 소유자, 크기, 라인수를 아래와 같이 출력
# 파일명 : ...
# 크기 : ...
# 소유자 : itwill (빨간색)
# 라인수 : 44 (파란색)

. /home/itwill/linux_ex/ch9/color.env  # color.env에 선언된 변수 호출하기 (실행>권한 필요없음)

echo "파일명을 입력하세요 : \c"
read fname

fowner=$(ls -l $fname | cut -d" " -f3)
fsize=$(ls -l $fname | cut -d" " -f5)
fline=$(cat $fname | wc -l)

echo "파일명 : $fname"
echo "크기: $fsize"
echo "${red}소유자 : $fowner${nc}"
echo "라인수 : ${blue}${fline}${nc}"

 


04 지역변수와 전역변수

 -01 지역변수

  정의된 변수가 특정 프로그램(쉘) 또는 함수 내에서만 사용 가능한 형태이며, 일반적으로 변수 선언 시 지역변수로 선언된다.


 -02 전역변수

  정의된 변수가 정의된 영역이 아니더라도 호출이 가능한 형태이며, export와 함께 선언한다.

  특정 쉘 스크립트 실행 시 변수가 정의된 또 다른 쉘스크립트를 실행하면 전역변수 처리가 가능하다.

 

ex)

main.sh

 

var1=100    # 지역변수

export var2=200 # 전역변수

 

sh sub.sh    # 메인쉘 내에 서브쉘이 실행되는 구조 (전역변수만 전달됨)

echo "프로그램 종료"

 

<sub.sh>

echo "서브쉘 실행"

echo $var1   <- 출력안됨

echo $var2   <- 출력됨

 

vi 15_export1.sh

#!/bin/sh

var1="abcde"    # 지역변수
export var2="ABCDE" # 전역변수


echo $var1
echo $var2

sh 16_export2.sh

 

vi 16_export2.sh

#!/bin/sh

echo "16_export2.sh 이 실행중입니다..."
echo $var1
echo $var2

 

itwill@ubuntu:~/linux_ex/ch9$ sh 15_export1.sh
abcde
ABCDE
16_export2.sh 이 실행중입니다...

ABCDE

05 아나콘다 설치

PuTTY에서도 python을 사용할 수 있다.


itwill@ubuntu:~$ which python
itwill@ubuntu:~$ python3

 

python prompt로 변경되었다.

>>> 1+1
2

>>> ls
Traceback (most recent call last):
  File "<python-input-1>", line 1, in <module>
    ls
NameError: name 'ls' is not defined

>>> exit

 

 

아나콘다 설치는 다음과 같이 진행한다.

1) 설치파일 다운로드

 방법1) 윈도우에서 다운로드 -> 리눅스 서버로 전송(권고X)

 방법2) 리눅스에서 직접 다운로드(wget 명렁어)

 

$ wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

$ ls -l Anaconda3-2024.10-1-Linux-x86_64.sh

 

 2) 설치파일 실행

$ bash Anaconda3-2024.10-1-Linux-x86_64.sh

 

 중간에 라이선스 동의    -> yes 입력 후 엔터

            설치위치            -> 엔터(기본위치에 설치)

            conda init 실행   -> yes 입력 후 엔터

 

 3) 환경설정파일 실행

$ cd ~

$ . .bashrc

 

 4) 아나콘다 실행

$ ipython

 

itwill@ubuntu:~$ wget http://www.naver.com

 

네이버

네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요

www.naver.com

itwill@ubuntu:~$ wget www.naver.com
Prepended http:// to 'www.naver.com'
--2026-07-21 14:14:44--  http://www.naver.com/
Resolving www.naver.com (www.naver.com)... 223.130.192.247, 223.130.192.248, 223.130.200.219, ...
Connecting to www.naver.com (www.naver.com)|223.130.192.247|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: https://www.naver.com/ [following]
--2026-07-21 14:14:44--  https://www.naver.com/
Connecting to www.naver.com (www.naver.com)|223.130.192.247|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’

index.html              [ <=>                ] 234.17K  --.-KB/s    in 0.01s

2026-07-21 14:14:44 (16.8 MB/s) - ‘index.html’ saved [239787]

 

index.html 을 다운로드 받았다.

해당 링크에 접속하면 보이는 html 소스를 index.html로 저장한다.

 

이제 아나콘다를 linux에 다운로드한다.

wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh

itwill@ubuntu:~/linux_ex/ch9$ wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh
--2026-07-21 14:18:15--  https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh
Resolving repo.anaconda.com (repo.anaconda.com)... 104.16.32.241, 104.16.191.158, 2606:4700::6810:20f1, ...
Connecting to repo.anaconda.com (repo.anaconda.com)|104.16.32.241|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1102495056 (1.0G) [application/octet-stream]
Saving to: ‘Anaconda3-2024.10-1-Linux-x86_64.sh’

Anaconda3-2024.10-1 100%[===================>]   1.03G  6.80MB/s    in 1m 59s

2026-07-21 14:20:14 (8.83 MB/s) - ‘Anaconda3-2024.10-1-Linux-x86_64.sh’ saved [1102495056/1102495056]

itwill@ubuntu:~/linux_ex/ch9$ ls -l Anaconda3-2024.10-1-Linux-x86_64.sh
itwill@ubuntu:~/linux_ex/ch9$ ls -l Anaconda3-2024.10-1-Linux-x86_64.sh
-rw-rw-r-- 1 itwill itwill 1102495056 Feb 14  2025 Anaconda3-2024.10-1-Linux-x86_64.sh
itwill@ubuntu:~/linux_ex/ch9$ head -1 Anaconda3-2024.10-1-Linux-x86_64.sh
#!/bin/sh
itwill@ubuntu:~/linux_ex/ch9$ bash Anaconda3-2024.10-1-Linux-x86_64.sh

Welcome to Anaconda3 2024.10-1

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>>

라이센스 관련 문제이기 때문에 ENTER 입력

 

그냥 넘기다보면 입력이 필요한 부분을 놓치게 된다.

 

Do you accept the license terms? [yes|no]
>>>
Please answer 'yes' or 'no':'
>>> yes

소문자로 yes 입력 후 엔터를 입력한다.

 

Anaconda3 will now be installed into this location:
/home/itwill/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/itwill/anaconda3] >>>

특별히 다른 경로를 지정할 이유가 없는 상황이므로 엔터를 입력한다.

 

[/home/itwill/anaconda3] >>>
PREFIX=/home/itwill/anaconda3
Unpacking payload ...

설치가 진행됨을 확인할 수 있다.

 

Preparing transaction: done
Executing transaction: done
installation finished.
Do you wish to update your shell profile to automatically initialize conda?
This will activate conda on startup and change the command prompt when activated.
If you'd prefer that conda's base environment not be activated on startup,
   run the following command when conda is activated:

conda config --set auto_activate_base false

You can undo this by running `conda init --reverse $SHELL`? [yes|no]
[no] >>> yes

Defalut가 no 인 상태이기 때문에 그냥 엔터를 입력하면 취소가 된다.

yes 입력 후 엔터를 입력해야 한다.

 

no change     /home/itwill/anaconda3/condabin/conda
no change     /home/itwill/anaconda3/bin/conda
no change     /home/itwill/anaconda3/bin/conda-env
no change     /home/itwill/anaconda3/bin/activate
no change     /home/itwill/anaconda3/bin/deactivate
no change     /home/itwill/anaconda3/etc/profile.d/conda.sh
no change     /home/itwill/anaconda3/etc/fish/conf.d/conda.fish
no change     /home/itwill/anaconda3/shell/condabin/Conda.psm1
no change     /home/itwill/anaconda3/shell/condabin/conda-hook.ps1
no change     /home/itwill/anaconda3/lib/python3.12/site-packages/xontrib/conda.xsh
no change     /home/itwill/anaconda3/etc/profile.d/conda.csh
modified      /home/itwill/.bashrc

==> For changes to take effect, close and re-open your current shell. <==

Thank you for installing Anaconda3!

설치가 완료되었다.

 

이제 ipython을 통해 python prompt로 전환한다.

itwill@ubuntu:~/linux_ex/ch9$ cd
itwill@ubuntu:~$ . .bashrc
(base) itwill@ubuntu:~$ ipython
Python 3.12.7 | packaged by Anaconda, Inc. | (main, Oct  4 2024, 13:27:36) [GCC 11.2.0]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.27.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]:

 

 

이전 프롬포트에 해당 명령어를 전하기 위해서는 !를 앞에 붙이면 된다.

In [1]: !clear

 

In [2]: !ls
8_cron.sh  Downloads  Public     anaconda3   linux_ex    services
Desktop    Music      Templates  index.html  linux_ex2   snap
Documents  Pictures   Videos     linex_ex    python.log

 

 vi 17_python.py

import pandas as pd
emp = pd.read_csv('/home/itwill/linux_ex/ch9/emp.csv')
mean_sal = emp.loc[emp['DEPTNO'] == 10, 'SAL'].mean()
print(round(mean_sal))

 

(base) itwill@ubuntu:~/linux_ex/ch9$ python3 17_python.py
2917

정말로 된다(!)

 

또한 리눅스에서 파이썬 스크립트를 실행하는 방법은 다음과 같다.

 1) 파이썬 파일 형태로 실행

$ python3 ex.py  <- ex.py는 파이썬 명령어로만 구성된 파이썬 파일

 

 2) os 프롬포트에서 파이썬 프롬프트로 명령어 전달하기

** 참고 : 리눅스에서 한글 깨짐 해결 (인코딩 변경)

$ iconv -f CP949 -t UTF-8 card_history.csv > card_history_new.csv

 

vi 18_python.py

import pandas as pd

card = pd.read_csv('/home/itwill/linux_ex/ch9/card_history.csv', encoding='cp949
')
card = card.drop(columns='NUM')
card = card.map(lambda x : int(x.replace(',','')))
card.sum().to_csv('total.csv', header=False)
(base) itwill@ubuntu:~/linux_ex/ch9$ python3 18_python.py
(base) itwill@ubuntu:~/linux_ex/ch9$ ls
10_for2.sh        16_export2.sh  4_if1.sh     backup            log
11_expr.sh        17_python.py   5_backup.sh  card_history.csv  sh_260716.log
12_bc.sh          18_python.py   6_case.sh    color.env         test.txt
13_color.sh       1_grep.sh      7_head.sh    cron.log          total.csv
14_text_color.sh  2_cut.sh       8_cron.sh    emp.csv
15_export1.sh     3_wc.sh        9_for1.sh    index.html

(base) itwill@ubuntu:~/linux_ex/ch9$ cat total.csv
식료품,795500
의복,3947700
외식비,281400
책값,945000
온라인소액결제,186300
의료비,633600