bash 쉘을 이용한 스크립트 만들기 #6


0. 개요 

앞서한 강좌에서 bash script를 하기위한 문법적인 부분중 피룡한 부분은 다되었다고 해도 크게 무리는 아니다 
하지만 bash script의 경우 문법만가지고 할수 있는 부분은 극히 적다
여러가지 명령어들과 그에 따른 조합을 이용해서 이루어지고 이부분에 필요에 따라 분기 반복 문자열 파싱 패턴 메치등의 여러가지의 프로그램적인 요소와 실제 시스템에서 사용되는 명령어의 실행으로 이루어지기 때문이다 
이번 강좌에서는 bash script를 사용하기 위해 유용한 명령어들에 대해 알아보자 


1. 디버깅하기 

"#!/bin/bash" 를 처음에  "#!/bin/bash -x" 로 해주면 된다 .


 -f -X '\''!*.@(pdf|PDF)'\'' acroread gpdf xpdf' ']'
+++ line='complete -f -X '\''!*.@(pdf|PDF)'\'' acroread gpdf xpdf'
+++ line='complete -f -X '\''!*.@(pdf|PDF)'\'' acroread gpdf xpdf'
+++ line=' acroread gpdf xpdf'
+++ list=("${list[@]}" $line)
+++ read line
+++ '[' 'complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf' '!=' 'complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf' ']'
+++ line='complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf'
+++ line='complete -f -X '\''!*.@(?(e)ps|?(E)PS|pdf|PDF)'\'' kpdf'
+++ line=' kpdf'
+++ list=("${list[@]}" $line)
+++ read line


위 와 같이 각 실행 부분에 대해 알려준다 



2. 문자열 치환 

sed  
패턴에 따른 문자열 치환 
# sed -e "s/[old_patten]/[new_patten]/g" /path/to/filename

공 백 라인 삭제
# sed -e "/^$/d"  /path/to/filename


3. 전형화된 파일에서 필드 구분 

ex) 파일내용   필드 구분자 : \:   row구분자 : \n
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh

# awk -F : '{print $1}' /etc/passwd
# cat /etc/passwd | awk -F : '{print $1}'
두가지다 아래와 같이 출력된다 
root
daemon
bin
sys
sync
games
man
lp
mail

# cut -d :  -f 1 /etc/passwd
# cat /etc/passwd | cut -d :  -f 1
두가지 다 아래와 같이 출력된다 
root
daemon
bin
sys
sync
games
man
lp
mail


4. 검색 및 탐색
파일명으로  검색할경우 
find /path/to/ -type f -name [patten]

파 일사이즈로  검색할경우 
find /path/to/ -type f -size +1024000

파일생성일자로 검색 
find /path/to/ -type f -ctime +24

파일내용으로 검색할경우 
grep [patten] /path/to/filename

특정디렉토리 아래로 모든파일을  재귀적으로 내용을 검색할때 
grep [patten] /path/to/ -R


5. 파일 길이 알아보기 
각 라인 마다 번호 붙이기 
     공백 라인은 제외하고 번호붙이기
     nl /path/to/filename 
     1         #!/bin/bash
       
     2         for i  in $( ls ) ; do 
     3          echo   "$i\n"
     4         done

     공백라인 상관없이 번호붙이기
     cat -n  /path/to/filename 
     1         #!/bin/bash
     2    
     3         for i  in $( ls ) ; do 
     4          echo   "$i\n"
     5         done

     파일길이에 대한 자센 정보 
     wc /path/to/filename 
     5 12 74 /path/to/filename
     [라인수] [단어수] [문자 수] [파일]


6 .  날자 시간 
현재 날짜 알아보기 
# date
2010. 05. 16. (일) 18:52:31 KST

포멧을 지정할경우 
# date +"%Y%m%d %H%M%S"
20100516 185341

특정 프로그램의 실생기산구하기 
# time ls -al

....
real    0m0.040s
user    0m0.008s
sys    0m0.012s


7. 마무리 

bash script 를 사용할때  자주 사용되는 몇가지 명령어들에 대해  알아보았다 여기서 알아번것은 기본 사용법이며  보다 디테일하게 사용하기 위해서는 man page 등을 참고하여 사용하여야 한다 
다음번에는 위의 명령어들 외에 다른 명령어들에 대해 알아보도록 하겠다 .


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1743

'Programming > Linux Coding' 카테고리의 다른 글

rsync 명령어  (0) 2017.07.21
grep 명령어  (0) 2017.07.21
bash 쉘을 이용한 스크립트 만들기 #5  (0) 2017.07.21
bash 쉘을 이용한 스크립트 만들기 #4  (0) 2017.07.21
bash 쉘을 이용한 스크립트 만들기 #3  (0) 2017.07.21
bash 쉘을 이용한 스크립트 만들기 #5


0. 소개 

  앞서 연재 되었던 강좌에서 기본적으로 bash 스크립트를 작성할수 있는 문법들에 대해서는 알아보았다 
하지만 입력 해야하는 갑이 랜덤하거나 임의로 정된 값을 사용해야 할 경우 사용자 인터페이스가  있다면 얼마나 졸을까라는 생각이 들것이다. 

  비록 tui환경이지만 어느정도 값을 입력하고 해당부분에 대한 결과를 받을수 있는 인터페이스를 제고하고 있다. 그리고 이를통하여 대화형 스크립트역시 작성이 가능하다. 
  이부부에 대해 알아보자 


1. select  구문 

select 의 경우 사용자에게 리스트형태의 선택 메뉴를 보여주고 해당 메뉴에 대해 번호를 부여하여 번호의 입력으로 해당메뉴의 실행을 가능하게 해준다. 

#!/bin/bash
options="pstree ps quit"

select tmp in $options ; do

        if [ "$tmp" = "pstree" ] ; then
                pstree
        elif [ "$tmp" = "ps" ] ; then
                ps -ef
        elif [ "$tmp" = "quit" ] ; then
                exit
        else
                echo bad option
        fi

done


=======================

1) pstree
2) ps
3) quit
#? 


2. read 구문

  프롬프트 상에서 사용자에게 임의의 값을 입력 받을때 사용한 

#!/bin/bash

echo "input 0 ~ 9"

read NUMBER

echo $NUMBER

echo "input [0 ~9]  [a-z]"

read NUMBER CHAR

echo $NUMBER $CHAR

==================================

input 0 ~ 9
0
0
input [0 ~9]  [a-z]
0 a
0 a


3. 마무리 

  select 와 read 외에도 dialog box등의 여러가지 유틸 및 명령어들이 있다. 

  하지만 가장 손쉽게 구현할수 있는것은 select와 read 이다. 
  
  이두가지만 가지고도 보다 편하고 직관적인 스크립트의 작성이 가능하다. 


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1734

 bash 쉘을 이용한 스크립트 만들기 #4

0. 개요 

앞서 변수 지정, 출륙, 반복, 분기 등에 대해 알아보았다 

이러반 부분만으로도 충분히 스크립트를 작성하고 

원하는기능을 구현할수있다 

하 지만 보다 쉽게 그리고 간편하게 하기위해서 

리다이렉션와 파이프 그리고 함수에 대해 알아보도록하자 


1. 리다이렉션

리다이렉션의 설명에 앞서 먼저 표준 입력과 표준 출력,에러에 대해

알아보자  기본적으로 표준  입력과 출력,에러 의 방향은 단반형으로 정해져있다 

표준 입력의경우 입력 장치로 부터  프로세서로 전달 되는 방향이며 
STDIN (Stanard Input)으로 표기된다 

표준 출력의 경우 프로세서에서 출력 장치로 전달되는 방향이며 
STDOUT (Standard Output)으로 표기된다 

표준 에러의 경우 펴준 출력의 한방식 이며 에로 또는 경고발생시 이용되는 형태이다
STDERR (Standard Error)으로 표기된다 


그 리고 리다이렉션이란 앞에서 설명한 표준 입력 , 출력 , 에려의 진행방향을 

파일로 또는 표준 출력을 표준에러로 와 같이 진행방향을 변경하는것을 의미한다 

몇 가지 예를 이용하여 알아보자  
   표준 출력을 파일로 
    #!/bin/bash
        ls > test.log

   표준에러를  표준출력으로 또는 파일로
    #!/bin/bash
    grep "http"  /home/ -R  2>1 

    #!/bin/bash
    grep "http"  /home/ -R  2> test.log

  표준 출력,에러 모두를  표준출력으로 또는 파일로
    #!/bin/bash
    grep "http"  /home/ -R  2>&1
    
    #!/bin/bash
    grep "http"  /home/ -R  &> test.log


2. 파이프
    파이프는 특정 프로그램의 출력을 입력으로 바꾸어 주는것을 말한다.

    #!/bin/bash
    ls -al | grep "*.log"
    
    ls -al 의 결과 출력을 파이프롤 통해서 grep "*.log"의 입력으로 바꾸어준다.


3. 함수 
    논리 적인 흐름과 재귀적인 표현등을 위해 함수를 사용가능하다 

    함수의 사용볍은 function function_name { ..bash script.. }  의 형태로 가능하며 

    function_name을 호출하는것으로 함수의 호출이 가능하다 

    그리고 함수에 파라메터를 전달하기 위해서는   함수 호출시 

    function_name argv1 argv2 argv3 ... 과 같은 형태로 함수뒤에 파래메타를 입력하고 

    function function_name { 
     echo $1
    echo $2
    echo $3
    ....
    }

    위와같이 넘겨진 파라메터를 함수 내에서 사용가능하다 

    #!/bin/bash
    
    function tests_1 {
        echo "linux.co.kr"
    }
    
    function test_2 {
        echo $1
    }

    test_1            # "linux.co.kr"이 출력된다 

    test_2 testargv1    # testargv1가 출력된다.



4. 마무리
     오늘 알아본부분에서 함수는 그렇다하더라도 

     리다이렉션과 파이프는  실제 서버관리에서도 광장히 만히 쓰이고 

     명령어를 조함 할때도 많이 쓰인다 

     이부분들에대해서는 반드시 알고 넘어가야 할 부분이다.


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1724

bash 쉘을 이용한 스크립트 만들기 #3 

0 . 개요 

앞에서는  쉘스크립트의 제어구문 중 분기에 대해 일아보았다 

우리가 사용하는 언어와 크게 차이나지는 않지만 

약간식 다른 부분도 있다 

에번에는 제어구문중 반복에 대해 알아보자 

1. for 구문
    일반적으로 사용하는 언어의 for문과 크게 다르지않으며 
    언어에서 제공하는 것 이외의 다른 기능이 더 추가되어 있다 
    예를 들자면 특정 문자열의 각 단어를 지마며 끝날때 까지 실행시킬수 있으며 
    ls등의 명령어로 나온 결과에 따라 각 가인을 지나며 끝날때 까지 실행시킬수 있다 

   명령행으로 주어진 모든것을 출력
    ------------------------------------------------------------------------------
    #!/bin/bash

     for i in $@  ;do
    echo $i
     done


   1에서 100 까지 출력
    ------------------------------------------------------------------------------
     #!/bin/bash

     for i  in $(seq 1 100); do 
      echo $i
     done

     명령으로 주어진 문자열 출력
    ------------------------------------------------------------------------------
     #!/bin/bash

     for i  in $( ls ); do 
      echo $i
     done
  

2. while 구문
    내부 조건이 참일경우 반복해서 실행시킨다 
    즉 거짓이되면 더이상 실하아지않고 다음 구분이 시행된다
  
    ------------------------------------------------------------------------------
     #!/bin/bash

     i=0
     while [ $i -lt 100 ] ; do
          echo $i
          let i=i+1
     done


3. until 구문
    내부 조건이 거짓일경우 반복해서 실행시킨다
    즉 참이되면 더이상 실하아지않고 다음 구분이 시행된다
 
    ------------------------------------------------------------------------------
     #!/bin/bash

     i=200
     until [ $i -lt 100 ] ; do
          echo $i
          let i=i-10
     done


4. 마무리 



이번에는 bash를 용한 쉘 프로그래밍을 하기 위한   반복문 부분에 대해 알아보았다

다른언어에 비해 크게 어렵거나 하지는 않지만
약간씨의 추가 기능에 대해 알아두면 
보다 편하게 가능하다

그리고 쉘프로그래밍은 시스템관리시에 유용하게 많이 사용되며
반복문의 경우 특정 디렉토리 내의 파일명을 변경을 한다거나  기타 반복적인 
소모적인 작업에서 구해줄 친구이다  



[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1721

bash 쉘을 이용한 스크립트 만들기    #2


0. 개요 

앞에서 기본적인 출력 방법이나 변수 선언등에 대해 알아보았다 

이벤에는 제어구문중 분기에 대해  알아보고  

분기에 필요한 비교연산자에 대하 간략히 알아보도록하자 


1. 비교연산자 

분기(조건문)에서 조건에 대한 비교를 위해 

그리고 다양한 조건의 병합을 위해 사용된다 

수 비교 

-eq      같다        if [ "$a" -eq "$b" ]
-ne      같지 않다    if [ "$a" -ne "$b" ]
-gt       초과        if ["$a" -gt "$b" ]
-ge      이상        if [ "$a" -ge "$b" ]
-lt      미만        if [ "$a" -lt "$b" ]
-le      이하        if [ "$a" -le "$b" ]


문자열 비교

= ,==   같다           if [ "$a" = "$b" ]
!=       같지 않다    if [ "$a" != "$b" ]
-z       문자열이 "null"임. 즉, 길이가 0
-n       문자열이 "null"이 아님.

기타 비교
-f       파일이 존재하는지  확인한다
-d        디렉토리가 존재하는 확인한다


2. 분기 (if)

분기에 대표적인 것은 if와 switch이다 

둘다 조전에 따라 참인지 거짓인지 판별하여 수행하도락 하는 부분이다 

먼저 if 에 대해 알아보도록하자 

------------------------------------------------------------------------------
#!/bin/bash 
if [ "test" = "test" ]; then 
    echo "ture"
fi 


print true
------------------------------------------------------------------------------
#!/bin/bash 
if [ "test" = "test" ]; then 
    echo "true"
else 
    echo "false"
fi 


print true
-------------------------------------------------------------------------------

위의 예는 이해를 돕기 위해 작성한부분이며 

실제로는 아래의 형태와 같이  변수와 함께 사용된다 

-------------------------------------------------------------------------------

#!/bin/bash 

test="1"
test1="2"

if [ "$test" = "$test1" ]; then 
    echo "true"
else 
    echo "false"
fi 


print false
-------------------------------------------------------------------------------


2. 분기 (case)

동일한 조건하에  여러가지로 분기를 해야할경우 

자주쓰이는  case 문에 대해 알아보자 


-------------------------------------------------------------------------------

#!/bin/bash 

$test="red"

case "$test" in
    "red")   
        echo "ff0000" ;;
    "green")   
        echo "00ff00" ;;
    "blue")
        echo  "0000ff" ;;
         *)
                echo "error" ;;
esac


print ff0000
-------------------------------------------------------------------------------

각케이스 끝에는  ;;표시하여 분기의 끝점이면 알려주어야한다 .



3.  간단한 예제

특정 프로세의 수를 세어   10개 이상이면 콘솔상에 특정 문자를 출력하는

것에 대해서 알아보자 

-------------------------------------------------------------------------------
#!/bin/bash

process_name="httpd"

process_max_cnt="10"

process_cnt="`ps -ef  | grep $process_name | grep -v "grep" | wc -l`"


if [ "$process_cnt" -gt "$process_max_cnt" ] ; then
    echo " $process_name : $process_cnt "
fi
-------------------------------------------------------------------------------

위와같이 작성이 된다면  httpd라는 프로세서의 갯수가 10개 초과이라면 

해당 스크립트를 실행시킬시에  "httpd : 11" 과 같은 형식으로 출력이 된다 .



4. 마무리

이번에는 bash를 용한 쉘 프로그래밍을 하기 위한   분기 및
비교 연산자 부분에 대해 알아보았다

다른언어에 비해 크게 어렵거나 하지는 않지만 
분기문에서 bash쉘 버전에 따라 약간식 오류가 나는부분이 있을수도 있다 
이부분은 대부분이 변수 비교 부분에서 "$a" -gt "$g" 이런식으로 "를 
이용하면 회피가가능하다 .

그리고 쉘프로그래밍은 시스템관리시에 유용하게 많이 사용되며
소목적인 반복작업에서 구해줄 친구이다  


[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1716

bash 쉘을 이용한 스크립트 만들기    #1

0. 개요

우리가 리눅스를 접하게되면 제일 먼제 만나게 되는 것이 bash이다 

하지만 우리가 모르는사이에 bash를 이용한 간단한 프로그래밍이나 

응용하여 크론에 등록하고 있다 

물론 이문서를보는 사람들은 bash가 무엇인지는 알고 있을 것이고 

여기서는     bash를 이용한 쉘스크립트를 만들기위한 

기초에 대해 간략히 정리하도록 하겠다.



1. 간단한 텍스트 출력하기 

우선 bash에서 가장 간단하게 출력 가능한 echo를 이용하여 

"bash script test"라는 문구를 출력해보자 

# vi test.sh
-------------------------------------------
#!/bin/bash
echo "bash script  test"
:wq

리눅스에서 파일을 실행시키기위해서는 실행권한이 있어야 한다
# chmod 0700 test.sh

해당 파일을 실행시킨다.
# ./test.sh
bash script  test



2. 변수 지정하기 

위에서 보았던것 처럼 "bash script test"를 다시한번 출력할 것이다 
하지만 echo에 바로 지정해서 출력하는것이 아니라 변수를 지정하여 
출력하도록 해보자 

# vi var_test.sh
-------------------------------------------
#!/bin/bash
CHARERS="bash script  test"
echo $CHARERS
:wq

리눅스에서 파일을 실행시키기위해서는 실행권한이 있어야 한다
#chmod 0700 var_test.sh

해당 파일을 실행시킨다.
# ./var_test.sh
bash script  test

CHARERS라는 변수가 생성되면서  "bash script  test" 값으로 지정되었다 .
주의할점은 echo롤 출력시에  $을 빼버리면  "CHARERS" 단어가 출력된다 
그리고 변수지정시  "=" 앞뒤로 공백이 들어가면 안된다.


그리고 bash에서도 함수가 있으며 이로인하여 지역변수가 있다 
지역변수는 local이라는 명령어를 이용하여 사용한다 
간단한예를 설명으로 대신하겠다

# local_var_test.sh
-----------------------------------------------------------------------
#!/bin/bash
CHARERS="bash script test global variables"
function locals {
    local CHARERS="bash script test local variables"
    echo $CHARERS
}
echo $CHARERS
locals
echo $CHARERS


# ./local_var_test.sh
bash script test global variables
bash script test local variables
bash script test global variables


3. 배열 사용하기 

bash의 최신버전에서는 배열을 지원한다 
다차원배열을 지원하지는 않지만 1차원 배열은 지원한다 .
특이한점은 중간에 키값이 비어있어도 문제가 되지 않는다 
배열의 값을 사용시에는 {}가 필요하다 
사용법에 대해 알아보자 

# vi array_test.sh
-----------------------------------------------------------------------
#!/bin/bash

vararray[0]="bash "
vararray[1]="script "
vararray[2]="array "
vararray[3]="test"


echo ${vararray[0]}
echo ${vararray[1]}
echo ${vararray[2]}
echo ${vararray[3]}
echo ${vararray[4]}



-----------------------------------------------------------------------
# ./array_test.sh
bash
script
array
test

-----------------------------------------------------------------------

4. 마무리 

이번에는 bash를 용한 쉘 프로그래밍을 하기 위한   출력 및 
변수 선엔부분에 대해 알아보았다 

여지것 배운 다른 언어들과도 크게 차이나지는ㅤㅇㅏㅎ을 것이다 
오히려 타입선언등의 부분이 없기 때문에 오히려 더쉬울수도있다 

그리고 쉘프로그래밍은 시스템관리시에 유용하게 많이 사용되며 
소목적인 반복작업에서 구해줄 친구이다 


원문 : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1711

[에러 메세지]

error: ‘for’ loop initial declaration used outside C99 mode



[에러 원인]

C언어 최신 표준인 99 이전 버전에서는 for문에서 변수 선언이 불가능 


[해결 방안]

2가지 방안으로 컴파일러 옵션을 지정 or 전역 변수로 선언


1. gcc 컴파일러 옵션에 표준 C99를 사용

gcc -std=c99


2. for문의 변수 선언을 전역 변수로 선언

for(int i; i<10; i++)

↓↓↓↓↓↓↓↓↓↓

 int i;

for(i; i<10; i++)



[참고]

https://kldp.org/node/24342



  • jobs - list the current jobs
  • fg - resume the job that's next in the queue
  • fg %[number] - resume job [number]
  • bg - Push the next job in the queue into the background
  • bg %[number] - Push the job [number] into the background
  • kill %[number] - Kill the job numbered [number]
  • kill -[signal] %[number] - Send the signal [signal] to job number [number]
  • disown %[number] - disown the process(no more terminal will be owner), so command will be alive even after closing the terminal.


- Reference

https://superuser.com/questions/268230/how-can-i-resume-a-stopped-job-in-linux

[Unity Tutorial Slime World 06] Applying Monster Animations and Checking Collision


1. 애니메이션 타입을 레거시에서 메카님으로 변경 (Converting Legacy to Mecanim)

cha_data -> monster-> cha_slime -> Motions 

-> Mot_Slime@Attack, Mot_Slime@Damage, Mot_Slime@Dead, Mot_Slime@Wait, Mot_Slime@Walk 

-> Inspector -> Rig -> Animation Type -> Legacy 에서 Generic 으로 변경 후 Apply


2. 몬스터 슬라임에 Animator 추가

Slime -> Add Component -> Animator 생성 

Slime -> Animator -> Controller -> Slime Controller 추가


3. Animator 수정

 State

Parameter 

Value 

 Wait -> Walk

isWalking

true 

Walk -> Wait 

isWalking

false 

Any State -> Attack 

isAttacking 

true 

Any State -> Damage 

isDamaging 

true 

Any State -> Dead 

isDead 

true 


4. 플레이어 무기에 태그 추가

Player -> Group Locator -> Sword02 -> Tag -> Sword 추가


5. 플레이어 무기와 몬스터 슬라임에 충돌 박스 콜라이더 추가

Player -> Group Locator -> Sword02 -> Add Component -> Box Collider 생성 -> Is Trigger 체크

Slime -> Add Component -> Box Collider 생성 -> Is Trigger 체크


6. SlimeController 스크립트 수정


+ Recent posts