'Linux'에 해당되는 글 19건
ubunt 14.10 desktop mysql error 1045 에러
Linux










리눅스 OS와 version 체크 명령어
Linux
[root@dbsafer .conf]# cat /etc/issue
CentOS release 5.8 (Final)
Kernel \r on an \m

[root@dbsafer .conf]# cat /etc/redhat-release 
CentOS release 5.8 (Final)

[root@dbsafer dbsafer3]# uname -a
Linux dbsafer 2.6.18-308.el5 #1 SMP Tue Feb 21 20:06:06 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
vmware linux가 설치된 곳에 외부 모바일, pc로 원격 접속하기
Linux

server : vmware oracle enterprise linux 6

host client : windows7

connect program : putty, connetbot, linux terminer


1.vmware linux 내의 ip와 host ip를 확인한다.

1) linux : ifconfig

2) windows : ipconfig

ipv4 주소 : 61.72.200.14


2. 리눅스상에서 ip확인

172.16.126.128


3.vmware edit 누르면 virtual network editor을 누른다.


4.맨 아래의 vmnet8 nat 클릭후에 nat setting 클릭


5. add 클릭

http://oooooohi.tistory.com/admin/entry/post/


6.NAT Settings 에서 Add를 선택하여 guest OS IP를 입력

1) 호스트 포트는 충돌되지 않도록 1024~65535 사이의 포트를 선택한다.

2) VMware 포트는 22번 입력

(ssh는 22번 , telnet은 23번 , apache등의 웹 서비스는 80번)

3) virtualmachine ip는 linux상의 ip를 입력

4) virtual machine port는 위 설명과 동일

5) description은 참고정도 이니 무시해도 괜찮


6.다음으로 windows의 네트워크 설정으로 들어가서 network adapter vmnet8번을 더블클릭한다.


7. 상태창이 나오는데 속성 클릭


8. ipv6은 해제해주고 vmware bridge protoctl 체크해주고 확인을 눌러주면 된다.

(왜 체크해줘야 하냐면 로컬영역+vmnet1+vmnet8 요 3개의 네트워크를 연결해주는 프로토콜이

바로 vmware bridge protoctl이다. 그래야 네트워크가 서로 통신이 가능하지요.)


9. Host name에 host ip를 적어주고 왼쪽 port에 vmware에 열어놨던 포트를 적는다.


10. host ip로 gust os 서버로 접속 성공하였다. 스마트폰 어플중에 connectBot이라는

ssh,telnet,localhost로 원격으로 서버에 접속할수 있는 프로그램이 있는데 그것도 가능하다.

connectBot : [user@hostname:port] -> [root@61.72.200.14:1988]


(**원격으로 접속후에 한글이 깨진다면*)

유니코드를 UTF-8로 변경하고 저장 종료 재시작

기본이 UFT-8이면 CP949로 변경 후 저장 종료 재시작


vmware(10) tool 설치
Linux

vmware version 10.4

tool -> 최신


1.Vmware 카테고리에 VM메뉴를 클릭한다.

아래로 내리다보면 Cancel VMware Tools Installation이 있는데 클릭해보면

sr0 cd가 mount되면서 해당 설치 디렉토리로 이동됨


2.root계정으로 작업하길 권장합니다.

작업 할 위치에 디렉토리를 하나 만들고 tool설치 파일이 있는 곳까지 이동한다.

여기서는 /home/oracle/vmwaretool 이라는 디렉토리를 만들었고

설치파일 모든것을 vmwaretool 디렉토리로 이동시켰다.


3. 복사한 위치로 와서 VMwareToole-9.6.2-1688356.tar.gz의 압축을 푼다.

tar -zxvf VMwareToole-9.6.2-1688356.tar.gz


4. 압축을 풀었더니 vmware-tools-distrib 디렉토리가 생겼고 cd로 이동한다.

리스트를 조회해보니 설치 파일이 보인다. 실행

./vmware-install.pl


5. 오라클 계정인지 깜빡하고 다시  root  계정으로 실행시켰다

(oracle 계정으로 실행시 abort라는 에러메세지가 뜸)


6. 설치가 진행중인데 처음부터 끝까지 엔터로 넘어가면 된다.


7.설치가 정상적으로 완료된 화면

Enjoy, --  VMware team


8. 업그레이드를 안해줘도 무방하지만 내눈에 보였으므로 업그레이드까지 설치한다.

해당 OS는 (linux) 32bit이므로 vmware-tools-upgrader-32를 설치한다.

./vmware-tools-upgrader-32

설치과정은 위와 동일하다. 무한 엔터


9.설치가 완료되면 linex를 한번 shutdown 시키고 가동시킨다.


10.재부팅이 완료된 화면

위 메뉴에서 enter unity mode를 클릭하면 끝

터미널 하나 열고 클릭하길 바란다.


11. 정상적으로 바탕화면에 보이는 터미널 창


* 삭제 방법*



vmware 설치파일 디렉토리에 보면 bin이라는 디렉토리가 있는데 들어가자

그러면 uninstall이라는 실행파일이 보인다. 실행시키면 삭제된다.

./vmware-uninstall-tools.pl



Linux : not in gzip format 에러 (tar~)
Linux

Linux로 설치파일을 받았는데 압축파일로 압축해제 할때 에러 대처


firefox로 설명해보겠습니다.


[root@dbserver ~]# cd /app

[root@dbserver app]# ls

firefox-30.0.tar.bz2 lost+found oracle oraInventory temp tmp


[root@dbserver app]# tar zxvf firefox-30.0.tar.bz2

gzip: stdin: not in gzip format

tar: Child returned status 1

tar: Rrror is not recoerable: exiting now


압축파일이 tar.gz 가 아니고 tar 일때는 z를 빼면 된다.

tar -zxvf "압축파일명.tar.gz


tar -xvf "압축파일명".tar(buz~)


tar.gz인가 tar인가 확인하고 입력해주면 된다.



No package oracle-rdbms-server-12cR1-reinstall available
Linux

Oracle enterprise linux 64bit

oracle 12cR1  기준


yum으로 oracle-rdbms-server-12cR1-preinstall 다운받으려고 하면

No Packege oracle-rdbms-server-12cR1-preinstall available.

이라고 뜬다.


이럴때 쓰는 방법이 직접 다운로드 받는법이 있는데 네트워크 설정이 되어 있어여 한다.


아래는 에러문구

[root@dbserver ~]# yum install oracle-rdbms-server-12cR1-preinstall -y

Loaded plugins: refresh-packagekit, rhnplugin

This system is not registered with ULN.

ULN support will be disabled.

shtting up install process

No package oracle-rdbms-server-12cR1-preinstall available.


리눅스 서버에 따라 설정이 약간씩 다르니 스냅샷정도는 찍어놔도 될듯하다.

[root@dbserver ~]# cd /etc/yum.repos.d

[root@dbserver yum.repos.d]# wget http://public.oracle.com/public-yum-ol6.repo


[root@dbserver ~]# cd /etc/yum.repos.d

[root@dbserver yum.repos.d]# wget http://public.oracle.com/public-yum-ol6.repo

Resolving public-yum.oracle.com . . .  61.111.58.32, 61.111.58.8

Connecting to public-yum.oracle.com|61.111.58.32|:80 . . . connected.

HTTP repuest sent, awaiting response . . .  200 OK

Length: 4233 (4.1K)  [Text/plain]

Saving to: "Public-yum-ol6.repo"


이하생략


Installed:

oracle-rdbms-server-12cR1-preinstall.x84_64 0:1.0-11.el6

Dependency Installed:

ksh.x86_64  0:20120801-10.el6_5.6                    libaio-devel.x86_64 0:0.3.107-10.el6

complete!

[root@dbserver yum.repos.d]#


'Linux' 카테고리의 다른 글

vmware(10) tool 설치  (0) 2014.11.04
Linux : not in gzip format 에러 (tar~)  (2) 2014.10.31
set sqlprompt 사용법  (0) 2014.10.31
리눅스 디스크 관리 및 추가  (0) 2014.10.31
리눅스(linux) LVM 디스크 관리 및 추가  (0) 2014.10.31
set sqlprompt 사용법
Linux

디비에 접속하면 SYS계정으로 접속했는지 SCOTT로 접속했는데


가끔 햇갈릴때가 있다. 물론 SHOW USER; 쳐보면 나오긴하는데..귀찮아..


SQLPROMPT로 설정하는 방법이 있다. 한번 알아보자

[oracle@dbserver ~]$ cd $ORACLE_HOME/sqlplus/admin/
[oracle@dbserver admin]$ ls
glogin.sql  help  libsqlplus.def  plustrce.sql  pupbld.sql
[oracle@dbserver admin]$ vi glogin.sql
vi로 열고 들어가면 앞에 "--" 붙은 주석이 있을텐데 신경 안써두 되고 그 아래에다가 다음 쿼리 한줄을 입력해 주고 wq! 저장종료하고 나오자.
set sqlprompt "_유저이름>"


종료하고 나와서 디비가 켜져있다면 셧다운 시키고 다시 들어가보자.
_SYS>show user;
USER is "SYS"


_SCOTT>show user;
USER is "SCOTT"




리눅스 디스크 관리 및 추가
Linux
     리눅스 디스크 관련 명령어
[root@dbserver ~]# fdisk -l                               /연결되어 있는 해당 디렉토리를 보여줌
[root@dbserver ~]# fdisk /dev/sda                         /디스크 파티션 나누기 생성
[root@dbserver ~]# mkfs.ext3 /dev/sda(number)             /파티션 나누고 포멧하기
[root@dbserver ~]# mount /dev/sda(number) /dir1           /디스크 마운트 하기
[root@dbserver ~]# df -h                                  /디스크 용량 확인
[root@dbserver ~]# vi /etc/fstab                          /디스크 추가 마운트 정보를 적어줘야함

     총 5개의 1G 하드디스크를 추가했다.

[root@dbserver ~]# fdisk -l

Disk /dev/sdc: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004badc

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        2576    20480000   83  Linux
/dev/sda3            2576        3851    10240000   83  Linux
/dev/sda4            3851        6528    21502976    5  Extended
/dev/sda5            3851        4616     6144000   83  Linux
/dev/sda6            4616        5126     4096000   82  Linux swap / Solaris
/dev/sda7            5126        6528    11259904   83  Linux

Disk /dev/sdd: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdf: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sde: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
       추가된 디스크 네임은 sdb,sdc,sdd,sde,sdf 총 5개
      이중에 2개는 일반적인 디스크 추가방법으로 설정하고,
      나머지 3개는 추후에 포스팅 될 lvm방법으로 추가해보겠다.


      지문이 길어지니 한번만 실행해보겠다. sdb 디스크를 추가하자.
[root@dbserver ~]# fdisk /dev/sdb

[root@dbserver ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x110bf577. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). Command (m for help): n /new를 뜻한다 Command action e extended p primary partition (1-4) p /e는 익스텐디드고 여기선 프라이머리 파티션으로 나눈다. Partition number (1-4): 1 /총 2개의 파티션으로 나눌거고 처음이니까 1입력(솔라리스는 0) First cylinder (1-130, default 1): /실린더번호는 엔터치면 알아서 잡아준다.(솔라리스는 직접입력해야함) Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130): +500M /1번 파티션에서 500mb주고 다음 2번은 이 과정에서 엔터치면 나머지 다 들어간다. Command (m for help): P /나누어진 파티션 정보열람 Disk /dev/sdb: 1073 MB, 1073741824 bytes 255 heads, 63 sectors/track, 130 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x110bf577 Device Boot Start End Blocks Id System /dev/sdb1 1 65 522081 83 Linux /dev/sdb2 66 130 522112+ 83 Linux /sdb의 1번 파티션으로 나눠졌다. 2번에도 똑같이 해주면 된다. Command (m for help): w /지금까지 나눴던 파티션을 저장 한다. 하지않고 나가면 저장되지 않는다 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.

       이제 파티션이 나눠졌으면 포멧을 해야한다.
      리눅스 파티션 포멧 명령어는 mkfs고, 솔라리스는 newsf다.
      그리고 리눅스에서 많이 사용 되는 파일 시스템 종류는 ext3고 ext4,ext2도 많이 쓴다.
      윈도우는 NTFS, 솔라리스는 UFS를 사용한다. 나눠진 파티션넘버마다 포멧을 해줘야한다.

[root@dbserver ~]# mkfs.ext3 /dev/sdb1
mkfs.ext3 /dev/sdb1
mke2fs 1.43-WIP (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
130560 inodes, 522080 blocks
26104 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
64 block groups
8192 blocks per group, 8192 fragments per group
2040 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
      지문 관계상 2번 포멧은 쓰지 않았다. 알아서들 포멧 하세요. 그럼 이제 디렉토리를 만들고 마운트 하는 일만 남았다.
[root@dbserver ~]# mkdir /dir1
[root@dbserver ~]# mkdir /dir2
[root@dbserver ~]#
[root@dbserver ~]# mount /dev/sdb1 /dir1
[root@dbserver ~]# mount /dev/sdb1 /dir2
[root@dbserver ~]#
[root@dbserver ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       9.5G  5.3G  3.8G  58% /
tmpfs           998M   80K  998M   1% /dev/shm
/dev/sda2        20G   13G  5.5G  70% /app
/dev/sda1       190M  159M   17M  91% /boot
/dev/sda7        11G  2.5G  7.5G  25% /home
/dev/sda5       5.7G  2.3G  3.1G  43% /var
/dev/sr0        3.7G  3.7G     0 100% /media/OL6.5 x86_64 Disc 1 20131125
/dev/sdb1       494M   11M  458M   3% /dir1
/dev/sdb1       494M   11M  458M   3% /dir2
      끝이지만 여기서 리부팅 했다면 모든 마운트가 풀리고 디스크가 사라진다. 그러지 않기 위해서는 fstab에 등록해줘야 한다.
[root@dbserver ~]#vi /etc/fstab
# /etc/fstab
# Created by anaconda on Mon Jul 14 07:23:11 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#

/dev/sdb1               /dir1                   ext3    defaults        1 2    /해당경로 써주고 마운트된 디렉토리, 파일시스템, 기본값과 1,2써주면 됨
/dev/sdb2               /dir2                   ext3    defaults        1 2    /똑같이 해주면 됨
~



리눅스(linux) LVM 디스크 관리 및 추가
Linux
     여기서 사용한 명령어 모
[root@dbserver ~]# fdisk /dev/sdc                 /처음 파티션을 나눠주기 위한 명령어(fdisk /dev/디스크)
[root@dbserver ~]# fdisk -l                       /디스크 파티션 정보
[root@dbserver ~]# pvcreate /dev/sdc1             /논리적에서 물리적 볼륨으로 변환 명령어
[root@dbserver ~]# vgcreate lvm /dev/sdc1 \       /lvm이란 볼륨그룹에 3개의 물리적 볼륨을 합치는 명령어
>                               /dev/sdd1 \
>                               /dev/sde1
[root@dbserver ~]# vgdisplay                      /생성된 논리적 볼륨을 보여주는 명령어
[root@dbserver ~]# lvcreate -L 1500MB -n lv1 lvm  /lvm볼륨그룹에서 파티셔닝 할 수 있는 명령어
[root@dbserver ~]# lvscan                         /생성된 논리적 볼륨 그룹을 조회 하는 명령어
[root@dbserver ~]# mkfs.ext3 /dev/lvm/lv1         /mkfs포멧
[root@dbserver ~]# df -h                          /하드 조회
[root@dbserver ~]#vi /etc/fstab                   /fstab에 디스크 파티셔닝 정보를 입력해야함


        LVM이란 Local Volume Manager의 약자로 물리적으로 여러 개의 디스크를 논리적으로 하나의 디스크로 합쳐주고
      다시 논리적으로 나누어서 관리하게 해 주는 방법을 말한다. 아래에는 1gb의 용량의 디스크 3개를 LVM을 사용해서
      3GM의 용량의 디스크 1개로 만들어 주고 이것을 각각 다시 1.5GB 씩 두개로 나누게 해주는 방법을 말한다.

[root@dbserver ~]# fdisk /dev/sdc

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xfc5b1df1.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n                                                 /new를 뜻함
Command action
   e   extended
   p   primary partition (1-4)
p                                                                       /primary로 나눔
Partition number (1-4): 1                                               /첫번째 파티션
First cylinder (1-130, default 1):                                      /엔터치면 실린더넘버는 알아서 입력된다.
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-130, default 130):         /나누지 않을것이기에 엔터
Using default value 130

Command (m for help): t                                                 /t 입력
Selected partition 1
Hex code (type L to list codes): 8e                                     /8e 입력
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): w                                                 /생성한 파티션 저장
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@dbserver ~]#



        위 파티션에서 t,8e 가 추가 되었는데 이 부분이 파티션을 생성할 때 linux LVM 용으로 파티션을 생성하는 단계이다.
      지문이 길어지므로 나머지 sdd, sde 이 두개의 디스크도 동일하게 위와 같이 lvm 파티션으로 생성하면 된다. 알아서 해라.

      파티션 작업이 모두 끝났다면 이제 조회를 해보자.

[root@dbserver ~]# fdisk -l                                                    /생성한 파티션 조회

Disk /dev/sdd: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x16dcfdbd

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1         130     1044193+  8e  Linux LVM              /정삭적으로 LVM으로 만들어졌다

Disk /dev/sdc: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xfc5b1df1

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1         130     1044193+  8e  Linux LVM              /정삭적으로 LVM으로 만들어졌다

Disk /dev/sde: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xb628b079

   Device Boot      Start         End      Blocks   Id  System
/dev/sde1               1         130     1044193+  8e  Linux LVM              /정삭적으로 LVM으로 만들어졌다

Disk /dev/sda: 53.7 GB, 53687091200 bytes
255 heads, 63 sectors/track, 6527 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004badc

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        2576    20480000   83  Linux
/dev/sda3            2576        3851    10240000   83  Linux
/dev/sda4            3851        6528    21502976    5  Extended
/dev/sda5            3851        4616     6144000   83  Linux
/dev/sda6            4616        5126     4096000   82  Linux swap / Solaris
/dev/sda7            5126        6528    11259904   83  Linux

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x110bf577

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          65      522081   83  Linux
/dev/sdb2              66         130      522112+  83  Linux
[root@dbserver ~]#
        각 파티션이 나눠진 디스크를 보면 id=8e , system=Linux LVM이라고 쓰여져 있다.
      아~주 잘 LVM용 파티션으로 나누어 졌다. 다음으로 넘어가자.

      이젠 아까 만들었던 LVM용 디스크3개를 각각 물리적 볼륨(논리적에서)으로 변환하겠다. 오타는 용서치 않음
[root@dbserver ~]# pvcreate /dev/sdc1                       / 논리적 볼륨에서 물리적 볼륨으로 변환
  dev_is_mpath: failed to get device for 8:33
  Physical volume "/dev/sdc1" successfully created
[root@dbserver ~]# pvcreate /dev/sdd1                       / 논리적 볼륨에서 물리적 볼륨으로 변환
  dev_is_mpath: failed to get device for 8:49
  Physical volume "/dev/sdd1" successfully created
[root@dbserver ~]# pvcreate /dev/sde1                       / 논리적 볼륨에서 물리적 볼륨으로 변환
  dev_is_mpath: failed to get device for 8:65
  Physical volume "/dev/sde1" successfully created
[root@dbserver ~]#

      변환이 완료 되었다. 그럼 이제 물리적으로 변환했으면 이 볼륨 3개를 1개의 볼륨그룹으로 합쳐야한다.(RAID의 개념을 알고 있어야 한다)
[root@dbserver ~]# vgcreate lvm /dev/sdc1 \
>                               /dev/sdd1 \                 / 물리적 볼륨 3개를 lvm(이름 맘대로 정해도 됨)이라는 1개의 볼륨그룹으로 합침
>                               /dev/sde1
  Volume group "lvm" successfully created
[root@dbserver ~]#


      3개의 볼륨을 하나의 볼륨그룹으로 합쳤고, vgdisplay 명령어를 쳐서 확인해보자.
[root@dbserver ~]# vgdisplay
  --- Volume group ---
  VG Name               lvm
  System ID
  Format                lvm2
  Metadata Areas        3
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                3
  Act PV                3
  VG Size               2.98 GiB
  PE Size               4.00 MiB
  Total PE              762
  Alloc PE / Size       0 / 0
  Free  PE / Size       762 / 2.98 GiB
  VG UUID               pZQSHo-BZMU-4rhM-7qxX-N1aU-aD6I-CO6UrR

[root@dbserver ~]#

        vg size에 3gb가 있다. 하나의 볼륨그룹으로 제대로 합쳐진 상태고 이제 1.5gb씩 파티셔닝 할 차례이다.
      물리적인 디스크는 fdisk로 파티션을 분할 하지만, 논리적인 LVM디스크는 lvcreate 명령어로 분할한다.(logical volume)


[root@dbserver ~]# lvcreate -L 1500MB -n lv1 lvm
  Logical volume "lv1" created                                   /1개의 lvm디스크에서 파티셔닝함(여러개 가능)
[root@dbserver ~]# lvcreate -L 1500MB -n lv2 lvm
  Logical volume "lv2" created
[root@dbserver ~]#

       위와 같이 논리적 볼륨 lv1(다르게 네임 지어줘도 됨)이 볼륨그룹 lvm안에 만들어졌다.
      vgdisplay명령어로 남아 있는 공간을 확인 한 후에 나머지 논리적 볼륨 lv2를 알아서 만들자.

      다 만들었으면 lvscan 명령어로 확인해보자.

[root@dbserver ~]# lvscan
  ACTIVE            '/dev/lvm/lv1' [1.46 GiB] inherit
  ACTIVE            '/dev/lvm/lv2' [1.46 GiB] inherit
[root@dbserver ~]#

       히야. 겁나게 잘 만들어졌다.
      항상 파티셔닝이 끝나면 포멧을 해줘야 한다. 리눅스에서는 포멧할때 mkfs를 사용한다.

      이제 포멧해보자.

[root@dbserver ~]# mkfs.ext3 /dev/lvm/lv1                       /포멧하자...하...
mke2fs 1.43-WIP (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
96000 inodes, 384000 blocks
19200 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=394264576
12 block groups
32768 blocks per group, 32768 fragments per group
8000 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

       나머지 하나의 볼륨(lv2)도 알아서 말 안해도 포멧해라.
      그리고 마지막 과정인 디렉토리를 생성하고 마운트하면 끝난다.
      그리고 꼭 fstab에 정보를 입력해 두자.

[root@dbserver ~]# ls /
app   cgroup  dir2  lib         media  net   root     srv  usr
bin   dev     etc   lib64       misc   opt   sbin     sys  var
boot  dir1    home  lost+found  mnt    proc  selinux  tmp
[root@dbserver ~]# mkdir /dir3                                 /dir3 디렉토리 생성
[root@dbserver ~]# mkdir /dir4                                 /dir4 디렉토리 생성
[root@dbserver ~]#
[root@dbserver ~]# mount /dev/lvm/lv1 /dir3                    /dir3 마운트
[root@dbserver ~]# mount /dev/lvm/lv1 /dir4                    /dir4 마운트
[root@dbserver ~]#
[root@dbserver ~]# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda3            9.5G  5.3G  3.8G  58% /
tmpfs                998M   76K  998M   1% /dev/shm
/dev/sda2             20G   13G  5.5G  70% /app
/dev/sda1            190M  159M   17M  91% /boot
/dev/sda7             11G  2.5G  7.5G  25% /home
/dev/sda5            5.7G  2.3G  3.1G  43% /var
/dev/mapper/lvm-lv1  1.5G   35M  1.4G   3% /dir3
/dev/mapper/lvm-lv1  1.5G   35M  1.4G   3% /dir4
[root@dbserver ~]#
[root@dbserver ~]#vi /etc/fstab                                 /lvm디스크 정보저장
# /etc/fstab
# Created by anaconda on Mon Jul 14 07:23:11 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=147fcbc4-fddc-419e-8ece-111d5acc56d7 /                       ext4    defaults        1 1
UUID=7da49108-d211-4727-9152-edb7dea56f6b /app                    ext4    defaults        1 2
UUID=3d938562-8552-4064-bc4e-cf75b117aaea /boot                   ext4    defaults        1 2
UUID=f518c3a4-c3b2-4a06-8347-7184cd4f4e6c /home                   ext4    defaults        1 2
UUID=682a4749-3154-4915-81bb-5926fe21b909 /var                    ext4    defaults        1 2
UUID=4abfebb2-f61b-4878-98c4-e951aa6a9034 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/mapper/lvm-lv1                       /dir3                   ext3    defaults        1 2
/dev/mapper/lvm-lv2                       /dir4                   ext3    defaults        1 2


'Linux' 카테고리의 다른 글

set sqlprompt 사용법  (0) 2014.10.31
리눅스 디스크 관리 및 추가  (0) 2014.10.31
리눅스 shell script  (0) 2014.10.31
lunux(리눅스) 압축 파일 관리 (compress.tar, gzip 등)  (0) 2014.10.31
리눅스에 iptraf3.0 설치  (1) 2014.10.31
리눅스 shell script
Linux

script : 수행 해야할 여러가지 작업들을 하나 파일로 정해놓은 것
shell script : shell이 script를 실행한다.

  • bourne shell : 최초의 shell. 지원하는 명령어가 적음
    /bin/sh
  • c shell : bourne shell의 개량형
    /bin/csh
  • korn shell : 유닉스에서 많이 사용중인 shell (bourne shell + 편의 기능)
    /bin/ksh
  • bash shell :리눅스의 기본 shell로 다양한 명령과 편의성을 지원함
    /bin/bash
  • /usr/bin/명령어 : 일반 유저 사용
  • /usr/sbin/명령어 : 슈퍼유저 사용(root)

shell script를 쓸때 첫줄에는 반드시 쉘 타입을 써줘야한다.
단 첫줄은 주석으로 읽지 않는다.
- #!/bin/bash

shell script를 실행할때는 실행권한이 있을때와 없을때가 다르다.

  • ./filename.sh : 실행권한 있을때
  • sh filename.sh : 실행권한 없을때
    또 한가지 방법으로는 chmod를 이용해 실행권한을 줘도 된다.

shell script 형식
-echo : echo뒤의 내용을 화면에 출력한다.

[root@dbserver shell]# vi fruit.sh
       1 #bin/bash
       2
       3 fruit=apple
       4 drink=cokecola
       5
       6 echo $fruit
       7 echo $drink

변수명으로 쉘 스크립트 짜기
‘변수명 = 값’ 형태로 사용( 절대 기호 좌우에 공백 있으면 안된다)
-> 공백이 있을경우 “” (쌍따옴표)로 묶어줘야함

[root@dbserver shell]# vi ifconfig.sh
      1 #!/bin/bash
      2 echo `ifconfig | grep inet | grep -v 127.0.0.1`

ifconfig의 inet을 출력하되, 127.0.0.1는 빼고 출력
역따옴표 :특정 명령어를 실행한 결과를 출력

[root@dbserver shell]# vi echon.sh
      1 #!/bin/bash
      2 echo 'aaaaaa'
      3 echo "aaaaaa"
      4 echo -n "bbbbb"
      5 echo -n "ccccc"

-n은 줄을 바꾸지 않고 연속적으로 출력한다.

  • read 함수 사용 : 사용자로부터 값을 입력 받아서 변수에 저장해주는 역할
  • argument 사용해서 실행
    /etc/init.d/network stop을 수행할 때 stop부분을 인수(argument)라고한다

  • 크기비교
  1. [ $A -gt $B ] : A값이 B값보다 크다
  2. [ $A -lt $B ] : A값이 B값보다 작다
  3. [ $A -ge $B ] : A값이 B보다 크거나 같다
  4. [ $A -le $B ] : A값이 B보다 작거나 같다.
  5. [ $A -eq $B ] : A값이 B값과 같다
  6. [ $A -ne $B ] : A값이 B값과 다르다

공백을 하지 않으면 크기비교가 되지 않으니 조심할것 !

[root@server101 ~]# vi comp_test1.sh
      1 #!/bin/bash
      2 echo ""
      3 echo -n "Enter First Number : "
      4 read A
      5 echo ""
      6 echo -n "Enter Second Number : "
      7 read B
      8 echo ""
      9
     10 if [ $A -eq $B ]
     11 then
     12 echo "$A = $B"
     13 elif [ $A -gt $B ]
     14 then
     15   echo "$A > $B"
     16 elif [ $A -lt $B ]
     17 then
     18   echo "$A < $B"
     19 fi
     20 echo "" 
[root@server101 ~]# sh comp_test1.sh
Enter First Number : 3
Enter Second Number : 5
3 < 5

숫자 계산하기
Shell Script는 기본적으로 모든 데이터를 문자로 인식
expr로 연산을 함

[root@server101 ~]# vi cal_test1.sh
      1 #!/bin/bash
      2 echo ""
      3 echo -n "Enter First Number : "
      4 read A
      5 echo -n "Enter Second Number : "
      6 read B
      7 echo ""
      8 echo "$A + $B"
      9 echo ""

[root@server101 ~]# sh cal_test1.sh
Enter First Number : 2
Enter Second Number : 4                      -> 연산 안해줌
2 + 4
[root@server101 ~]# vi cal_test2.sh
\#!/bin/bash
echo ""
echo -n "Enter first Number : "
read A
echo ""
echo -n "Enter second Numver : "
read B
echo ""
hap=`expr $A + $B`
echo ""
echo "$A + $B = $hap"
echo ""

​[root@server101 ~]# sh cal_test2.sh
Enter first Number : 3
Enter second Numver : 5

3 + 5 = 8 -> 연산작업 한번 거침

세개의 숫자를 입력받아서 연산

[root@server101 ~]# vi cal_test3.sh
      1 #!/bin/bash
      2 echo ""
      3 echo -n "Enter First Number :"
      4 read A
      5 echo ""
      6 echo -n "Enter Second Number :"
      7 read B
      8 echo ""
      9 echo -n "Enter Third Number :"
     10 read C
     11 echo ""
     12
     13 result=`expr \( $A + $B \) \* $C`    -> ( , ), * 메타캐릭터라서 \역슬래시 꼭 붙여줘야
                                                                    연산자로 인식함 
                                                                    expr 구문 안에서의 모든연산자와 기호, 변수
                                                                   사이에는 공백으로 한칸 띄어야함! 
     14 echo ""
     15 echo "($A + $B ) X $C = $result"
     16 echo ""


[root@server101 ~]# sh cal_test3.sh
Enter First Number :3
Enter Second Number :4
Enter Third Number :2

(3 + 4 ) X 2 = 14

문자열 비교하기

[ “string1” = “string2” ]
두 문자열이 같은 경우
[ “string1” != “string2” ]
두 문자열이 다른경우
[ -z “string” ]
문자열의 길이가 0인경우
[ -n “string” ]
문자열의 길이가 0이 아닌 경우

[root@server101 ~]# vi comp_string1.sh
      1 #!/bin/bash
      2 echo""
      3 echo -n "Enter String:"
      4 read str
      5 echo ""
      6
      7 if [ $str = "Korea" ]   -> 공백 조심 !!! 
      8 then
      9   echo "Korea"
     10 else
     11   echo "Not Korea"
     12 fi
     13 echo"" 

[root@server101 ~]# sh comp_string1.sh
Enter String:k
Not Korea
​
[root@server101 ~]# sh comp_string1.sh
Enter String:Korea
Korea

파일관리하기

[ -f 파일명 ]
파일이 있는경우
[ -s 파일명 ]
파일이 존재하고 내용이 있는 경우
[ -d 파일명 ]
파일이 아니고 디렉토리인경우
[ -r 파일명 ]
읽기가 가능한 파일일 경우
[ -w 파일명 ]
쓰기가 가능한 파일인 경우
[ -x 파일명 ]
파일이 존재하고 실행 가능할 경우
[ !-옵션 파일명]
옵션의 조건이 아닐 경우

test.log 파일을 먼저 생성한 후 …

[root@server101 ~]# sh file_test1.sh
aaa
[root@server101 ~]# vi file_test1.sh
      1 #!/bin/bash
      2 echo ""
      3 fname=/shell/test.log
      4
      5 if [ -f $fname ]
      6 then
      7   cat $fname
      8 fi
      9 echo ""
[root@server101 ~]# vi file_test2.sh
      1 #!/bin/bash
      2 echo ""
      3 fname=/shell/test.log
      4
      5 if [ -s $fname ]
      6 then
      7   echo -n "Before: "
      8   echo `ls -l /shell/test.log`
      9   cat /dev/null > $fname   -> 파일 크기를 0으로 만들기 
     10 fi
     11 echo ""
     12 echo -n "After: "
     13 echo `ls -l /shell/test.log` 
[root@server101 ~]# sh file_test2.sh
Before: -rw-r--r-- 1 root root 4 313 11:16 /shell/test.log
After: -rw-r--r-- 1 root root 0 313 12:10 /shell/test.log

  • 분기문 : 조건문 = if , case

  • 반복문 : while .for

if 문

if[조건] -> 조건 한개일 때
then
처리할 문장
fi

[root@server101 ~]# vi if_test1.sh
      1 #!/bin/bash
      2 echo ""
      3 echo -n "Enter fruit name: "
      4 read a
      5 echo ""
      6 if [ $a = "apple" ]
      7 then
      8    echo "apple goot!"
      9 fi
     10 echo "" 
[root@server101 ~]# sh if_test1.sh
Enter fruit name: apple
apple goot!
[root@server101 ~]# sh if_test1.sh
Enter fruit name: orange

if[조건] -> 조건 두개일 때
then
처리할 문장
else
처리할 문장
fi

[root@server101 ~]# vi if_test2.sh
      1 #!/bin/bash
      2 echo ""
      3 echo -n "Enter string : "
      4 read a
      5 echo ""
      6
      7 if [ $a = "apple" ]
      8 then
      9   echo "apple goot!"
     10 else
     11   echo "give me apple!"
     12 fi
     13 echo ""
[root@server101 ~]# sh if_test2.sh
Enter string : apple
apple goot!
[root@server101 ~]# sh if_test2.sh
Enter string : banana
give me apple!

if[조건]; then -> 조건 세개 이상일 때
처리할 문장
elif[조건];then
처리할 문장
else
처리할문장
fi

[root@server101 ~]# vi if_test3.sh
      1 #!/bin/bash
      2 echo ""
      3 echo -n "Enter string : "
      4 read str
      5 echo ""
      6
      7 if [ $str = "apple" ] ; then
      8    echo "I like apple~!"
      9 elif [ $str = "Orange" ] ; then
     10    echo "I like orange"
     11 else
     12    echo "give me apple or Orange!!!!!"
     13 fi
     14
     15 echo ""
[root@server101 ~]# sh if_test3.sh
Enter string : apple
I like apple~!
[root@server101 ~]# sh if_test3.sh
Enter string : orange                       -> 대소문자 구분하므로 조심!!!!
give me apple or Orange!!!!!
[root@server101 ~]# sh if_test3.sh
Enter string : Orange
I like orange

중첩 if문 (if 문장안에 다른 if사용)

if[조건];then
실행문장
exit
elif[조건]; then
실행문장
exit
else
if[조건]; then
실행문장
fi
fi

[root@server101 ~]# vi if_test4.sh
      1 #!/bin/bash
      2 echo ""
      3 echo -n "Enter Number 1 or 2 :"
      4 read a
      5
      6 if [ $a -eq 1 ]; then
      7   echo "입력 받은 값은 $a입니다."
      8   exit
      9 elif [ $a -eq 2 ]; then
     10   echo "입력 받은 값은 $a입니다."
     11   exit
     12 else
     13   if [ $a -lt 0 ]; then
     14     echo "값이 너무 작음.."
     15     exit
     16   elif [ $a -gt 2 ]; then
     17     echo " 너무 크자너.."
     18     exit
     19   fi
     20 fi 
[root@server101 ~]# sh if_test4.sh
Enter Number 1 or 2 :1
입력 받은 값은 1입니다.
[root@server101 ~]# sh if_test4.sh
Enter Number 1 or 2 :2
입력 받은 값은 2입니다.
[root@server101 ~]# sh if_test4.sh
Enter Number 1 or 2 :3
 너무 크자너..
[root@server101 ~]# sh if_test4.sh
Enter Number 1 or 2 :-1

값이 너무 작음..

조건을 동시에 사용하기
-> if [] -a [] (and)
-> if [] -o [] (or)

[root@server101 ~]# vi if_test5.sh
      1
      2 #!/bin/bash
      3 echo ""
      4 echo -n "Enter Number 1 or 2 :"
      5 read a
      6 echo ""
      7
      8 if [ \( $a -lt 1 \) -o \( $a -gt 2 \) ]; then
      9   echo " 유효하지 않은 값임.."
     10   exit
     11 else
     12   if [ \( $a -eq 1 \) -o \( $a  -eq 2 \) ]; then
     13     echo "입력 받은 값음 $a"
     14     exit
     15   fi
     16 fi 
[root@server101 ~]# sh if_test5.sh
Enter Number 1 or 2 :1
입력 받은 값음 1
[root@server101 ~]# sh if_test5.sh
Enter Number 1 or 2 :3

유효하지 않은 값임..

연습문제 1.

학생의 시험 성적을 입력 받아서 학점을 계산하는 스크립트를 작성하세요. 학점은 점수가 96-100:A+, 90-95:A0 , 86-89:B+, 80-85:B0, 76-79:C+, 70-75:C0, 66-69:D, 나머지는 F로 계산 . 그리고 100점이 넘는 점수는 So Big 메시지를 출력, 1점보다 적은 값이 들어오면 So small 이라는 메시지를 출력하고 스크립트를 종료하게 작성하시오

[root@server101 ~]# vi exam1.sh
      9   if [ $A -gt 100 ]; then
     10     echo "so Big!~!!!!!!"
     11     exit
     12   else
     13     echo " So Small!!!!"
     14   fi
     15 else
     16   if [ \( $A -gt 95 \) -a \( $A -lt 101 \) ]; then
     17     echo " A+"
     18   elif [ \( $A -gt 89 \) -a \( $A -lt 96 \) ]; then
     19     echo "A0"
     20   elif [ \( $A -gt 85 \) -a \( $A -lt 90 \) ]; then
     21     echo "B+"
     22   elif [ \( $A -gt 79 \) -a \( $A -lt 86 \) ]; then
     23     echo "B0"
     24   elif [ \( $A -gt 75 \) -a \( $A -lt 80 \) ]; then
     25     echo "C+"
     26   elif [ \( $A -gt 69 \) -a \( $A -lt 76 \) ]; then
     27     echo "C0"
     28   elif [ \( $A -gt 65 \) -a \( $A -lt 70 \) ]; then
     29     echo "D"
     30   else
     31     echo "F"
     32  fi
     33 fi

[root@server101 ~]# sh exam1.sh
학생의 성적을 입력하세요 :78
C+
[root@server101 ~]# sh exam1.sh
학생의 성적을 입력하세요 :90
A0
[root@server101 ~]# sh exam1.sh
학생의 성적을 입력하세요 :100
 A+
[root@server101 ~]# sh exam1.sh
학생의 성적을 입력하세요 :8
F
[root@server101 ~]# sh exam1.sh
학생의 성적을 입력하세요 :30
F
[root@server101 ~]# sh exam1.sh
학생의 성적을 입력하세요 :66
D

연습문제 2. 학생으로부터 지역번호를 입력 받아서 지역명을 출력하는 스크립트를 작성하시오, 지역번호가 02:Seoul. 031:Kyoungki, 051: Busan, 052 : Ulsan .나머지는 Heaven으로 출력합니다. 단 지역번호가 0보다 작거나 100보다 크면 “Check Your number!!!” 메시지 출력수 스크립트를 종료하게 작성하시오

​[root@server101 ~]# vi exam2.sh
#!/bin/bash
echo ""
echo -n "지역번호를 입력하세요 : "
read A
if [ \( $A -lt 0 \) -o \( $A -gt 100 \) ]; then
  echo " Check your Number !!!!"
  exit
else
 if [ $A = "02" ]; then
   echo "서울"
 elif [ $A = "031" ]; then
   echo "경기"
 elif [ $A = "051" ]; then
   echo "부산"
 elif [ $A = "052" ]; then
   echo "울산"
 else
   echo "Heaven"
 fi
fi
​
​지역번호를 입력하세요 : 02
서울
[root@server101 ~]# sh exam2.sh
지역번호를 입력하세요 : 031
경기
[root@server101 ~]# sh exam2.sh
지역번호를 입력하세요 : 051
부산
[root@server101 ~]# sh exam2.sh
지역번호를 입력하세요 : 032
Heaven

case : 경우의 수가 여러개 일 경우에 유용

case 변수 in
패턴 1)
실행명령 ;;
패턴 2)
실행명령 ;;
*) -> 1.도 아니고 2 도 아닐경우
실행명령 ;;
esac

[root@server101 ~]# vi case_test1.sh
#!/bin/bash
echo ""
echo "
          [1] Web Server backup
          [2] WAS Server backup
          [3] DB  Server backup "
echo ""
echo -n "Enter your choice :"
read a
echo ""
case $a in
  1)
    sh /shell/web_backup.sh ;;
  2)
    sh /shell/was_backup.sh ;;
  3)
    sh /shell/db_backup.sh ;;
  *)
    echo "Enter [ 1, 2, 3 ]"
esac 


[root@server101 ~]# sh case_test1.sh

          [1] Web Server backup
          [2] WAS Server backup
          [3] DB  Server backup
Enter your choice :1
Web Server Backup Start!!
[root@server101 ~]# sh case_test1.sh

          [1] Web Server backup
          [2] WAS Server backup
          [3] DB  Server backup
Enter your choice :2
WAS Server Backup Start~~~!
[root@server101 ~]# sh case_test1.sh

          [1] Web Server backup
          [2] WAS Server backup
          [3] DB  Server backup
Enter your choice :3
DB Server Backup Start~~!!
[root@server101 ~]# sh case_test1.sh
          [1] Web Server backup
          [2] WAS Server backup
          [3] DB  Server backup
Enter your choice :5
Enter [ 1, 2, 3 ]

for 변수명 in 값1 값2 값3
do
실행할 문장
done

  • 화면에 1-5까지 출력
    [root@server101 shell]# vi for_test1.sh
        1 #!/bin/bash
        2 for i in 1 2 3 4 5
        3 do
        4   echo "$i"
        5 done
        6 echo ""
    [root@server101 shell]# sh for_test1.sh
    1
    2
    3
    4
    5
    
  • 반복횟수 부분의 변형
[root@server101 shell]# vi for_test2.sh
    \#!/bin/bash
    count=`ls /shell`    -> 변수 뒤에 =와 꼭 붙일것! 안붙이면 실행 안됨 !
    for i in $count
    do
     echo "$i"
    done
    echo ""

[root@server101 shell]# sh for_test2.sh
    db_backup.sh
    echo_test1.sh
    echo_test2.sh
    echo_test3.sh
    echo_test4.sh
    echo_test5.sh
    echo_test6.sh
    test.log
    test1.sh
    was_backup.sh
    web_backup.sh
``
* 반복 횟수 부분의 변형 2
 ```cpp
[root@server101 shell]# vi for_test3.sh
      1 #!/bin/bash
      2 echo ""
      3 count=`ls /shell`
      4
      5 for i in $count
      6 do
      7   echo "Easy Shell Script"
      8 done


[root@server101 shell]# sh for_test3.sh   -> 파일 수만큼 복사해서 출력
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
Easy Shell Script
  • 중첩 for문
    [root@server101 shell]# vi for_test4.sh
      #!/bin/bash
      echo""
      for i in a b c
    do
        for j in 1 2 3
    do
      echo "\$i=$i , \$j=$j"     -> $을 문자 그대로 출력하기 위해 \역슬래시 사용!
    done
    done 
    [root@server101 shell]# sh for_test4.sh
    $i=a , $j=1
    $i=a , $j=2
    $i=a , $j=3
    $i=b , $j=1
    $i=b , $j=2
    $i=b , $j=3
    $i=c , $j=1
    $i=c , $j=2
    $i=c , $j=3
    

*2단 출력하기

[root@server101 shell]# vi for_test5.sh
    \#!/bin/bash
    echo ""
    for i in 2
    do
      for j in 1 2 3 4 5 6 7 8 9
      do
       gob=`expr $i \* $j`           -> =사이에 띄어쓰는 곳 없도록 조심 !
       echo " $i X $j = $gob"
      done
    done 

[root@server101 shell]# sh for_test5.sh
     2 X 1 = 2
     2 X 2 = 4
     2 X 3 = 6
     2 X 4 = 8
     2 X 5 = 10
     2 X 6 = 12
     2 X 7 = 14
     2 X 8 = 16

주의 사항 !

  1. expr 구분에 반드시 역따옴표를 쓰기
  2. *연산자와 괄호 뒤에는 \역슬래시를 꼭 붙이기
  3. expr 구분 안에서의 모든 연산자와 기호, 변수 사이에는 공백으로 한 칸씩 띄우기

while [조건문 ] - 조건을 만족할 경우 반복 수행
do
반복할 문장
done

while 문과 for문의 차이

  • for : 반복 횟수가 결정되어 잇음
  • while : 사용자가 중지 할 때까지 수행
* 예1)
[root@server101 shell]# vi while_test1.sh
    \#!/bin/bash
    num=1
while [ \( $num -eq 1 \) -o \( $num -eq 2 \) ]
do
   echo -n "Enter Number :"
   read num
   echo "God Bless you~!!"
   echo ""
done
   echo "Incorrect Number"
   echo "Good bye~"


[root@server101 shell]# sh while_test1.sh
Enter Number :1
God Bless you~!!
Enter Number :2
God Bless you~!!
Enter Number :3
God Bless you~!!
Incorrect Number
Good bye~

예2) 사용자가 y나 Y를 입력할 때까지 계속 “Enter y| Y”출력하게 하고 맞게 입력하면 Good출력하고 종료…

[root@server101 shell]# vi while_test2.sh
    #!/bin/bash
    A=a
    while [ \( $A != "Y" \) -a \( $A != "y" \) ]
    do
    echo -n "Enter Y | y : "
    read A
    done
    echo "Good!" 
[root@server101 shell]# sh while_test2.sh
    Enter Y | y : a
    Enter Y | y : b
    Enter Y | y : y

Good!
예3) while을 이용하여 사용자에게 단수를 입력 받은 후 해당 구구단을 출력하는 스크립트

[root@server101 shell]# vi while_test3.sh
    #!/bin/bash
    echo -n " 단수를 입력하세요 : "
    read a
    i=1
    while [ $i -lt 10 ]
do
      gob=`expr $a \* $i `
      echo " $a X $i = $gob "
      i=`expr $i + 1`
done 
[root@server101 shell]# sh while_test3.sh
 단수를 입력하세요 : 3
 3 X 1 = 3
 3 X 2 = 6
 3 X 3 = 9
 3 X 4 = 12
 3 X 5 = 15
 3 X 6 = 18
 3 X 7 = 21
 3 X 8 = 24
 3 X 9 = 27

연습문제 )
사용자에게 원하는 단 수를 입력 받아 해당 단 수의 구구단을 출력 한 후 “Retry? y|Y : “ 메시지를 보인 후 y를 누르면 다시 원하는 단수를 입력받아 출력하게 하고 만약 다른문자를 누르면 종료하는 스크립트

[root@server101 shell]# vi while_exam1.sh
    #!/bin/bash

    t=y
    i=1
while [ \( $t = "y" \) -o \( $t = "Y" \) ]
do
      echo -n " 단수를 입력하세요 : "
      read a

   while [ $i -lt 10 ]
   do
    gob=`expr $a \* $i `
    echo " $a X $i = $gob "
    i=`expr $i + 1`
   done
  echo -n " Retry? Y |y :"
   read t
   i=1
done

[root@server101 shell]# sh while_exam1.sh
 단수를 입력하세요 : 3
 3 X 1 = 3
 3 X 2 = 6
 3 X 3 = 9
 3 X 4 = 12
 3 X 5 = 15
 3 X 6 = 18
 3 X 7 = 21
 3 X 8 = 24
 3 X 9 = 27
 Retry? Y |y :y
 단수를 입력하세요 : 5
 5 X 1 = 5
 5 X 2 = 10
 5 X 3 = 15
 5 X 4 = 20
 5 X 5 = 25
 5 X 6 = 30
 5 X 7 = 35
 5 X 8 = 40
 5 X 9 = 45
 Retry? Y |y :Y
 단수를 입력하세요 : 4
 4 X 1 = 4
 4 X 2 = 8
 4 X 3 = 12
 4 X 4 = 16
 4 X 5 = 20
 4 X 6 = 24
 4 X 7 = 28
 4 X 8 = 32
 4 X 9 = 36
 Retry? Y |y :f

util [ 조건문 ]
do
실행할 문장
done
-> 조건문이 거짓이면 반복문을 수행하고 조건문이 참이면 반복문을 끝낸다.

[root@server101 shell]# vi until_test1.sh
    #!/bin/bash
    echo -n " Enter Number : "
    read dan
    echo ""
    num=1
    until [ $num -eq 10 ]
do
        gob=`expr $dan \* $num `
         echo " $dan X $num = $gob "
         num=`expr $num + 1 `
done 
[root@server101 shell]# sh until_test1.sh
 Enter Number : 4
 4 X 1 = 4
 4 X 2 = 8
 4 X 3 = 12
 4 X 4 = 16
 4 X 5 = 20
 4 X 6 = 24
 4 X 7 = 28
 4 X 8 = 32
 4 X 9 = 36

연습문제 1
for문으로 구구단 만들기

[root@server101 shell]# vi for1.sh
      1 #!/bin/bash
      2
      3 for dan in 2 3 4 5 6 7 8 9
      4 do
      5   echo " $dan 단 "
      6   for i in 1 2 3 4 5 6 7 8 9
      7   do
      8      gob=`expr $dan \* $i`
      9      echo " $dan X $i = $gob "
     10   done
     11 done 
[root@server101 shell]# sh for1.sh
 22 X 1 = 2
 2 X 2 = 4
 2 X 3 = 6
 2 X 4 = 8
 2 X 5 = 10
 2 X 6 = 12
 2 X 7 = 14
 2 X 8 = 16
 2 X 9 = 18
 33 X 1 = 3
 3 X 2 = 6
 3 X 3 = 9
 3 X 4 = 12
 3 X 5 = 15
 3 X 6 = 18
 3 X 7 = 21
 3 X 8 = 24
 3 X 9 = 27
 44 X 1 = 4
 4 X 2 = 8
 4 X 3 = 12
 4 X 4 = 16
 4 X 5 = 20
 4 X 6 = 24
 4 X 7 = 28
 4 X 8 = 32
 4 X 9 = 36
 55 X 1 = 5
 5 X 2 = 10
 5 X 3 = 15
 5 X 4 = 20
 5 X 5 = 25
 5 X 6 = 30
 5 X 7 = 35
 5 X 8 = 40
 5 X 9 = 45
 66 X 1 = 6
 6 X 2 = 12
 6 X 3 = 18
 6 X 4 = 24
 6 X 5 = 30
 6 X 6 = 36
 6 X 7 = 42
 6 X 8 = 48
 6 X 9 = 54
 77 X 1 = 7
 7 X 2 = 14
 7 X 3 = 21
 7 X 4 = 28
 7 X 5 = 35
 7 X 6 = 42
 7 X 7 = 49
 7 X 8 = 56
 7 X 9 = 63
 88 X 1 = 8
 8 X 2 = 16
 8 X 3 = 24
 8 X 4 = 32
 8 X 5 = 40
 8 X 6 = 48
 8 X 7 = 56
 8 X 8 = 64
 8 X 9 = 72
 99 X 1 = 9
 9 X 2 = 18
 9 X 3 = 27
 9 X 4 = 36
 9 X 5 = 45
 9 X 6 = 54
 9 X 7 = 63
 9 X 8 = 72
 9 X 9 = 81

while문으로 구구단 만들기

[root@server101 shell]# vi while1.sh
    #!/bin/bash
    dan=2
    i=1
while [ \( $dan -ge 2 \) -a \( $dan -le 9 \) ]
do
     echo " $dan 단"
      i=1
      while [ $i -lt 10 ]
  do
            gob=`expr $dan \* $i `
        echo "$dan X $i = $gob"
            i=` expr $i + 1 `
  done
 dan=`expr $dan + 1`
done

구구단 옆으로 만들기

[root@server101 shell]# vi gugu.sh
     #!/bin/bash
     for num in 1 2 3 4 5 6 7 8 9
do
       for dan in 2 3 4 5
  do
     gob=`expr $dan \* $num `
    echo -n "   $dan X $num = $gob "
  done
  echo ""
done
echo ""
for num in 1 2 3 4 5 6 7 8 9
do
  for dan in 6 7 8 9
  do
     gob=` expr $dan \* $num `
     echo -n "   $dan X $num = $gob "
  done
  echo ""
done


[root@server101 shell]# sh gugu.sh
   2 X 1 = 2    3 X 1 = 3    4 X 1 = 4    5 X 1 = 5
   2 X 2 = 4    3 X 2 = 6    4 X 2 = 8    5 X 2 = 10
   2 X 3 = 6    3 X 3 = 9    4 X 3 = 12    5 X 3 = 15
   2 X 4 = 8    3 X 4 = 12    4 X 4 = 16    5 X 4 = 20
   2 X 5 = 10    3 X 5 = 15    4 X 5 = 20    5 X 5 = 25
   2 X 6 = 12    3 X 6 = 18    4 X 6 = 24    5 X 6 = 30
   2 X 7 = 14    3 X 7 = 21    4 X 7 = 28    5 X 7 = 35
   2 X 8 = 16    3 X 8 = 24    4 X 8 = 32    5 X 8 = 40
   2 X 9 = 18    3 X 9 = 27    4 X 9 = 36    5 X 9 = 45
   6 X 1 = 6    7 X 1 = 7    8 X 1 = 8    9 X 1 = 9
   6 X 2 = 12    7 X 2 = 14    8 X 2 = 16    9 X 2 = 18
   6 X 3 = 18    7 X 3 = 21    8 X 3 = 24    9 X 3 = 27
   6 X 4 = 24    7 X 4 = 28    8 X 4 = 32    9 X 4 = 36
   6 X 5 = 30    7 X 5 = 35    8 X 5 = 40    9 X 5 = 45
   6 X 6 = 36    7 X 6 = 42    8 X 6 = 48    9 X 6 = 54
   6 X 7 = 42    7 X 7 = 49    8 X 7 = 56    9 X 7 = 63
   6 X 8 = 48    7 X 8 = 56    8 X 8 = 64    9 X 8 = 72
   6 X 9 = 54    7 X 9 = 63    8 X 9 = 72    9 X 9 = 81
[root@server101 shell]# vi whilegugu.sh
#!/bin/bash
num=1
while [ $num -lt 10 ]
do
  dan=2
  while [ $dan -lt 6 ]
  do
  gob=`expr $dan \* $num `
  echo -n "  $dan X $num = $gob "
  dan=`expr $dan + 1 `
  done
echo ""
num=`expr $num + 1 `
done
echo""
num=1
while [ $num -lt 10 ]
do
  dan=6
  while [ $dan -lt 10 ]
  do
  gob=`expr $dan \* $num `
  echo -n "  $dan X $num = $gob "
  dan=`expr $dan + 1 `
  done
echo ""
num=`expr $num + 1 `
done

별 스크립트
문제1 답

     #!/bin/bash
    echo ""
    echo -n "Enter number: "
    read num
    echo ""

    i=1
while [ $i -le $num ]
do
   j=1
   while [ $j -le $i ]
   do
     echo -n "*"
     j=`expr $j + 1 `
   done

   i=`expr $i + 1 `
   echo ""
done
echo ""

별 스크립트
문제2 답

    #!/bin/bash
    echo ""
    echo -n "Enter number: "
    read num
    echo ""

    i=1
while [ $i -le $num ]
do
   j=1
   k=`expr $num - $i`
   while [ $j -le $num ]
   do
     if [ $j -le $k ]
     then
       echo -n " "
     else 
       echo -n "*"
     fi

     j=`expr $j + 1 `
   done

   i=`expr $i + 1 `
   echo ""
done
echo ""

별 스크립트
문제3 답

    #!/bin/bash
    echo ""
    echo -n "Enter number: "
    read num
    echo ""

  i=1
  while [ $i -le $num ]
  do
   j=1
   k=`expr $num - $i`
   l=`expr $num + $i - 1`
   while  [ $j -le $l ]
   do
     if [ $j -le $k ]
     then
       echo -n " "
     else
       echo -n "*"
     fi
     j=`expr $j + 1`
   done

   i=`expr $i + 1`
   echo ""
done
echo ""

별 스크립트
문제4 답

    #!/bin/bash
    echo ""
    echo -n "Enter number: "
    read num
    echo ""

    i=1
while [ $i -le $num ]
do
  j=1
  k=`expr $num - $i + 1`
  while [ $j -le $k ]
  do 
     echo -n "*"
     j=`expr $j + 1`
  done

  i=`expr $i + 1`
  echo ""
done
echo ""

별 스크립트
문제5 답

    #!/bin/bash
    echo ""
    echo -n "Enter number: "
    read num
    echo ""

i=1
while [ $i -le $num ]
do
  j=1
  k=`expr $num \* 2 - $i`
  while [ $j -le $k ]
  do 
     if [ $j -lt $i ]
     then
       echo -n " "
     else
       echo -n "*"
     fi

     j=`expr $j + 1`
  done

  i=`expr $i + 1`
  echo ""
done
echo ""

별 스크립트
문제6 답

#!/bin/bash
echo ""
echo -n "Enter number: "
read num
echo ""

i=1
while [ $i -le $num ]
do
   j=1
   k=`expr $num - $i`
   l=`expr $num - 1 + $i`
   while [ $j -le $l ]
   do
      if [ $j -le $k ]
      then
        echo -n " "
      else
        echo -n "*"
      fi
      j=`expr $j + 1`
    done

    i=`expr $i + 1`
    echo ""
done

i=1
while [ $i -le $num ]
do
   j=1
   k=`expr $num \* 2 - $i - 1`
   while [ $j -le $k ]
   do
     if [ $j -le $i ]
     then
        echo -n " "
     else
        echo -n "*"
     fi
     j=`expr $j + 1`
   done

   i=`expr $i + 1`
   echo ""
done
echo ""