[JSP, JSTL] fn function 정리

jstl function (jstl fn) 정리

jsp 파일 최 생단에 다음과 같이 jstl functions를 사용하겠다고 선언 해야 함.

  <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

함수들은 단독으로 사용할 수 없고 EL 표현식과 함께 사용해야 함.

  ${fn:length(list)}
  ${fn:contains(str, str)}

fn:contains(string, substr)

string이 substr을 포함하면 return true

fn:containsIgnoreCase(string, substr)

대소문자 관계없이 string이 substr을 포함하면 return true

fn:startsWith(string, prefix)

string이 prefix로 시작하면 return True

fn:endsWith(string, suffix)

string이 suffix로 끝나면 return True

fn:escapeXml(string)

string에 XML과 HTML에서 < >& ' " 문자들이 있으면, XML엔티티 코드로 바꿔준뒤 문자열 반환

fn:indexOf(string, substr)

string에서 substr이 처음으로 나타나는 인덱스 반환

fn:split(string, separator)

string내의 문자열 separetor에 따라 나눈 배열로 반환

fn:join(array, separator)

array요소들을 separator를 구분자로 하여 연결해서 반환

fn:length(item)

item이 배열이나 컬렉션이면 요소의 개수를 문자열이면 문자의 개수를 반환

fn:replace(string, before, after)

string내에 있는 before 문자열을 after 문자열로 모두 변경해서 반환

fn:substring(string, begin, end)

string에서 begin인덱스에서 시작해서 end인덱스에 끝나는 부분의 문자열 반환

fn:substringAfter(string, substr)

string에서 substr이 나타나는 이후의 문자열 반환

fn:substringBefore(string, substr)

string에서 substr이 나타나는 이전의 문자열 반환

fn:toLowerCase(string)

string을 모두 소문자로 변경 후 리턴

fn:toUpperCase(string)

string을 모두 대문자로 변경 후 리턴

fn:trim(string)

string앞뒤의 공백을 모두 제거한 후 반환

728x90
반응형

[JSP, JSTL] forEach 잘 사용하기

Spring 개발을 하다 보면 jstl 의 forEach 를 많이 사용하게 된다.

간단하지만 varStatus 속성 사용을 잘 하면 보다 편하게 개발할 수 있는것 같아서 남겨본다.


<c:forEach items="${list}" var="item" varStatu="i">
  current (현재 객체)       : ${i.current}<br/>
  index (0부터의 순서)      : ${i.index}<br/>
  count (1부터의 순서)      : ${i.count}<br/>
  first (루프의 처음인가)   : ${i.first}<br/>
  last (루프의 마지막인가)  : ${i.last}<br/>
  begin (루프의 시작값)     : ${i.begin}<br/>
  end (끝값)                : ${i.end}<br/>
  step (증가값)             : ${i.step}<br/>
</c:forEach\>
728x90
반응형

서버 재시작 없이 java 파일 수정 적용하기

Eclipse에서 Spring 개발을 하고 프로젝트 규모가 커지게 되면,
java 파일 한줄 수정 하고 짧게는 10초 길게는 40초, 1분이상 기다려야 하는 슬픈 시간 낭비를 하게 된다.

java 코드를 수정하면 tomcat에 바로 올려주는 spring-loaded 를 알기 전까지는 그랬다.

Springloaded를 활용한 빠른 톰캣 재시작

springloaded는 개발 환경에서 .java 파일을 수정했을 때,
변경되는 클래스 파일만 재로딩 하는 도구이다.
local PC 에서 코드 수정과 Tomcat 재시작 하는 시간을 줄여, 개발 생산성에 큰 도움이 된다.

다만 다음과 같은 경우에는 tomcat 재시작이 불가피 하다.

  • 상속 구조의 변경
  • Reflection 정보가 Cache 된 것.
  • XML 설정 파일 수정.
  1. 다음 링크에서 springloaded.jar 파일을 적절한 경로에 다운 받는다.
    • maven repository
      • 나의 경우에는 workspace에 바로 넣어 줬다. ( C:\Users\jeaha\dev\workspace )
  2. Servers -> 해당 tomcat 서버 선택
    • Overview
      • Open launch configuration
        • Arguments VM arguments 탭에 다음과 같이 인자로 경로와 jar를 잡아준다.
          • -javaagent:{{경로}}\springloaded-{{버젼}}.jar -noverify
      • Server Options의 옵션들 체크 해제
      • Publishing의 Automatically publish when resources change 선택
    • Modules 탭 > Edit > Auto reloading enabled 체크박스 해제

 

2번에서 아래 사진을 참고 후 3, 4를 진행한다.
인자를 위와 같이 준다
Auto reloading enabled 체크박스 해제

728x90
반응형

Linux 에서 Tomcat 재시작 하는 스크립트

테스트 서버에서 구성해 둔 Tomcat을 재기동할 때마다 일일히 shutdown 시키고, startup 하는게 귀찮아서 한방에 재시작할 수 있도록 restart.sh를 만들어 봤다.
기존의 startup.sh와 shutdown.sh가 있는 상태에서 작동한다.

#!/bin/bash
export LANG=ko_KR.UTF-8

## 이곳에 각자 경로를 넣어주면 됨
C_HOME=/usr/local/tomcat7
C_PATH=$C_HOME/bin
C_LOG=$C_HOME/logs

#echo $C_HOME
#echo $C_PATH
#echo $C_LOG

## FUNCTION WAIT FOR 5 SECS
function stanby() {
  # full bar, e.g. 20 chars
  BAR='####################'
  VAC='                    '

  for i in {1..20}; do
    # waited sec
    var=`echo "0.25*$i"|bc`
    # print $i chars of $BAR from 0 position && from $i to 20
    echo -ne "\r>> STANBY [${BAR:0:$i}${VAC:$i:20}] $var sec << "
    # wait 250ms between "frames"
    sleep .25
  done
  echo -ne "\n"
}

### CHECK IS SERVER ALIVE
function isAlive() {
  if [ -z "`ps -eaf | grep java | grep $C_PATH`" ]; then
    # END
    echo 0
  else
    # RUN
    echo 1
  fi
}


echo -e "\n\n\t\t !!>> RESTART.SH RUN `date +%Y-%m-%d' '%H:%M:%S` <<!!\n\n" >> $C_LOG/catalina.out

## RUN SHUTDOWN.SH
echo -e "\nShutdown tomcat now...\n"
bash $C_PATH/shutdown.sh

stanby

## CHECK THE PROCESS ENDED
if [ isAlive == 0 ]; then
  echo -e "\n\t>>> Tomcat was terminated successfully. <<<\n"
else
  ## IF IT HAS NOT ENDED KILL PROCESS
  ps -eaf | grep java | grep $C_PATH | awk '{print $2}' |
  while read PID
  do
    echo "Killing $PID... "
    kill -9 $PID
    echo -e "Tomcat($PID) is being killed\n"
  done

  stanby
fi

echo -e "\n\t>>> try to restart tomcat now <<<\n"

## RUN STARTUP.SH
bash $C_PATH/startup.sh

if [ isAlive == 0 ]; then
  echo -e "\n\t>>> ERROR!!! CAN NOT START TOMCAT!!  <<<"
else
  ## IF IS PROCESS RUN, CHECK USER WANNA TAIL LOG
  echo -e "\n\t>>> TOMCAT STARTUP COMMAND IS ON ACTION. <<<"
  echo -en "tail log?? (y|n) : "
  read yn

  ## TAIL LOG
  if [ $yn == "y" ] || [ $yn == "Y" ]; then
    # **CHECK DIR**
    tail -f $C_LOG/catalina.out
  fi
fi

프로세스 확인하는 함수를 따로 빼 두거나,
startup이나 shutdown의 경로를 따로 변수로 잡아주면 좋을것 같지만 일단 킵해두도록 함.

추가적으로 서버 기동 후 로그를 보는 명령어도 귀찮아서 shell 파일로 만들어 봤다.

    #!/bin/bash
    export LANG=ko_KR.UTF-8

    tail -f ../logs/catalina.out
728x90
반응형

급하게 기록하는 날짜 비교 코드.

다음에 다시 정리 하도록.

//  yyyyMMdd 형식의 8자리 문자열을 date로 변환.
function parseDate(seed) {
    seed = String( seed );
    var y = seed.substr(0, 4);
    var m = seed.substr(4, 2);
    var d = seed.substr(6, 2);
    return new Date(y,m-1,d);
}

//  yyyyMMdd 형식의 8자리 문자열이 14일 전인지 비교
function compareIsTwoWeeksAgo( cmprDate ) {
    var twoWeeksAgo = new Date();
    twoWeeksAgo.setDate(twoWeeksAgo.getDate() - 14 );
    return twoWeeksAgo > cmprDate;
}

window.onload = function(){
    $('.board_item').get().forEach( function(item, idx){
        // console.log( item )
        let ymd = $(item).data('ymd')
        if( ymd == undefined ) return true;
        ymd = parseDate( ymd );

        if( !compareIsTwoWeeksAgo(ymd) ) {
            $(item).addClass('new');
        }
    });
};
728x90
반응형

'Language > JavaScript' 카테고리의 다른 글

[JavaScript] url을 a 태그로 변환하기  (0) 2021.01.06
windows 10 NVM 과 nodejs 설치하기  (0) 2020.12.09
[Modern JS] 동기 처리를 위한 Async Await  (0) 2020.06.14
[Modern JS] Promise  (0) 2020.06.14
[Modern JS] spread 와 rest  (0) 2020.06.14

이클립스 이스케이프 문자열 복사

이클립스에서 문자열 복붙 할 때 \n \t 등 이스케이프 문자열을 복붙하면 \n \t 따위로 복붙 되는 귀찮은 일이 발생한다.
이럴때는 Window -> Preferences -> Java -> Editor -> Typing 에서
Escape text when pasting into a string literal 설정을 해제 해 주면 된다.

 

728x90
반응형

'IDE' 카테고리의 다른 글

[Eclipse] 최적화 설정하기  (0) 2020.01.26
[Eclipse] eclipse.ini 파일 설정  (0) 2020.01.26
[Eclipse] 인코딩 설정  (0) 2020.01.26
[Eclipse] Code Style Formatter, Text Editor 설정하기  (0) 2020.01.26
[Eclipse] 테마 변경 (Windows)  (0) 2020.01.26

쉘 스크립트 - 2

  • 학습 개요
    쉘 스크립트에서 선택과 반복을 위한 제어 구조를 사용해보자.
    선택 구조인 if / case, 반복 주조인 for / while / until 명령의 문법과 의미를 알아 보자.
    조건 검사가 필요할 때 사용되는 명령과 수식의 작성법을 알아 보자.

  • 학습 목표

    1. 선택 구조를 사용하여 쉘 스크립트를 작성하자.
    2. 반복 구조를 사용하여 쉘 스크립트를 작성하자.
    3. 수식을 포함하는 쉘 명령을 선택과 반복 구조에서 사용하자.

선택 구조

제어 구조

  • 쉘 스크립트에서 실행을 제어하기 위해 선택과 반복 구조를 사용함.
  • if, for, case, while, until

if

  • 프로그래밍 언어에서 if 문의 기능

if command ...; then
  command ...
[ elif command; then
  command ... ]...
[ else
  command ... ]
fi
  • ;은 같은 라인에서 다른 단어(then elif else fi)와 구분이 필요할 때 사용함.
  • if다음의 명령을 실행하여 참이면 then 다음의 명령을 실행함. (if 명령은 종료됨)
    • if나 elif 다음에 조건 검사를 위한 test 명령을 사용할 수 있음.
    • if나 elif 다음에 나오는 마지막 명령의 종료 상탯값으로 참과 거짓을 구분함.
    • 종료 상탯값 0은 성공적 종료를 의미하며 참으로 간주.
  • 거짓이면 elif 다음의 명령을 실행하여 참 / 거짓을 판단하고 실행함.
  • 만족 되는 것이 없으면 else 다음의 명령을 실행함.
  [ec2-user@ip-AWS ~]$ cd /usr/bin
  [ec2-user@ip-AWS bin]$ echo $?
  0
  [ec2-user@ip-AWS bin]$ cd /bin/usr
  -bash: cd: /bin/usr: No such file or directory
  [ec2-user@ip-AWS bin]$ echo $?
  1
  [ec2-user@ip-AWS bin]$ if true; then
  > echo "SUCCESS"
  > else
  > echo "FAILURE"
  > fi
  SUCCESS
  [ec2-user@ip-AWS bin]$ if true; false; then
  > echo "TRUE"
  > fi

test

  • 조건 검사를 위해 사용하는 명령
  • 조건이 만족되면 종료 상탯값으로 0(true), 1(false)를 리턴함
  • test expression || [ expression ]
    • expression은 파일의 상태 검사, 문자열의 비교, 정수 비교를 위한 수식
    • **대괄호와 expression 사이에 공백이 있어야 함.
[ec2-user@ip-AWS ~]$ cat intCompare.sh
#! /bin/bash
if [ $# !=2 ]; then
        echo "you must supply two numbers as arguments"
        exit 1
fi

if [ $1 -eq $2 ]; then
        echo "$1 equals to $2"
elif [ $1 -gt $2 ]; then
        echo "$1 is greater than $2."
else
        echo "$1 is less than $2."
fi

echo "$1 + $2는 $[$1+$2]임."

[ec2-user@ip-AWS ~]$ chmod u+x intCompare.sh

[ec2-user@ip-AWS ~]$ ./intCompare.sh 36 68
./intCompare.sh: line 2: [: 2: unary operator expected
36 is less than 68.
36 + 68는 104임.

case

  • 다중 선택을 지원하는 복합 명령
    • switch 문과 비슷
case word in
  [ pattern [ | pattern ]... ) command...;; ]...
esac
  • word 부분을 먼저 확장하고 pattern과 매칭되는지 검사함
  • 매칭이 이루어지면 상응하는 명령이 수행됨
  • 일단 매칭이 이루어지면 이후의 매칭 시도는 없음
  • pattern에서 *은 프로그래밍에서 'default 키워드'를 사용함.

case에서 패턴 사용 예

pattern ) desc (word가 다음과 같은 경우 패턴 매칭이 일어남)
a) a인 경우
[[:alpha:]]) 1개의 알파벳 문자인 경우
???) 임의의 세 글자인 경우
*.txt .txt로 끝나는 경우
[aeiou]) 모음에 해당하는 영문 소문자 1개인 경우
[ABE][0-9] 앞 글자가 A, B, E중 하나이고 다음 글자가 숫자인 두 글자인 경우
*) 임의 길이의 글자와 매칭됨. case 명령에서 마지막 패턴으로 사용하는 것이 좋음

case 실행의 예

[ec2-user@ip-AWS ~]$ cat caseTest.sh
#!/bin/bash

echo "
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit
"

read -p "Enter selection [a, b, c or q] > "

case $REPLY in
  a|A)
      echo "Hostname : $HOSTNAME"
      uptime
      ;;
  b|B)
      df -h
      ;;
  c|C)
      if [$( id -u) -eq 0 ]; then
        echo "All user's home disk space utillization"
        du -sh /home/*
      else
        echo "($USER)' home disk space utilization"
        du -sh $HOME
      fi
      ;;
  q|Q)
      echo "Program terminated."
      exit
      ;;
  *)
      echo "Invalid entry" > $2
      exit 1
      ;;
esac

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > a
Hostname : ip-AWS.ap-northeast-2.compute.internal
07:45:43 up 34 days, 0 min,  1 user,  load average: 0.00, 0.00, 0.00


[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > b
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        474M     0  474M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  408K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  1.9G  6.2G  24% /
tmpfs            99M     0   99M   0% /run/user/1000

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > c
./caseTest.sh: line 19: [1000: command not found
(ec2-user) home disk space utilization
92K     /home/ec2-user

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > d
./caseTest.sh: line 30: $2: ambiguous redirect

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > g
./caseTest.sh: line 30: $2: ambiguous redirect

[ec2-user@ip-AWS ~]$ ./caseTest.sh
plz select :
a. Display System Information
b. Show Information about File Systems
c. Summarlize Disk Usage Information
q. Quit

Enter selection [a, b, c or q] > q
Program terminated.

반복 구조

for

  • 모든 데이터를 한 차례씩 처리하는 제어구조
  •   for variable [ in word ... ]; do
        command ...
      done
  • word ... 부분 (값의 목록)을 먼저 확장함
  • word 목록에 존재하는 값을 순차적으로 변수 variable에 대입하고 do와 done 사이의 명령을 수행함.
  • word 부분이 없다면 in "$@"가 있는 것으로 가정함.
  [ec2-user@ip-AWS ~]$ echo {A..D}
  A B C D
  [ec2-user@ip-AWS ~]$ for i in {A..D}; do echo $i; done
  A
  B
  C
  D
  [ec2-user@ip-AWS ~]$ cat testFor.sh
  #! /bin/bash
  for FILE
  do
    echo $FILE
  done

  [ec2-user@ip-AWS ~]$ chmod u+x testFor.sh

  [ec2-user@ip-AWS ~]$ ./testFor.sh `ls`
  arg.sh
  caseTest.sh
  first.sh
  intCompare.sh
  list.bak
  testFor.sh
  whoson.sh
  • C나 Java에서 사용하는 형태

  •   for (( exp1; exp2; exp3 )); do
        command...
      done
  • exp1~3은 수식으로 각각 생략 가능

  • exp1은 제어 변수의 초기화를 위해 한 번 수행 됨

  • exp2가 참인 동안 명령과 exp3이 반복 수행 됨

  • [ec2-user@ip-AWS ~]$ cat testFor3.sh
      #! /bin/bash
      LIMIT=10
    
      for(( a=0; a<LIMIT; a++)); do
        echo "$a"
      done
      [ec2-user@ip-AWS ~]$ . testFor3.sh
      0
      1
      2
      3
      4
      5
      6
      7
      8
      9
      [ec2-user@ip-AWS ~]$

while

  • 조건이 참인 동안 명령을 반복함.
  •   while command...; do
        command
      done
  • while 다음에 나오는 명령을 실행하여 참 또는 거짓을 판단함
  • if 명령과 마찬가지로 종료 상탯값이 0이면 참으로 판단
  • 조건 비교를 위해 test expression 또는 [ expression ]을 자주 사용함.
  [ec2-user@ip-AWS ~]$ cat testWhile.sh
  #! /bin/bash
  N=1
  S=0

  while [ $N -le 10 ]; do
    echo -n "$N "
    S=$[ $S+$N ]
    N=$[ $N+1 ]
  done
  echo
  echo $S
  [ec2-user@ip-AWS ~]$ . testWhile.sh
  1 2 3 4 5 6 7 8 9 10
  55

for 와 while

  • for 명령 (2)를 다음과 같이 변환 가능
  •   (( exp1 ))
      while (( exp2 )); do
        command...
        (( exp3 ))
      done
  • (( expression ))은 수식 계산에 사용되는 복합 명령
  • let "expression"과 동일하며 test 명령 대신에 사용 가능
    • 조건 비교를 위해 test expression 또는 [ expression ]과 함께 자주 사용함.
  • while 다음의 (( expression ))에서 수식 결과가 0이 아닌 경우 종료 상탯값이 0이 되며 참으로 판단.
  [ec2-user@ip-AWS ~]$ cat testWhile2.sh
  #! /bin/bash
  LIMIT=10

  ((a=0))
  while (( a<LIMIT )); do
    echo "$a"
    (( a++ ))
  done
  [ec2-user@ip-AWS ~]$ . testWhile2.sh
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9

until

  • 조건이 만족될 때까지(거짓인 동안) 명령을 반복하여 수행함
  •   until command ... ; do
        command ...
      done
  • until 다음에 나오는 명령이 참이 될 때까지 반복함
    • 거짓인 동안 반복하게 됨
  • 조건을 표시하기 위해 test expression, [ expression ], (( expression ))을 사용할 수 있음.
  [ec2-user@ip-AWS ~]$ cat testUntil.sh
  #! /bin/bash
  N=1
  S=0
  until [ $N -gt 10 ]; do
    echo -n "$N "
    let S=$S+$N
    let N=$N+1
  done
  echo
  echo $S
  [ec2-user@ip-AWS ~]$ . testUntil.sh
  1 2 3 4 5 6 7 8 9 10
  55
728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linux] 원격 관리  (0) 2020.12.13
[Linnux] 네트워크 설정 및 점검  (0) 2020.12.05
[Linux] 소프트웨어 관리  (0) 2020.11.01
[Linux] 프로세스 관리  (0) 2020.11.01
[Linux] 파일 시스템 관리  (0) 2020.10.25

쉘 스크립트 - 1

  • 학습 개요
    쉘은 명령어 해석기 이며 스크립트 언어이다.
    일련의 쉘 명령이나 함수의 조합을 프로그램의 제어 구조를 사용하여 쉘 스크립트 파일로 작성해 두면 편리하게 사용할 때가 있다.
    쉘 스크립트의 기본 작성법을 알아보고 변수와 함수의 사용법과 예제를 보자.

  • 학습 목표

    1. 쉘 스크립트 파일의 실행 방법을 알 수 있다.
    2. 쉘 스크립트에서 변수를 사용할 수 있다.
    3. 쉘 스크립트에서 함수를 정의하고 호출하여 사용할 수 있다.

쉘 스크립트 개요

쉘 스크립트

  • 쉘 명령어의 집합으로 이루어진 실행 가능한 텍스트 파일.
    • 쉘이 파일의 내용을 읽어 처리함.
    • 선택 / 반복 등의 프로그래밍 구조를 사용할 수 있음.
    • 긴 작업, 반복적으로 일어나는 작업을 쉘 스크립트로 작성할 수 있음.
    • 쉘 스크립트를 새로운 명령어처럼 사용할 수 있음.
  • 예)
    • ~/.bash_profile, ~/.bachrc 등의 쉘 초기화 스크립트.
    • 디렉토리 /etc/rc.d/init.d/에 존재하는 시스템 초기화 스크립트.
  • 3차 USE_SHELL을 복습 할 것.

쉘 스크립트의 실행 방법

  • bash script_file
    • 스크립트 파일에 실행 권한을 추가할 필요가 없음.
    • 명령 행에서 script_file 다음에 인수를 추가할 수 있음.
    • 서브 쉘을 새로 생성하여 스크립트를 실행함.
  • ./script_file
    • 스크립트 파일에 실행 권한을 추가 해야 함.
    • PATH 환경 변수에 설정된 디렉토리에서 스크립트 파일을 찾음.
    • 스크립트 파일의 첫 행에서 #! 다음에 해석기(/bin/bash)를 지정함.
    • 서브 쉘을 새로 생성하여 스크립트를 실행함.
  • source script_file || / . script_file
    • source는 쉘 내장 명령이며 현재 쉘에서 스크립트 파일을 실행함.

쉘 스크립트 문법

  • #으로 시작하는 단어와 행은 주석으로 처리 됨.
  • $0은 스크립트 파일의 이름으로 확장됨.
    • source 명령으로 실행하는 경우 쉘의 이름(bash)으로 확장 됨.
  • $1은 첫 번째 인수, $2는 두 번째 인수로 확장 됨
  • 스크립트가 복잡하다면 적절한 echo 명령을 넣는 것이 좋음.
  • 변수=값을 사용하여 변수에 값을 지정하고 $변수를 사용하여 값을 추출할 수 있음
    • 등호(=)의 좌우에 공백이 있으면 안됨
  • bash -x script_file과 같이 실행하면 수행되는 명령을 확인할 수 있음.(디버깅 모드)

변수의 사용

쉘스크립트에서 변수의 사용

  • 선언 없이 변수를 사용할 수 있음
    • MYCOLOR=blue || echo $PATH
  • 변수의 값은 기본적으로 문자열로 취급
    • 연산이 필요하고, 변환이 가능한 경우에 정수로 다루어짐
  • 변수 이름의 작명
    • 대소문자 구분
    • 영문자, 숫자, 언더스코어로 구성
    • 첫 자는 숫자가 될 수 없음.

변수 사용의 예

ex desc
a=ls 변수 a에 문자열 'ls'를 대입
b="A string" 따옴표를 사용하여 공백을 가진 문자열을 대입
c="A string and $b" $b를 '변수 확장'한 후 문자열을 대입
d=$(ls wc -l)
e=$[5*7] $[...]는 '수식 확장'을 의미. 대괄호 안의 수식을 계산한 후 결과를 대입
f="\t\tA string\n" 이스케이프 문자 \를 사용
g=5 h="A String" 한 행에 2개의 변수를 사용하는 예
i=${b}1 변수 이름을 중괄호로 묶으면 뒤따라 나오는 문자를 분리할 수 있음. "A string1"이 대입됨. 실제 $b는 ${b}를 줄여 쓴 형태
$a 먼저 변수 확장이 일어나고, 쉘은 이것을 하나의 명령어로 해석하여 처리
$a=$e 변수 확장의 결과는 ls=35. 쉘은 이 자체를 하나의 명령어로 처리하므로 오류가 발생. eval "$a=$e"를 실행할 수 있음

명령 행 인수

  • 쉘이 스크립트를 처리할 때 사용되는 인수
    • 사용자가 스크립트 실행에 필요한 입력값을 주어야 함
  • $0은 스크팁트 파일의 이름으로 확장
  • 나머지를 위치 매개변수(positional parameteer)라 하며 $1, $2, $3 등은 이러한 인수를 의미함
  [ec2-user@ip-aws ~]$ cat > arg.sh
  echo "This script's name is $0"
  echo Argument 1 : $1
  echo Argument 2 : $2
  ^C
  [ec2-user@ip-aws ~]$ ls
  arg.sh  first.sh  list.bak
  [ec2-user@ip-aws ~]$ chmod u+x arg.sh
  [ec2-user@ip-aws ~]$ ./arg.sh first second
  This script's name is ./arg.sh
  Argument 1 : first
  Argument 2 : second
  [ec2-user@ip-aws ~]$ /home/ec2-user/arg.sh one two
  This script's name is /home/ec2-user/arg.sh
  Argument 1 : one
  Argument 2 : two

특별한 매개변수

  • 명령 행 인수와 관계가 있는 특별한 변수
  • 변수의 값을 참조만 할 수 있음
ex desc
$* "$*"는 $0을 제외한 모든 위치 매개변수를 포함하는 1 개의 큰 따옴표 like "$1 $2 $3 ..."
$@ 여러 개별 큰 따옴표 문리된 문자열로 확장 됨. "$1", "$2", "$3", ...
$$ 쉘의 프로세스 ID PID로 확장
$# 위치 매개변수의 개수로 확장
$? 최근에 실행된 포어그라운드 명령의 종료 상탯값으로 확장됨. 성공적 종료는 0.
$! 최근 실행된 백그라운드 명령의 프로세스 ID로 확장됨.

read

  • 키보드로 부터 한 라인을 읽은 후, 단어를 상응하는 변수에 저장함.
    • 대화식으로 스크립트를 실행시킬 수 있음.
  • read [options] [variable...]
    • 첫 번째 변수에 첫 번째 단어를, 두 번째 변수에 두 번째 단어를 저장.
    • 마지막 면수에 나머지 모두를 저장.
    • 남아있는 변수가 있으면 빈 문자열이 됨.
    • 변수의 이름을 사용하지 않으면 쉘 면수 REPLY에 저장됨.
    • 옵션 -p prompt는 입력을 위한 프롬프트를 지정함.

함수의 사용

함수

  • 함수는 쉘 스크립트에서 반복적으로 사용되는 명령의 묶음.
  • 쉘 스크립트 파일에 함수를 정의할 수 있음.
    • 정의되어 있는 함수를 호출하여 사용함.

함수의 호출 방법

  • 함수가 정의된 스크립트 파일에서 함수를 호출하여 사용할 수 있음.
  • 함수가 정의된 스크립트 파일을 실행하면 쉘 환경에 함수 정의가 추가됨.
    -> 같은 쉘에서 함수 이름을 쉘 명령어처럼 사용.
    • source 명령이나 도트(.) 명령으로 쉘 스크립트를 실행하면 함수 정의가 현재 쉘 환경에 추가됨.
      • set 명령으로 확인하고 unset name으로 삭제할 수 있음.
    • 이후 함수를 쉘 명령어처럼 사용할 수 있음.

함수 정의 방법

  function name {
    command ...
    return
  }

  name() {
    command ...
    return
  }
  • return [n] 문은 함수를 종료하는 문장으로 종료 상탯값을 리턴할 수 있음(n이 생량되면 직전 명령의 종료 상탯값을 리턴)
  • 함수 정의를 항상 사용하려면 .bashrc에 넣는것이 좋음
    • alias 설정도 마찬가지.

함수 실행 예

  [ec2-user@ip-aws ~]$ touch whoson.sh
  [ec2-user@ip-aws ~]$ vi whoson.sh
  [ec2-user@ip-aws ~]$ cat whoson.sh
  #!/bin/bash

  whoson () {
    date
    user=$USER
    echo "$user currently logged on"
  }

  echo "STEP 1"
  whoson
  echo "STEP 3"

  [ec2-user@ip-aws ~]$ . whoson.sh
  STEP 1
  Thu Nov  5 12:50:41 UTC 2020
  ec2-user currently logged on
  STEP 3

  [ec2-user@ip-aws ~]$

  [ec2-user@ip-aws ~]$ . whoson.sh
  STEP 1
  Thu Nov  5 12:50:59 UTC 2020
  ec2-user currently logged on
  STEP 3

  [ec2-user@ip-aws ~]$ whoson
  Thu Nov  5 12:51:19 UTC 2020
  ec2-user currently logged on

  [ec2-user@ip-aws ~]$ echo $user
  ec2-user
[ec2-user@ip-aws ~]$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
  . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

[ec2-user@ip-aws ~]$ vi ~/.bashrc

[ec2-user@ip-aws ~]$ cat .bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
  . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
arg1 () {
  echo "$1"
}

ds() {
  echo "DISK DPACE UTILIZATION FOR $USER"
  du -sh ~
}

[ec2-user@ip-aws ~]$ . ~/.bashrc

[ec2-user@ip-aws ~]$ arg1 first
first

[ec2-user@ip-aws ~]$ ds
DISK DPACE UTILIZATION FOR ec2-user
80K     /home/ec2-user
728x90
반응형

종종 특수한 이유로 Java 구 버젼을 설치해야 할 일이 있음.

오라클 공식 사이트에서는 1.7이하 버젼은 더 이상 다운로드를 지원하지 않지만.
잘 찾아보면 각 버젼별로 다운 받을 수 있음.

한참 헤매다 따로 링크를 저장해 두기로 하고 포스트를 작성함.

JDK 1.5
JDK 1.6
JDK 1.7
JDK 1.8

728x90
반응형

'Language > Java' 카테고리의 다른 글

[Java] 문자열이 날짜 형식인지 확인하기  (0) 2021.10.18
[Java] 성능을 고려한 try-catch 문  (0) 2020.12.16
[Java] Map 반복문  (0) 2020.12.08
[Java] ArrayList Sort  (0) 2020.05.22

소프트웨어 관리

  • 학습 개요
    소프트웨어의 설치와 관리를 위한 패키지 관리 도구를 알아보자.
    RPM은 레드헷 계열 리눅스에서 패키지 파일의 표준 형식이자 패키지 관리 도구이다.
    YUM은 저장소 기반의 설치 기능을 제공하며 패키지 의존성 문제를 해결한 고수준의 관리 도구이다.
    RPM과 YUM의 사용법을 학습하고, 파일 압축과 아카이브 명령을 알아보자.

  • 학습 목표

    1. RPM을 이용한 패키지 관리 방법을 설명할 수 있다.
    2. YUM을 사용한 소프트웨어 패키지를 관리할 수 있다.
    3. 압축을 적용하여 아카이브 파일을 만들 수 있다.

패키지 관리

소프트웨어 패키지의 관리

  • 소프트웨어를 설치하고 업데이트 등을 하는 작업.
  • 패키지 관리 도구를 사용하는 것이 편리함.
    • 리눅스 초기에는 소스 프로그램을 가져와 적당한 디렉토리 구조를 만들고 컴파일하고 링크하여 환경 설정 작업을 해야 했음.
    • 컴파일 되어 있는 패키지를 다루고, 지원 도구를 사용하는 것이 효율적.
  • 리눅스 배포판에 따라 패키징 방법이 다름.
    • 소프트웨어의 배포를 위해 표준 방법이 필요함.
    • 데비안 계열은 DEB(.deb), 레드헷 계열은 RPM(.rpm) 방법.
    • 도구를 사용하거나 '패키지 파일'을 찾아 다운로드 받은 후 설치함.
      • 패키지 파일은 패키지를 구성하는 파일들을 묶어 압축한 파일.

패키지 파일과 저장소

  • 패키지 관리의 기본 단위는 '패키지 파일'.
  • 바이너리 프로그램, 패키지의 메타데이터, 스크립트 파일로 구성됨.
    • 메타데이터는 패키지에 관한 정보.
      • 패키지 이름, 버전, 릴리즈, 아키텍쳐, 패키지 요약과 설명, 저작자와 라이센스, 설치를 위해 필요한 다른 패키지 정보 등.
    • 설치/업데이트/삭제 또는 환경 설정을 위해 스크립트 파일도 필요.
  • 패키지 저장소는 배포용 패키지를 저장하고 관리하는 사이트.
    • 고수준 패키지 관리 도구는 많은 패키지 저장소를 검색할 수 있음.

패키지 의존선

  • 어떤 패키지의 실행을 위해 다른 패키지가 필요할 수 있음.
    • 공유 라이브러리가 필요하다면 패키지가 그것에 의존적이라고 함.
  • 패키지를 설치할 때 '선행 패키지'가 이미 설치되어 있거나 함께 설치해야 함.
    • 고수준 패키지 관리 도구 YUM은 의존성 문제를 해결.
    • 저수준 패키지 관리 도구 RPM은 해당 패키지만 설치하거나 삭제.

RPM 패키지 관리자

RPM

  • RPM은 레드헷 계열 리눅스에서 패키지 파일의 표준 형식.
    • 패키지 파일의 이름은
      • <패키지이름>-<버젼>-<릴리즈>.<아키텍쳐>.rpm
      • firefox-45.0.1-el6.centos.i686.rpm
    • 패키지 파일의 확장자가 .rpm임.
    • 릴리즈 번호는 해당 버전에서 몇 번째 개선된 것인가를 의미.
    • 아키텍쳐는 설치가 가능한 프로세서 아키텍쳐를 의미.
  • RPM Package Manager를 의미하기도 함.
    • 패키지가 설치되면 '로컬 RPM 데이터베이스'에 정보가 저장됨.
    • rpm -qa rpm -qi firefox와 같이 설치된 패키지의 정보를 질의할 수 있음.

RPM 명령

  • 패키지를 설치, 업데이트, 삭제하거나 정보를 확인하는 명령.
  • rpm [options] [package]
    • 옵션은 크게 설치(-i), 업데이트(-u), 삭제(-e), 질의(-q)로 분류됨.
      • 각각에 해당하는 옵션의 서브옵션을 추가로 붙일 수 있음.
    • 설치나 업데이트를 할 때는 pageages에 패키지 파일의 이름을 지정함.
    • 질의를 할 때는 보통 packages에 패키지의 이름을 사용함.
  • 패키지를 설치할 때 선행 패키지가 설치되어 있지 않으면 '의존성 문제'로 설치가 실해팜.
    • RPM 패키지 관리자를 사용할 때는 '선행 패키지'를 찾아 미리 설치해야하는 문제가 있음.
    • 설치하고자 하는 'RPM 파일'을 가지고 있거나 다운로드 받을 수 있어야 함.

RPM 명령

자주 사용되는 RPM 명령과 옵션

rpm 명령과 옵션 desc
rpm -i package_file RPM 패키지 파일을 가지고 소프트웨어 설치
rpm -e package_name 패키지를 삭제함. 종속성 문제가 생긴다면 삭제되지 않음
rpm -qa 서ㅓㄹ치되어 있는 모든(-a) 패키지를 나열
rpm -qi package_name 패키지 이름, 버젼, 설명 등의 다양한 정보(-i)를 출력
rpm -qf file 지정 파일(-f)을 포함하는 패키지 파일을 출력
rpm -ql package_name 설치된 패키지에 포함되어 있는 모든 파일을 나열(-l)
rpm -qc package_name 설치된 패키지의 모든 설정(-c) 파일을 나열
rpm -qR package_name 패키지가 의존(-R)하고 있는 패키지 목록을 보여줌
rpm -qpl package_name 설치되지 않은 RPM 패키지(-p) 파일에 포함되어 있는 모든 파일 나열(-l)

YUM 패키지 관리자

YUM

  • Yellowdog Updater Modified
  • RPM 방법에 기초한 자동 패키지 설치, 업그레이드 및 삭제 도구.
    • RPM 명령의 어려운 부분인 패키지 의존성 문제를 해결.
      • 선행 패키지를 검색하여 자동으로 설치함.
    • 저장소 기반의 설치 기능을 제공하는 고수준 패키지 관리 도구.
  • 저장소 목록을 유지하여 설치 가능한 패키지를 검색.
    • /etc/yum.conf 또는 /etc/yum.repos.d 디렉토리에 있는 저장 설정 파일 (*.repo) 파일들에 저장소 정보를 저장.
    • 설치하거나 업데이트할 때 저장소로부터 필요한 다른 패키지를 찾아서 설치하거나 업데이트함. 삭제도 마찬가지.

YUM 설정 파일

  • /etc/yum.conf
    • [main] 섹션에 전반적인 설정 옵션이 존재함.
      • 파일을 저장하는 캐시 디렉토리 설치 후 캐시 파일의 보관 여부, 디버그 메세지 수준, 로그 파일, 업데이트 시 아키텍쳐의 일치 여부, 서병 확인 여부 등.
      • 저장소 정보의 설정을 포함할 수 있음.
  • /etc/yum.repos.d/ 디렉토리의 *.repo 파일.
    • 저장소 설정 파일로 [저장소 아이디], 저장소 이름(name), 베이스 URL(baseurl)과 미러리스트(mirrorlist) 등이 설정됨.
    • 베이스 URL과 미러리스트는 실제 패키지가 저장된 장소로 로컬 디렉토리 또는 파일 이거나 네트워크 상에 http 서버나 ftp 서버가 관리하는 디렉토리
    • yum repolist enabled 명령으로 활성화된 저장소를 확인할 수 있음.

YUM 명령

  • yum [options] command
    • command 는 yum의 서브 명령.
    • command 의 인수로 패키지를 지정할 때 name, name.arch, name-ver, name-ver-rel, name-ver-rel.arch 등의 형태를 사용함.
  • 수행 과정(설치)
    • 설정 파일을 읽음.
    • yum 저장소에 있는 모든 패키지의 메타 데이터가 로컬 캐시 디렉토리에 저장됨.
    • 패키지의 의존성을 확인한 후 필요한 패키지를 다운로드 받음.
    • 패키지에 포함된 파일을 적당한 디렉토리에 복사하여 설치함.
    • 설치된 패키지의 정보를 로컬 'RPM 데이터베이스'에 저장함.

yum 명령 사용 예

  • yum search string [strings]
    • 패키지 이름이나 요약에서 문자열을 검색하여 패키지를 찾음.
    • yum search web server
  • yum install package [packages]
    • 패키지를 설치 함.
    • yum install emacx
  • yum update [packages]
    • 패키지를 업데이트 함.
  • yum remove package [packages]
    • 패키지를 삭제함.
  • yum reinstall package [packages]
    • 패키지를 다시 설치함.
  • yum info [options] [packages]
    • 패키지의 설명과 요약 정보를 출력함.
    • yum info firefox
  • yum list available [packages]
    • 설치되어 있지 않은 가용 패키지의 목록을 출력함.
  • yum list installed [packages]
    • 설치되어 있는 패키지 목록을 출력함.
    • yum list installed emacs
  • yum deplist package [packages]
    • 패키지가 의존하는 요소와 그것을 제공하는 패키지를 나열.
  • yum repolist [options]
    • 저장소 목록을 나열함.
    • yum repolist enabled 명령은 활성화된 저장소 목록을 출력함.
  • yum history [info | undo | ...]
    • 패키지의 설치와 삭제 이력이 /var/log/yum.log 파일에 기록됨.
    • yum history 명령으로 이력을 확인할 수 있음.
    • yum history info 3 명령으로 해당 yum 명령의 자세한 내용 확인.
    • yum history undo 3 명령으로 해당 명령을 취소할 수 있음.

압축

  • 시스템 파일이나 데이터를 백업할 때 파일 압축이 필요함.
  • 압축을 통해 디스크 공간을 절약하거나 데이터 전송 시간을 줄일 수 있음.
  • 다양한 압축 기술이 존재.
    • 공간 효율과 압축 속도에서 차이가 남.
    • gzip, bzip2, xz, zip 등

gzip

  • bgzip은 압출 파일의 형식이자 파일의 압축과 해제를 위한 프로그램
    • 가장 널리 사용되는 리눅스 압축 프로그램
    • 초기 UNIX 시스템의 압축 프로그램을 GNU 프로젝트에서 수정한 버전
  • gzip [options] [files]
    • 압축시 원본파일은 .gz 확장자를 갖는 파일로 대체됨
    • gzip file을 수핸하면 file은 사라지고 file.gz이 생성됨
  • 옵션
options desc
-c 결과를 표중 출력으로 보내고 원본 파일은 그대로 유지
-d 압축을 풀 때 사용하며 gunzip 명령과 같음
-r 인수로 디렉토리가 주어질 때 디렉토리에 포함된 모든 파일을 재귀적으로 탐색하여 압축
-t 압축 파일의 무결성을 검사
-v 압축 또는 해제하면서 파일의 이름과 압축률을 출력
-number 압축률을 의미하는 1 ~ 9 사이의 값. 기본값 : 6

gunzip

.zg, .Z, .tgz, .taz 등의 확장자를 가진 압축 파일을 풀고, 확장자를 제거함.
(.tgz -> .tar.gz, .taz -> tar.Z)

options desc
gzip foo.txt 압축 파일 foo.txt.gz 생성. 원본 삭제
gzip -d foo.txt.gz 압축을 풀고 원본 파일을 생성. 압축 파일은 삭제
gzip *.txt 확장자가 txt인 모든 파일에 대해 개별적으로 압축
gunzip -d *.gz 모든 압축 파일을 풀고 원본 파일을 생성
gzip -c file1 > bar.gz
gzip -c file2 >>bar.gz
file1을 압축하여 bar.gz을 만들고, file2를 압축하여 bar.gz에 추가함
gunzip -c bar.gz 압축을 풀고 결과를 표준 출력으로 보냄. 압축파일은 유지함
gzip -d file1 file2 > baz.gz 두 파일을 각각 압축한 후 연결 시켜 압축파일 bar.gz을 만듦

bzip2

  • 블록 정렬 압축 알고리즘을 사용한 파일 압축 프로그램
  • gzip과 유사하나 압축 효율이 높고 속도가 느림
    • 압축후 파일의 크기가 매우 작아짐
  • 사용방법은 gzip과 유사하며 압축 파일의 확장자로 .bz2 사용
    • bzip2 file file.bz2 생성후 원본 제거
    • bzip2 -k file 원본 파일 유지
    • bzip2 -d file.bz2 ==> bunzip2 file.bz2
    • bunzip2 -c file.bz2 ==> bzcat file.bz2

tar

  • 여러 파일을 하나의 아카이브 파일로 묶거나 아카이브 파일에서 파일을 추출하는 명령
    • 아카이브는 백업 등의 목적으로 여러 파일을 하나로 묶은 것.
  • tar mode [options] [tarfile] [pathnames...]
    • tarfile은 아카이브를 의미
    • pathname은 아카이브에 넣을 파일이나 디렉토리
    • 아카이브 파일의 확장자는 보통 .tar를 사용함
    • 모드나 옵션을 사용할 때 대시 (-)를 사용하지 않는 편임
  • mode
    • A : tar 파일을 아카이브에 추가
    • c : 새로운 아카이브 생성
    • x : 아카이브로부터 파일 추출
    • r : 아카이브에 파일 추가
    • t : 아카이브에 포함된 파일의 목록을 출력
  • options
    • f : 아카이브 파일을 지정
    • v : 처리 과정에서 대상 파일을 보여줌
    • z : tar 명령에서 gzip을 사용 (.tar.gz)
    • j : tar 명령에서 bxip (.tar.bz2)
  • 사용 예
    • tar cvf foo.tar *.c
      • : 현재 디렉토리에서 .c로 끝나는 모든 파일을 foo.tar로 묶어 만들고 진행 결과 출력.
    • tar tvf foo.tar
      • : 아카이브 foo.tar에 있는 파일 목록을 출력.
    • tar xvf foo.tar
      • : 현재 디렉토리에 아카이브 foo.tar를 해제.
    • tar cvf bar.tar backup/
      • : 디렉토리 backup의 내용을 묶어 아카이브 bar.tar로 만듦.
    • tar cvfz baz.tar.gz backup/
      • : 위와 같으나 아카이브를 만들 때 gzip을 이용하여 압축.
    • tar xvfz bzx.tar.gz
      • : gzip으로 압축된 아카이브를 해제.

jar

  • jar는 java application을 압축 형식.
  • 실제로는 ZIP 파일 포멧으로 이루어진 압축 파일로 확장자는 .jar
  • JDK에 포함된 jar 명령어를 통해 사용.
  • zip을 사용할 수 있으나 manifest 파일이 필수인 경우에는 정상적으로 작동하지 않을 수 있다.
  • jar {ctxu} [vfm0M] [jar file] [manifest-file] [-C dir || files]
    • 필수 옵션 cxtu
      • c : 새 archive를 생성.
      • x : jar 파일을 해제.
      • t : jar 파일에 해당하는 파일의 content list를 설정.
      • u : jar 파일 내에 들어있는 파일을 수정.
    • 기타 옵션 vfm0M
      • v : console 창으로 진행 사항을 모두 출력.
      • f : archive 될 파일 이름 지정.
      • m : manifest 파일로부터 정보를 포함.
      • 0 : 묶기만 하고 zip으로 압축하지 않음.
      • M : 추가되는 entry에 대해 manifest를 생성하지 않음
    • jar file : archive 대상이 되는 .jar 파일의 이름
    • manifest-file : 정보를 포함할 manifest file의 이름
    • -C dir || files : archive 할 디렉토리 또는 파일 명.
728x90
반응형

'OS > Linux' 카테고리의 다른 글

[Linnux] 네트워크 설정 및 점검  (0) 2020.12.05
[Linux] 쉘 스크립트 -2  (0) 2020.11.08
[Linux] 프로세스 관리  (0) 2020.11.01
[Linux] 파일 시스템 관리  (0) 2020.10.25
[Linux] vi 사용 텍스트 편집  (0) 2020.10.25

+ Recent posts