bash에서 for 구문 사용하기

예전엔 1부터 10까지 expr를 이용해서 for문 같이 구현했었는데... 이외의 방법들도 많군요~


Bash For Loop Examples

by VIVEK GITE on OCTOBER 31, 2008 · 190 COMMENTS

How do I use bash for loop to repeat certain task under Linux / UNIX operating system? How do I set infinite loops using for statement? How do I use three-parameter for loop control expression?

A 'for loop' is a bash programming language statement which allows code to be repeatedly executed. A for loop is classified as an iteration statement i.e. it is the repetition of a process within a bash script.

For example, you can run UNIX command or task 5 times or read and process list of files using a for loop. A for loop can be used at a shell prompt or within a shell script itself.

for loop syntax

Numeric ranges for syntax is as follows:

for VARIABLE in 1 2 3 4 5 .. N
do
	command1
	command2
	commandN
done

This type of for loop is characterized by counting. The range is specified by a beginning (#1) and ending number (#5). The for loop executes a sequence of commands for each member in a list of items. A representative example in BASH is as follows to display welcome message 5 times with for loop:

#!/bin/bash
for i in 1 2 3 4 5
do
   echo "Welcome $i times"
done

Sometimes you may need to set a step value (allowing one to count by two's or to count backwards for instance). Latest bash version 3.0+ has inbuilt support for setting up ranges:

#!/bin/bash
for i in {1..5}
do
   echo "Welcome $i times"
done

Bash v4.0+ has inbuilt support for setting up a step value using {START..END..INCREMENT} syntax:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done

Sample outputs:

Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 times
Welcome 10 times

The seq command (outdated)

WARNING! The seq command print a sequence of numbers and it is here due to historical reasons. The following examples is only recommend for older bash version. All users (bash v3.x+) are recommended to use the above syntax.

The seq command can be used as follows. A representative example in seq is as follows:

#!/bin/bash
for i in $(seq 1 2 20)
do
   echo "Welcome $i times"
done

There is no good reason to use an external command such as seq to count and increment numbers in the for loop, hence it is recommend that you avoid using seq. The builtin command are fast.

Three-expression bash for loops syntax

This type of for loop share a common heritage with the C programming language. It is characterized by a three-parameter loop control expression; consisting of an initializer (EXP1), a loop-test or condition (EXP2), and a counting expression (EXP3).

for (( EXP1; EXP2; EXP3 ))
do
	command1
	command2
	command3
done

A representative three-expression example in bash as follows:

#!/bin/bash
for (( c=1; c<=5; c++ ))
do
	echo "Welcome $c times..."
done

Sample output:

Welcome 1 times
Welcome 2 times
Welcome 3 times
Welcome 4 times
Welcome 5 times

How do I use for as infinite loops?

Infinite for loop can be created with empty expressions, such as:

#!/bin/bash
for (( ; ; ))
do
   echo "infinite loops [ hit CTRL+C to stop]"
done

Conditional exit with break

You can do early exit with break statement inside the for loop. You can exit from within a FOR, WHILE or UNTIL loop using break. General break statement inside the for loop:

for I in 1 2 3 4 5
do
  statements1      #Executed for all values of ''I'', up to a disaster-condition if any.
  statements2
  if (disaster-condition)
  then
	break       	   #Abandon the loop.
  fi
  statements3          #While good and, no disaster-condition.
done

Following shell script will go though all files stored in /etc directory. The for loop will be abandon when /etc/resolv.conf file found.

#!/bin/bash
for file in /etc/*
do
	if [ "${file}" == "/etc/resolv.conf" ]
	then
		countNameservers=$(grep -c nameserver /etc/resolv.conf)
		echo "Total  ${countNameservers} nameservers defined in ${file}"
		break
	fi
done

Early continuation with continue statement

To resume the next iteration of the enclosing FOR, WHILE or UNTIL loop use continue statement.

for I in 1 2 3 4 5
do
  statements1      #Executed for all values of ''I'', up to a disaster-condition if any.
  statements2
  if (condition)
  then
	continue   #Go to next iteration of I in the loop and skip statements3
  fi
  statements3
done

This script make backup of all file names specified on command line. If .bak file exists, it will skip the cp command.

#!/bin/bash
FILES="$@"
for f in $FILES
do
        # if .bak backup file exists, read next file
	if [ -f ${f}.bak ]
	then
		echo "Skiping $f file..."
		continue  # read next file and skip cp command
	fi
        # we are hear means no backup file exists, just use cp command to copy file
	/bin/cp $f $f.bak
done

Recommended readings:

  • See all sample for loop shell script in our bash shell directory.
  • man bash
  • help for
  • help {
  • help break
  • help continue

Updated for accuracy!

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2011/11/04 11:16 2011/11/04 11:16
Response
5 Trackbacks , No Comment
RSS :
http://b4you.net/blog/rss/response/264

sendmail 재시작

/etc/init.d/sendmail restart
/etc/init.d/saslauthd restart
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2011/09/15 21:42 2011/09/15 21:42
,
Response
10 Trackbacks , No Comment
RSS :
http://b4you.net/blog/rss/response/260

Vim에서 다른 encoding으로 저장하기

파일을 사용하다 보면 utf-8에서 euc-kr로 저장하거나 euc-kr에서 utf-8로 변환하여 저장해야 될 필요가 있다.
이럴 땐 다음과 같은 과정을 거쳐 변환하여 저장할 수 있다.


파일을 열고

:e ++enc=<encoding>


를 이용하여 해당 <encoding>으로 변환한다. 이 때 <encoding>는 열고자 하는 파일의 encoding 방식이다.
그런 뒤,

:w ++enc=<encoding>


를 이용하여 새로운 <encoding>으로 저장한다. 물론 다른이름으로 저장하고자 한다면

:w <filename> ++enc=<encoding>


와 같이 하면 된다.

P.S. Vim자체의 언어를 바꾸고 싶다면

:set encoding=<encoding>


으로 설정하면 된다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/12/04 09:58 2007/12/04 09:58
, , ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/155

MySQL 사용자 계정 관리

* 계정 추가
1) 먼저 DB에 접속해서 DB를 생성한다.

mysql> CREATE DATABASE <DB_NAME>;


2) 사용자를 추가함 과 동시에 DB에 대한 권한을 부여한다
GRANT <PRIVILEGES> ON <DB_NAME>.* TO <USER_ID>@<HOST> IDENTIFIED BY '<PASSWORD>'

와 같은 명령을 입력하면 된다. 각 인자에 대한 설명은 다음과 같다.

<PRIVILEGES>: SELECT, INSERT, UPDATE, DELETE, CREATE, DROP 중 선택해서 넣어준다. 또는 ALL를 사용해도 된다.
<DB_NAME>: 접근 권한을 줄 DB 이름
<USER_ID>: 접근 권한을 시킬 ID
<HOST>: 호스트. 보통은 localhost를 사용하지만 모든 호스트에 대해서라면 %를 넣어준다. localhost를 사용한다면 로컬에서만 접근이 가능하며, %를 넣어주게 되면 모든 호스트에서 접근이 가능하다.

예)
mysql> CREATE DATABASE MyTest;

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON MyTest.* TO MyTestID@localhost IDENTIFIED BY 'mypass';


MyTestID 라는 계정을 추가하며 localhost에서 MyTest라는 DB를 접근할 수 있게 한다. 이렇게 한 뒤

[root@localhost root]# mysql -u MyTestID -p
Enter password: <mypass를 입력>

와 같이 접속할 수 있다.

* 계정 삭제
계정을 삭제 하기 위해서는 다음과 같은 절차를 거친다.

1) mysql DB 선택
mysql> use mysql;


2) 사용자에게 할당된 DB를 삭제한다
mysql> DROP DATABASE <DB_NAME>;


3) 사용자에게 적용된 DB 권한을 삭제한다
mysql> DELETE FROM db WHERE Host='<HOST>' AND User='<USER_ID>';



4) 사용자 목록에서 삭제한다
mysql> DELETE FROM user WHERE Host='<HOST>' AND User='<USER_ID>';


* 권한 재적용
권한을 재적용 하기 위해서는 myql을 껐다 키는 방법도 있지만
mysql> FLUSH PRIVILEGES;

또는
[root@localhost root]# mysqladmin -u root -p reload

와 같이 실행한다

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2006/12/29 14:54 2006/12/29 14:54
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/52

MySQL 5 설치하기

1. www.mysql.com 에서 mysql 소스(tarball로 된 소스)를 다운로드 받는다.

2. 다음의 순서대로 실행한다

1) mysql 계정을 추가한다

[root@localhost root]# groupadd mysql

2) mysql 그룹을 추가한다

[root@localhost root]# useradd -g mysql mysql

3) tarball의 압축을 푼다

[root@localhost root]# tar xvfz mysql-5.0.27.tar.gz

4) 디렉토리 이동 후

[root@localhost root]# cd mysql-5.0.27

5) 설치될 경로를 설정한다

[root@localhost mysql-5.0.27]# ./configure <옵션>

사용할 수 있는 옵션
* --prefix=<설치될 경로>(예: /usr/local/mysql)
* --with-unix-socket-path=<socket경로> (예: /var/tmp/mysql.sock)
* --with-tcp-port=<포트> (예: 3306)
* --with-mysqld-user=<user이름> (예: mysql)
* --with-charset=<언어> (예: euc_kr)

6) 컴파일 한다

[root@localhost mysql-5.0.27]# make

7) 설치 한다

[root@localhost mysql-5.0.27]# make install

8) 서버의 성능에 따라 설정 파일을 복사한다

[root@localhost mysql-5.0.27]# cp support-files/<크기> (예: my-large.cnf) /etc/my.cnf

9) 설치 된 경로로 이동한다

[root@localhost mysql]# cd /usr/local/mysql

10) db를 초기화 시킨다

[root@localhost mysql]# bin/mysql_install_db --user=mysql

11) 디렉토리 권한을 바꿔준다

[root@localhost mysql]# chown -R root .
[root@localhost mysql]# chown -R mysql var
[root@localhost mysql]# chgrp -R mysql .
[root@localhost mysql]# chmod 711 .
[root@localhost mysql]# chmod 711 bin lib
[root@localhost mysql]# chmod 700 libexec mysql-test share
[root@localhost mysql]# chmod 750 /usr/local/mysql/var

12) 시스템 시작 시 자동으로 실행되게 하려면 init.d에 등록한다

[root@localhost mysql]# install -m 700 share/mysql/mysql.server /etc/init.d/mysqld

13) mysqld를 실행한다

[root@localhost mysql]# bin/mysqld_safe --user=mysql &

또는
[root@localhost mysql]# /etc/init.d/mysqld start

14) admin 비밀번호를 변경한다

[root@localhost mysql]# bin/mysqladmin -u root password '<비밀번호>'

3. c와의 연동
1) lib파일들 설정

[root@localhost root]# vi /etc/ld.so.conf

여기서
"/usr/local/mysql/lib/mysql" 과 같이 mysql의 library 디렉토리를 적어준다

2) 컴파일 시 header 및 경로 설정

gcc의 옵션에서 다음과 같은 옵션을 준다

* -I<include경로> (예: /usr/local/mysql/include/mysql)
* -lmysqlclient
* -L<lib경로> (예: /usr/local/mysql/lib/mysql)

예를들어 다음과 같이 Makefile로 작성해 놓으면 편하다

CC=g++
CFLAGS=-Wall -O3 -pedantic -Werror
HEADER=-I/usr/local/mysql/include/mysql
LIBRARY=-lmysqlclient -lstdc++
LIBRARY_DIRECTORY=-L/usr/local/mysql/lib/mysql
EXE=mysql
OBJ=Main.o

.cpp.o:
$(CC) $(CFLAGS) $(HEADER) -c $<

.c.o:
$(CC) $(CFLAGS) $(HEADER)-c $<

all: $(EXE)

$(EXE): $(OBJ)
$(CC) $(CFLAGS) $(HEADER) $(LIBRARY) $(LIBRARY_DIRECTORY) -o $(EXE) $(OBJ)
rm -f $(OBJ)

clean:
rm -f $(OBJ) $(EXE)

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2006/12/27 17:53 2006/12/27 17:53
,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/49


블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

Calendar

«   2017/12   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            

Site Stats

Total hits:
2084517
Today:
4361
Yesterday:
5115