쉘 프로그래밍을 연마하자 (2)

프로그래밍/BASH SHELL|2015. 1. 27. 10:00
반응형

[ 쉘 프로그래밍을 연마하자 (2) ] 


필자의 생각이지만 프로그래밍은 어떤 언어나 비슷한 면이 많은것 같다. 쉘 프로그래밍도 마찬가지로 다른 언어를 하나라도 익힌 사람은 아주 쉽게 익힐 수 있을 것이다. 그러면 쉘 프로그래밍 두번째를 시작하도록 하자.


* 조건문 

앞으로 익힐 if 나 while등의 구문은 모두 조건문을 달고 실행된다. C언어 에서는 조건문이라면 < , > , = 등의 기호를 이용해서 모두 간단하게 표시 할 수 있지만 본 쉘 프로그래밍 에서는 조금 까다롭다. 모든 비교문은 []안에 표시하고 [의 뒤와 ]의 앞에는 꼭 공백을 넣어야 한다. 띄여 쓰기 한번 잘 못하면 버그 잡기가 아구 골치아파진다. []의 조건에 일치하면 참 값이 되고 일치 하지 않으면 거짓이 된다.

덧붙여서 모든 조건식의 앞에 ! 를 추가하면 그 조건식의 부정이 참이 된다. 그리고 -a (and) 와 -o (or)을 이용하여 복합조건구문을 만들 수 도 있다.


- 숫자 비교. ()안에는 C언어의 예를 들었다.

[ $A -eq $B ] A와 B의 값이 같을 조건 ( A == B )
[ $A -ne $B ] A와 B의 값이 다를 조건 ( A != B )
[ $A -gt $B ] A의 값이 B보다 클 조건 ( A > B )
[ $A -lt $B ] A의 값이 B보다 작을 조건 ( A < B )
[ $A -ge $B ] A의 값이 B보다 크거나 같을 조건 ( A >= B )
[ $A -le $B ] A의 값이 B보다 작거나 같을 조건 ( A <= B )

모두 수의 크기를 비교할때 쓰이며 , 소수점 이하는 무시된다.


- 파일 비교.

[ -s filename ] file이 존재하며 크기가 0보다 큰 조건
[ -f filename ] 디렉토리의 경우를 제외한 file인 조건(크기 0 포함)
[ -w filename ] 쓰기가 가능한 조건
[ -r filename ] 읽기가 가능한 조건
[ -d directoryname] file이 아닌 디렉토리인 조건


- 문자열 비교

[ "linux" = "gnu" ] 두 문자열이 같은 조건
[ "linux" != "gnu" ] 두 문자열이 다른 조건
[ -z "linux" ] 문자열의 길이가 0 인 조건
[ -n "gnu" ] 문자열의 길이가 0 이 아닌 조건

문자열은 ""로 묶어 주어도 되고 문자열을 값으로 가지는 변수여도 된다.



* if 문


형식:

if [조건문]
then
수행할 명령어들
elif [조건문]
then
수행할 명령어들
else
수행할 명령어들
fi

if 다음에는 조건문이 따라야 하며 then 다음에 수행할 명령어들을 써주고, elif 나 else는 생략가능하다. 하지만 then 이나 fi 는 절대 생략해서는 안 된다. if 문이 끝날때는 fi를 꼭 써주어야 하며 if의 개수와 fi의 개수는 일치해야한다. 각라인을 붙여써서는 안되며 라인당 하나의 명령어만 쓰도록 한다. 위의 조건식과 더불어 if 문의 예제를 여러 개 들어본다.


----[예제3] linuxer.sh ----------------------------

#!/bin/sh

linuxer=1000000
windog=5000

if [ $linuxer -lt $windog ]
then
echo "윈도우즈 사용자 수가 더 많다"
elif [ $linuxer -eq $windog ]
then
echo "윈도우즈 사용자의수와 리눅서의 수 동일"
else
echo "리눅스 세계정복!"
fi

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

----[예제3-1] backup.sh ----------------------------

#!/bin/sh

if [ -f .bashrc ]
then
echo "File existed "
elif [ -f .bashrc.old ]
then
cp .bashrc.old .bashrc
echo "File Backup Succeed"
else
echo "Error"
fi

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

우선 .bashrc란 화일이 존재하는 지 확인한후 존재하지 않는다면 .bashrc.old 란 화일을 찾아서 있다면 카피해 놓는 프로그램이다. 백업이 아니라 백업된 것을 카피해 오는 프로그램쯤 이라고 생각하면 쉽다.



* argument의 사용




argument라 함은 ls -la profile 이라는 명령을 내렸을때 -la , profile등 각각의 인자를 말한다. 본 쉘 프로그래밍에서는 $1, $2 ,$3 등으로 각각의 argument를 사용할 수 가 있다. 위의 예를 보자면 $1="-la"가 될것이고 $2="profile" 이 될 것이다. 각 argument의 개수는 $# 이고 모든 argument는 $*로 표현한다.


----[예제3-2] iden.sh ----------------------------

#!/bin/sh

BOSS="홍길동"
BABO="이국현"

if [ $1 = $BOSS ]
then
echo "보스! 오랜만입니다!"
elif [ $1 = $BABo ]
then
echo "바보야! 오랜만이다!"
fi

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

사용예)

[errai@baboman linuxstart]$ ./iden.sh 홍길동
보스! 오랜만입니다!
[errai@baboman linuxstart]$ ./iden.sh 이국현
바보야! 오랜만이다!
[errai@baboman linuxstart]$

다음에는 for , while , until, case 구문에 대해 설명해보겠습니다. 마지막까지 열심히 해봅시다!  



반응형

'프로그래밍 > BASH SHELL' 카테고리의 다른 글

정규식 이해  (0) 2015.01.27
쉘 명령 기초  (0) 2015.01.27
쉘 프로그래밍 (shell programming)  (0) 2015.01.27
쉘 프로그래밍을 연마하자 (3)  (0) 2015.01.27
쉘 프로그래밍을 연마하자 (1)  (0) 2015.01.27

댓글()

쉘 프로그래밍을 연마하자 (1)

프로그래밍/BASH SHELL|2015. 1. 27. 10:00
반응형

[ 쉘 프로그래밍을 연마하자 (1) ]



리눅스를 사용함으로써 얻는 많은 재미중의 하나가 바로 쉘 프로그래밍이다. 쉘에 관한 내용은 이미 다른문서들을 통해서 잘 알고 있을 것이라 생각하고 생략하기로 한다. 그렇다면 쉘은 어느 정도 이해가 되었는데 쉘 프로그래밍이란 무엇인가? 간단하게 말하자면 현재 여러분이 쉘 프롬프트상에서 키보드를 통해 내리는 많은 명령어들, 그것들의 조합이 바로 쉘 프로그래밍이다.

대부분의 사람들이 쉘 프로그래밍을 처음 설명할때 DOS의 배치화일 작성과 비슷한것이라고 설명하곤 한다. 최근에 컴퓨터를 시작한 사람이라면 모를 수 도 있겠지만(DOS를 잘 모를테니), 쉘 프로그램은 별 다른 컴파일 과정을 거치지 않고 바로 명령어해석기(Bash 등)를 통해 결과값을 구하는 형식 (interpreter)의 프로그래밍언어이다. 그래서 간편하면서도 빠른 동작을 할 수 있다. 그러나 DOS의 그것과 다른점은 훨씬 강력하다는 것이다. 외국에는 쉘 프로그래머란 직업이 있을 정도이며, 각종 어플레케이션이나 cgi 등 못 만드는 프로그램이 없다고 해도 과언이 아니다. (만들 수 있다는 것이지 그것이 꼭 효율적이라는 것은 아니다)

쉘 프로그래밍으로 형성된 파일을 쉘 스크립트 라고 부른다. 이런 쉘 스크립 트 들은 리눅스,유닉스 시스템에서 광범위하게 사용된다. 부팅이나 시스템 관리및 기타설정등 여러분야에서 사용므로 만약 여러분이 시스템관리자라면 꼭 배워두어야 할 것이다. 간단한 예로 /etc/rc.d/ 아래에 있는 수많은 파일들은 모두 쉘 스크립트로 짜여진 것을 알 수 있다. (잘 모르겠는 분은 file이란 명령어 를 통해 확인해본다 ex: file <화일이름>) 파일 내부를 대충 훑어보면 무지 복 잡하게 보이고 쓸데없어 보일지도 모른다. 하지만 우리의 목표는 이런것들을 완벽하게 혹은 대충이나마 이해하는 것이다. 우리모두 쉘 프로그래밍이란 비법을 연마함으로써 한층 레벨업 된 리눅서로 도약해 보자.

처음시작할때 부터 헷갈리는 것이 있다. 쉘의 종류도 무척 다양하다. bash, csh, tcsh, ksh 등등.. 사용자의 취향마다 쓰는 쉘이 다르겠지만 여기서 우리는 가장 유명하고 많이 쓰여지는 Bash( GNU Bourne-Again SHell )을 그리고 Csh( C SHell )을 공부해 보자. csh가 계산식 같은 경우에는 편할지 모르겠지만 Bash 만큼 다양한 구문을 제공하지 않기 때문에 필자는 csh보다는 bash를 선호한다.

위에서 언급했던 /etc/rc.d/아래에 있던 파일을 다시 살펴보자. 제일 첫줄을 보면 


#!/bin/sh

라고 적혀있는 것이 보일것이다. 모든 쉘스크립트에서는 맨 첫줄에 #!<쉘의위치> 란 형식으로 이 스크립트가 어떤 쉘로 실행될 것인지 설정 해 주어야 한다. 반드시 저렇게 하지 않을수도 있지만 일반적인 기본형식이므로 지켜주도록 하자. 참고로 그냥 # 만 적어 주면 다음에 나오는 라인은 주석 이 된다.


----[예제1] hello.sh ----------------------------

#!/bin/sh
echo "Hello World~"

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

간단한 쉘 스크립트를 만들어 보자. hello.sh 를 vi 등의 에디터를 통해 완성하고 실행 퍼미션을 준 뒤에 파일을 실행시켜보자.


[marine8@baboman marine8]$ chmod a+x hello.sh
[marine8@baboman marine8]$ ./hello.sh
Hello World~
[marine8@baboman marine8]$

echo는 문자열이나 변수값등을 출력해주는 명령어이다. 여기서는 간단하게 문자열을 출력해 보았다. 명령어에 관해 자세히 알고 싶은 독자는 man page 를 통해 확인해보면 아주 자세하게 알 수 있다. 예제를 하나 더 작성해보자. 

----[예제1-2] myinfo.sh -------------------------

#!/bin/sh
echo " - This System's Environment -"
echo -n "HOSTNAME : "
echo $HOSTNAME
echo -n "USER : "
echo $USER
echo -n "NAME : "
NAME="Lee Yu Ri"
echo $NAME
echo -n "SHELL : "
echo $SHELL
echo -n "pwd : "
pwd
echo -n "ls : "
ls

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

아까 말했듯이 echo는 변수를 출력할때도 쓰인다. 쉘 프로그래밍에서 변수를 사용할때는 $를 앞에 붙이면 된다. 하지만 변수의 내용을 설정할 때는 $를 붙이지 않는다. 변수명=값 의 형식으로 하되 = 의 좌우에 공백 이 있어서는 안된다. 위에 나열된 변수중에 HOSTNAME, USER, SHELL은 환경변수값으로 시스템에 이미 정의되어있는것이고 ,NAME이란 지역변수를 하나 만들어서 등록해 본것이다. 그리고 pwd , ls의 예에서 보이듯 실행하려는 명령어는 그냥 적어주면 된다.

제1-2를 실행해 본 독자중 칼라모니터를 쓰고 뭔가 완벽함을 추구하는 분들중 마지막에 ls를 실행시켰는데 왜 칼라로 나오지 않느냐 라는 의문을 가진사람 이 있을것이다. 그런 의문을 가지지 않았다면 반성하기 바란다. :-) 사실 별내용 아니지만 설명해 보겠다. 보통 login후에 사용하는 현재의 쉘은 Login Shell로써 실행된다. Login Shell은 쉘이 실행될때 환경설정화일 (/etc/profile, ~/.profile , ~/.bashrc 등) 을 읽게 된다. 하지만 우리가 쉘 스크립트를 실행하게 되면 현재쉘말고 다른 쉘이 하나 떠서 스크립트 구문을 실행한뒤 종료되는 것이다. 그것은 당연히 Login Shell이 아니기때문에 환경설정화일 중 일부을 읽지 않게되고 그러므로 alias ls='ls --color=auto ' 이런식으로 ls 를 칼라로 보여주는 설정등이 되어있지 않은 상태로 ls가 실행되는 것이다.

그렇다면 모든 환경설정이 된 쉘로써 쉘프로그램을 실행시키고 싶으면 어떻게 해야 하는가. 아주 간단하다. 쉘 스크립트 구문에 환경설정관한 내용을 직접 적어주어 실행시키는 방법이 있겠고, 괜히 키보드 더 두드리기 싫은 사람은 맨 위에 #!/bin/sh 를 #!/bin/sh -login 이라고 바꿔줘서 실행하면 Login Shell형식 으로 쉘이 뜨기 때문에 환경설정파일들을 포함시키게 되고 되고 우리는 ls화면을 칼라로 볼수 있게 될거라고 확신하게 된다.

그러나 여기서 위에 적은 대로 바꾸어 실행하더라도 결과는 이전과 같은 것을 볼 수 있다. 그것은 Bash Script는 alias로 설정된 것은 쓸 수가 없기 때문이다. csh같은 경우에는 alias로 설정한 것도 script상에서 쓸 수 있지만 bash는 쓸 수 없다. 그러나 Bash에서는 csh에서는 지원하지 않는 함수기능을 지원한다. 즉 alias의 기능을 포함하면서도 더욱 강력하게 쓸 수 있는 것이다. 아래의 예제 1-3처럼 하면 될것이다.


----[예제1-3] myinfo2.sh --------------------------

#!/bin/sh
ll()
{
ls --color=auto
}

echo " - This System's Environment -"
echo -n "HOSTNAME : "
echo $HOSTNAME
echo -n "USER : "
echo $USER
echo -n "NAME : "
NAME="LEE YU REE"
echo $NAME
echo -n "SHELL : "
echo $SHELL
echo -n "pwd : "
pwd
echo -n "ls : "
ll

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


----[예제2] read.sh -------------------------------

#!/bin/sh
echo -n "당신의 이름은? "
read name
echo -n "당신의 나이는? "
read age

echo 이름 : $name
echo 나이 : $age

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

예제2는 read 명령을 이용해서 키보드로부터 값을 읽어드린후 그 값을 변수에 저장하고 출력해보는 것이다.

지금까지 쉘 프로그래밍에 대한 기초적인 것들을 알아 보았다. 미흡하나마 이 글이 여러분께 도움이 되었기를 빌며 다음에는 본격적으로 Bash 문법을 공부해 보기로 하자  



반응형

'프로그래밍 > BASH SHELL' 카테고리의 다른 글

정규식 이해  (0) 2015.01.27
쉘 명령 기초  (0) 2015.01.27
쉘 프로그래밍 (shell programming)  (0) 2015.01.27
쉘 프로그래밍을 연마하자 (3)  (0) 2015.01.27
쉘 프로그래밍을 연마하자 (2)  (0) 2015.01.27

댓글()

[JavaScript] 링크 클릭시 특정 주소 클립보드로 복사

반응형
테스트<-- 출력된 테스트를 클릭하면 주소가 자동으로 복사되어서 붙여넣기 하면 되는  소스.
버튼식이 아닌 텍스트 방식, 클릭시 "복사되었습니다" 이런 창도 뜨는.
 
<script language="JavaScript">
function copy_clip(strData) {
clipboardData.setData("Text", strData);
alert("클립보드로 복사되었습니다.");}
</script>
<a href="javascript:copy_clip('http://www.naver.com');">주소</a>

그 외에
 
<script language="JavaScript">
function toclip(strData)
{
var clip = document.body.createTextRange();
clip.moveToElementText(document.all(strData));
clip.select();
clip.execCommand('copy');
alert("클립보드로 복사되었습니다.");
}
</script>
<a href="javascript:toclip('url_1')">주소</a>
<span id='url_1' style="visibility:hidden;overflow:hidden;">http://www.naver.com</span>

주소는 보이지 않게해서 복사만 되는 소스
 
<script language="JavaScript">
function hideStatus()
{
len = document.links.length;
for(var i=0;i
<body onload="hideStatus();">
 
하시면 상태창에 표시되는 글이 없습니다.

 


반응형

댓글()

[html] 도메인 포워딩 소스

반응형

index.htm 파일에 아래 한 줄만 넣어줍니다.

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=http://docu.tistory.com">

반응형

댓글()

[html] 페이지 열때마다 이미지가 랜덤하게 바뀌는 소스

반응형

1)  <head> 와  </head> 사이에 이 소스 넣으시구요...
--------------------------------------------------------------------
<script language="JavaScript">
<!--
function random(n) {
        return (Math.floor(Math.random()*100000)%6);
}
// -->
</script>
---------------------------------------------------------------------

2)  <body> 부분에서 이미지 넣을 부분에 <img src> 테크 대신에 이걸 넣으세요.....
---------------------------------------------------------------------
<script language="JavaScript">
     document.write( '<img src="이미지 경로/파일이름_0'+random(랜덤할이미지갯수)+'.확장자" width="이미지가로크기" height="이미지세로크기" border="0">');
    </script>
---------------------------------------------------------------------

위의 소스에서 빨간 부분만 고쳐서 사용하세요...

예를 들어....
images 폴더 아래의 main_image0.jpg 부터 main_image6.jpg 까지 6개의 파일을 
랜덤으로 돌리실꺼라면... 

images/main_image0'+random(6)+'.jpg

이렇게 고시치면 되겠죠....


[출처] ??

반응형

댓글()