Shell 을 사용하다보면


흠 개발자들은 모르겠지만 /bin/sh 만 사용하는 나로써는


대부분 업무에 대한 잡다한 프로세스를 스크립트를 통해서 대체 하게 된다.


메모리가 튀는 순간을 확인하기 위해서 어느정도 때에 터지는지 실시간 확인을 한다거나 ( 물론 데몬으로 구현해도 상관은 없지만)  점점 하다보면 좀더 나은 방법을 찾겠지만 초창기에는 쉽고 간단한 방법으로 하게된다. 


for문을 쓰다가 요즘엔 foreach 를 자주 쓰는것처럼


int string 배열보단 vector<T>처럼 


아주 맨 처음에 정수 연산을 할때 아무생각 없이


cnt =0


while true

do 

.....

$cnt = $cnt + 1 

done

을 적지만 1에 대해 인식을 하지못하여서 제대로동작하지 않는 경우가 생긴다.




그렇기 때문에 간단하게 수정을 들어간다.



cnt =0

while true

do

cnt = $(($cnt+1))

echo $cnt

done





$(( $  value + 1)) 


다음엔 응용도 해보겠다.






자주자주 써봐야 하는데


Python 


C++ 


을 쓰다보니 헷갈리는 부분이 있다.


C++에서야


while(true)

{

sleep(1000);

std::cout<<"check"<<std::endl;

}



Python // 파이썬 의 경우는 인덴트가 중요하기 때문에 인덴트에 유의해서 작성한다.


while 1:

print("check")



우찌우찌 해야되지 하다가 검색도 안해보고 그냥 어림짐작으로 막 쓰다보니 되었던 while


#!/bin/sh


while true

do

ls -al

sleep 1

done



//  ; 가 너무 습관화 되어있다 보니 붙여야 하는지 마는지 너무 헷갈린다....


while: 도있고 while() 도있고 while 도있고


Unix에서는


while 조건문

do

할일

done


의 형식으로 적어 주면 된다.






저번에 1에서 작성 한 스크립트를 업무에 사용을 하여야 하는데 해당 스크립트는 동작에 대한 기본 틀만 알수 있을 뿐


업무에 사용은 할수가 없다. 


일단 가장 큰 문제는 사용할수가 없다  이다.


sudo 로 사용하였을시 비밀번호를 묻는 입력은 처음에만 나타나고 이후로는 나타나지 않을수도 있기 때문이다.


그렇기 때문에 패스워드에 대한 기대를 2번하고 2번 입력을 하게되면


scp로 파일을 받아 오는 도중에 시그널이 들어가게되면 파일 다운이 종료 되기 때문에 제대로 받아올수가 없다.


두번째 로는 정상적으로 실행이 됐다는 가정하에 


예상대로 Root비밀번호(sudo) 와 서버 계정의 비밀번호를 입력 하면 되겠지만

저 문자열이 아닌 다른 문자열(DNS ~~~ Yes/No ) 이 나오는 경우가 있을수 있다. 이에 대한 해결책으로 



(작성중)

'GNU > bashShell' 카테고리의 다른 글

UNIX Shell 정수 연산  (0) 2016.08.24
UNIX Shell while 반복  (0) 2016.08.16
expect 를 이용한 scp 자동 스크립트 작성  (0) 2016.06.23
UNIX 공백에 대한 변수명 사용시  (0) 2016.06.17
UNIX set 명령어  (0) 2016.06.15

scp를 이용하여서 파일을 받아 온다 .치면


sudo scp -r test@192.168.1.11:~/Test/Tmp 에서 받아오는데 이 이후에


password :입력과

DNS어쩌구 머시기 yes를 해주어야 한다. 


이 부분을 매번 테스트할때마다 받아오기도 귀찮고 그냥 ./scp.sh 하면안될까 싶어서 찾아보니 expect 로 한댄다.


그래서 expect 가설치 되어있는지 확인을 하여야 하기 때문에


터미널에서 그냥 expect 라고 입력시 not found 뜨면 설치를 해주어야 한다. 


저는 Unix시스템에서 작업을 하기 때문에 Unix기준으로 보면


pkg search expect 해당 커널 버전에 따라서 이렇게 나오게 됩니다. 


 

순수 expect 입력시 not found command가 뜬다면 pkg install expect 로 설치를 해주세요 


repository 가 없다면


expect  http://www.nist.gov/el/msid/expect.cfm

tcl   http://tcl.sourceforge.net/ 에서 설치를 해주셔야 합니다.


repository 없이는 tcl까지 설치 하여야 합니다.


기본적인 루틴


spwan (지정된 어플리케이션을 실행)

send (명령 실행)

expect -re(기대 값 설정)

interact (스크립트 종료)


#!/bin/sh 으로 실행하게되면 not found가 뜰수가 있는데


sh 혹은 bash 쉘에 expect 를 넣어 서사용하는방식이


expect << EOL 을 넣어 주면 사용할수 있다.


아주 간단한것부터 시작ㅇ르 해본다.


test라는 계정으로 접속하여 192.168.1.11 서버에 /home/Test/Temp 라는 폴더를 /home/Test/Tmp 라는 폴더(현재서버)로 가져올려고 한다.

scp명령자체에 sudo를 걸어서 가져올려고 한다. 그럴시에 PassWord입력이 2개가 뜨게 된다.



그렇기 때문에 대략적인 스크립트를 적어 본다면 


#!/bin/sh/

expect << EOL

spawn sudo scp -r test@192.168.1.11:~/Test/Temp /home/Test/Tmp

expect "Password*" // 처음 나타난 메시지중에 Password로 시작하는 메시지를 기대한다.

sleep 0.5                // 0.5초 쉬고 

send "1234\r"        // 1234를 입력하고 캐리지 리턴 (\r)엔터 입력 

expect "Password*"    // 두번째 나타난 메시지 중에 Password로 시작하는 메시지를 기대한다.

sleep 0.5                //0.5초 쉬고 

send "1234\r"        //1234 입력 후 엔터 


interact


로 나타날수 있다.




해당 스크립트는 쓸모가 없다. (쓸수도 없고...)


2탄으로 다시 작성하도록 하겠습니다.





'GNU > bashShell' 카테고리의 다른 글

UNIX Shell while 반복  (0) 2016.08.16
expect 를 이용한 scp 자동 스크립트 작성 - 2  (0) 2016.06.28
UNIX 공백에 대한 변수명 사용시  (0) 2016.06.17
UNIX set 명령어  (0) 2016.06.15
UNIX Shell 조건문  (0) 2016.06.15

공백이 있는 파일명을 처리하기 위한 상황이 생겼다.


Program Files 윈도우에선 이렇게 표시되지만


유닉스에선 그렇지 않다.

Program\ Files 로 표시가 된다. 


그렇기에 사용방법은 같을 것으로 보여


_DIR_="/Program\Files/"


을 사용했지만 되지 않는다.... Program 과 Files를 따로 보게 된다.


여러번 삽질후에 찾은 결론 

#!bin/sh


_PROGRAM_DIR_="/Program Files/"


사용시에


ls $_PROGRAM_DIR_이 아닌

ls "$_PROGRAM_DIR_" 로 호출시에 따옴표로 묶어주면 된다. ㄷㄷ



'GNU > bashShell' 카테고리의 다른 글

expect 를 이용한 scp 자동 스크립트 작성 - 2  (0) 2016.06.28
expect 를 이용한 scp 자동 스크립트 작성  (0) 2016.06.23
UNIX set 명령어  (0) 2016.06.15
UNIX Shell 조건문  (0) 2016.06.15
UNIX Shell의 기본  (0) 2016.06.14

유닉스의 set명령어를 입력하면


현재 쉘에서 사용되고 있는 변수들의 리스트를 확인할 수 있다.


예제(set.sh)


#! /bin/sh

First_temp="FirstString"

Second_temp="SecondString"

Third_temp="ThirdString"

set


결과 값


BLOCKSIZE=K

EDITOR=vi

First_temp=FirstString

GROUP=wheel

HOME=/root

HOST=user-user

HOSTTYPE=FreeBSD

IFS=' 

'

LD_LIBRARY_PATH=/system/lib

LOGNAME=root

MACHTYPE=i386

MAIL=/var/mail/root

OPTIND=1

OSTYPE=FreeBSD

PAGER=more

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin

PPID=87112

PS1='# '

PS2='> '

PS4='+ '

PWD=/home/user/Desktop/test

REMOTEHOST=

SHELL=/bin/csh

SHLVL=1

SUDO_COMMAND=/bin/csh

SUDO_GID=0

SUDO_UID=1001

SUDO_USER=user

Second_temp=SecondString

TERM=vt100

Third_temp=ThirdString

USER=root

USERNAME=root

VENDOR=intel

C나 C++  혹은 VB(Visual Basic)을 사용하였던 사람들에게는 if만큼 쉬운 문장이 아닐수 없다.


if(조건) 

참일시액션

else

아닐시 액션



다중 조건 일경우


if(조건)

참일시 액션

else if(첫번째 if가 참이 아닐시 두번째 조건 확인)

참일시 액션

else

위에 두 if문이 참이 아닐시 액션


으로 이루어지며 매우 간단하며 하드 코딩의 시초가 된다. 모든것을 조건문으로 해결할수 있으며 


디버깅 방식 중 하나로 분류 되기도 한다. 


Shell을 다시 시작하자

맨 첫줄에 #!/bin/sh


변수


변수를 적을때 그냥 변수명만 적으면 된다. (자바스크립트에서는 var라고도 명시하였지만 그럴 필요가 없다.)

NULL로초기화 하고 다음에 값을 할당시에는


Temp= 로 설정 한다.   값할당에는 = 사용하게 되며 이 사이에 공백이 있으면 안된다. 


temp=TEMP        O

temp = TEMP      X

temp="TEMP A"   O


변수명과 =의 사이에는 절대 떨어져선 안된다. 


변수의 내용을 출력하기 위해선 echo 를 이용하며 $를 사용한다.


기본 터미널에서 echo $SHELL 을 입력시 SHELL변수를 불러서 현재 쉘을 확인할수 있듯이


echo $temp 를 할시에는 TEMP 가 출력됨을 확인 할수 있다. 


기본 예제 4 (Variable.sh)


#!/bin/sh


txtList=*.txt


echo $txtList


결과 a.txt b.txt

//같은 폴더 내에 a.txt b.txt파일이 있는 상태에서 



재 할당 도 가능 하다

#!/bin/sh

Process="aux"

Process="Riven"

echo ps-$Process   -> 결과값 ps-Riven 


재할당이 가능


재할당이 불가능하게 하기 위해선 상수로 선언할수 있는데 readonly 라는 키워드를 쓴다. (대문자 Readonly는 안된다.)


#!/bin/sh

Process="aux"

readonly Process

Process="Riven"

echo ps-$Process  -> 결과값  Process : is read only 라는 에러가 나타난다.



#!/bin/sh

Process="aux"

unset Process

echo ps-$Process   -> 결과값 ps- 


unset은 변수를 제거한다. Process= 상태로 만들어 버린다.



C언어에서 scanf

C++  cin>> 

java에서 System.in  Scanner등있고 쉘에선


read라는 키워드를 사용 한다.


기본 예제 4 (read.sh)



#!/bin/sh


echo "First ps Option "

read option1


echo "second input ps"

read option2 


ps $option1


echo "Second Input ps "


sleep 2


ps $option2 


결과는 첫번째 입력은 그냥  엔터 2번째 입력은 -aux로 입력했을시 두개의 결과를 첫번째 ps 를 보여주고 2초뒤에 ps -aux 를 보여준다.




유닉스의 쉘의 기본은 sh 이다.


OS에서 사용자가 입력하는 명령을 읽고 해석하여 대신 실행해주는 프로그램  모든 OS에는 쉘은 존재한다.



유닉스 쉘 스크립트의 시작은


#!/bin/sh 


로 시작 한다


* 주의할점은 /bin/sh 로 해야지 bin/sh 는 안된다. / 로 경로를 우선적으로 잡아야 한다. 기본적인 실수는 하지 말자.


예제 1 (Hello Script)

vi 편집기로  vi test.sh


#!/bin/sh


echo "hello shell script"


Shift ;   wq (로 저장)


후에 chmod +x test.sh 로 실행 권한을 주어야 실행할수 있다. 



1. 주석 


#!/bin/sh


echo "hello shell script"

#bulrbulrbulrbulrbulrbulr


#은 주석을 뜻한다.



기본 예제 2(sort.sh)


sort.sh 


#!/bin/sh


cat *.txt | sort | uniq > result.txt 


모든 txt파일을 검색해서 중복을 제거하고 정렬하여 result.txt에 쓴다. 


*** > 가 1개일 경우에는 없을시에 새로 만들고 result.txt가 있을시에는 덮어 쓴다.

>가 2개인 >>의 경우에는 없을시에는 새로 만들며 result.txt가 있을시에는 파일 끝에 덧 붙인다.



기본 예제 3 (Date.sh)


#!/bin/sh


echo Date : $(date)


결과 : 


Date : Tue Jun 14 04:24:43 UTC 2016 형식으로 날짜가 출력 된다.


참고 자료 

*t mp tmp로 끝나는 파일명

*t mp * 문자열 tmp를 포함한 파일명

[a - z ] * 소문자로 시작하는 파일명

[- a- z ] * 하이픈이나 소문자로 시작하는 파일명

[a - zA- Z] * 알파벳으로 시작하는 파일명

* [0- 9] * 숫자를 포함한 파일명

[ !0- 9] * 숫자로 시작하지 않는 파일명

? ? 정확히 두 문자를 포함한 파일명

? ? * 두 개 이상의 문자를 포함한 파일명

*/ t mp 하위 디렉토리에 tmp라 명명된 파일







+ Recent posts