반응형

OS: Ubuntu 16.04

Shell: bash



배쉬(bash) 쉘에서 반복문, 즉 루프(loop)를 돌릴 때 여러가지 방법을 사용할 수 있다.



1. seq 사용


가장 간단한 방법이다. seq라는 프로세스가 순서대로 숫자를 출력해 주는 역할을 하는데, 그 결과를 문자열로 받아서 루프로 사용한다.


skylit@Linux:~$ seq 1 10
1
2
3
4
5
6
7
8
9
10


배쉬 쉘에서 seq를 바로 실행하면 위와 같이 나오고, 이것을 문자열로 사용해서 루프를 돌린다.


#!/bin/bash


SET=$(seq 0 9)

for i in $SET

do

    echo "Running loop seq "$i

    # some instructions

done


실행 결과:

Running loop seq 0
Running loop seq 1
Running loop seq 2
Running loop seq 3
Running loop seq 4
Running loop seq 5
Running loop seq 6
Running loop seq 7
Running loop seq 8
Running loop seq 9




2. 공백으로 구분된 문자열 사용


위의 seq를 그냥 수동으로 입력하는 방법이다. seq 쓰는 것과 아무 차이가 없고, 대신 사용자가 원하는 순서대로 숫자의 나열을 바꾸거나 뺄 수 있다.

루프 돌리는 수가 적고, 특정한 번호 순서를 직접 명시하고 싶을 때 유용하다.

#!/bin/bash


ORDER="5 6 7 8 9 4 3 2 1 0"

for i in $ORDER

do

    echo "Running loop "$i

    # some instructions

done


실행 결과:

Running loop 5
Running loop 6
Running loop 7
Running loop 8
Running loop 9
Running loop 4
Running loop 3
Running loop 2
Running loop 1
Running loop 0


물론 숫자 말고 다른 문자열도 가능하다.


#!/bin/bash


ORDER="apple orange watermelon"

for i in $ORDER

do

    echo $i

    # some instructions

done


실행 결과:

apple
orange
watermelon




3. bash의 루프 문법 사용


C/C++과 가장 유사한 형태라서 편하게 쓸 수 있다.

그리고 앞서 소개한 두 방법은 메모리에 문자열 변수를 할당하고 있어야 하는데 루프의 수가 매우 커지면 문자열의 길이도 그만큼 길어지기 때문에, 혹시나 너무 큰 루프 숫자로 인해 발생하는 메모리 문제를 방지하고 싶다면 이 방법이 유리하다.


#!/bin/bash


for ((i=0;i<=9;i++))

do

    echo "Running loop "$i

    # some instructions

done


실행 결과:

Running loop 0
Running loop 1
Running loop 2
Running loop 3
Running loop 4
Running loop 5
Running loop 6
Running loop 7
Running loop 8
Running loop 9







반응형
블로그 이미지

Bryan_

,
반응형

OS: Ubuntu 16.04 (amd64)

Shell: bash


Bash 또는 sh 기반으로 쉘 스크립트를 만들다 보면 하나의 스크립트에서 다른 쉘 스크립트를 실행할 때가 있다. 작은 숫자나 짧은 문자열과 같이 간단한 변수는 그냥 argument로 넘겨도 되지만, 가끔은 배열(array)이나 길이가 꽤 긴 문자열을 포함해서 이런 복잡한 argument의 개수 자체가 매우 많아지면 argument를 쓰는 것이 성가신 작업이 되고 만다. 그럴 때는 환경변수를 쓰는 방법이 있다.


1. Argument passing 방법


<script_1.sh>

#!/bin/sh

EXP_NAME="wireless simulation 180206"

echo "Experiment name is $EXP_NAME"


./script_2.sh $EXP_NAME


<script_2.sh>

#!/bin/sh

EXP_NAME=$1

echo "Experiment name is $EXP_NAME"



2. 환경변수를 사용하는 방법


<script_1.sh>

#!/bin/sh


EXP_NAME="wireless simulation 180206"

FLOW_SET="0 1 2 3 4 5 6 7 8 9"


echo "Script 1 - experiment name is $EXP_NAME"

for item in $FLOW_SET

do

    # Do some tasks.

    echo "Script 1 - working on $item"

done


export EXP_NAME

export FLOW_SET

./script_2.sh


<script_2.sh>

#!/bin/sh


echo "Script 2 - experiment name from environment variable: $EXP_NAME"

for i in $FLOW_SET

do

    echo "Script 2 - working on $i"

done


<환경변수를 이용한 방법 실행 결과>




반응형
블로그 이미지

Bryan_

,