본문 바로가기

창고/Backup_2013_0121

[쉘스크립트] 파일의 전체경로를 입력받아 특정위치에 복사하기

반응형



주석을 잔뜩 달아놔서 아마 소스만 봐도 알수 있을 것임.

환경 HP-UX B.11.23 U ia64, korn shell

사용된 기능(?) 들

1. 조건문 if
쉘스크립트의 조건문 에서는 우리가 흔히 쓰는 비교연산자와 추가적인 문자를 쓴다.
예제 스크립트에서는 -ne ( not equal ) 을 사용하였다. 

조건식은 3가지로 나뉘는데, 파일식, 문자열식, 수식이 있다.

다음 아래는 퍼온 자료 ( 출처 -- http://www.lug.or.kr/docs/LINUX/others/10-4.htm )

파일식은 어떤 파일의 속성을 검사하는 것으로 다음과 같은 종류가 있다.

-b 파일 : 파일이 블럭 장치 파일이면 참
-c 파일 : 파일이 문자 장치 파일이면 참
-d 파일 : 파일이 디렉토리이면 참
-e 파일 : 파일이 존재하면 참
-f 파일 : 파일이 정규 파일이면 참
-L 파일 : 파일이 심볼릭 링크이면 참
-p 파일 : 파일이 네임드(named) 파이프이면 참
-S 파일 : 파일이 소켓이면 참
-r 파일 : 파일이 읽기 가능이면 참
-s 파일 : 파일의 크기가 0보다 크면 참
-w 파일 : 파일이 쓰기 가능이면 참
-x 파일 : 파일이 실행 가능이면 참
파일1 -nt 파일2 : 파일1이 파일2보다 새로운 파일이면 참
파일1 -ot 파일2 : 파일1이 파일2보다 오래된 파일이면 참
파일1 -ef 파일2 : 파일1과 파일2가 같은 파일이면 참

문자열식은 문자열에 대한 비교를 한다.

-z 문자열 : 문자열의 길이가 0이면 참
-n 문자열 : 문자일의 길이가 0이 아니면 참
문자열1 = 문자열2 : 문자열1과 문자열2가 같으면 참
문자열1 != 문자열2 : 문자열1과 문자열2가 다르면 참

수식은 숫자값을 비교한다. 양의 정수, 음의 정수, 0, 변수값이 올 수 있다.

값1 -eq 값2 : 값1 = 값2
값1 -ne 값2 : 값1 != 값2
값1 -lt 값2 : 값1 < 값2
값1 -le 값2 : 값1 <= 값2
값1 -gt 값2 : 값1 > 값2
값1 -ge 값2 : 값1 >= 값2




즉, 내가 사용한 것은 수식이다.
그리고 사용해본 결과 문자열비교시에는 -eq 관련 비교가 안되므로 = 기호를 사용해야 한다.
( 예제 스크립트에서 java 문자 여부를 알기위해
-eq 는 사용불가해서 = 를 사용하였다.

2. 인수 처리
쉘스크립트 실행시 명령행에서 연속적으로 써주는 값을 인수라고 한다. ( test.sh a b 라고 실행하면, a,b 가 인수 )
이 인수를 스크립트 내부에서 자동으로 변수에 할당해 주므로 이를 이용해서 인수값을 쓰면 된다.

예제 스크립트에서는 첫번째 인수가 저장되어 있는 $1 을 받아서 썼다.

만약 test.sh a b 라고 명령행에서 입력한다면
$1=a  $2=b 에 해당되고 더많은 인수에도 각각이 해당 된다.

추가적으로 인수를 처리할수 있는 변수가 있는데,

$# : 인수의 개수
$* : 전체 인수 ( test.sh a b 라고 실행하면 a b 가 들어 있음 )
가 된다.

3. 명령어 실행
스크립트 내부에서는 순차적으로 실행을 해가면서, 명령어를 써놓으면 그대로 실행이 된다.
가끔 실행후 정상여부를 확인하거나, 실행후 필요한 값이 리턴된다면, 그 값을 받아와야 하는데,
이때 $() 이나 ` 기호를 사용하면 된다.

예를 들어 date 명령어를 실행해서 일자를 받아와 변수에 저장하고 싶다면,
$today=$(date +%Y%m%d)
또는,
$today=`date +%Y%m%d`
로 실행하면 변수에 저장해서 사용이 가능하다.

4. 텍스트 파서
간단한 텍스트 라인을 특정기호로 파싱하고자 할때, 스크립트내부에서 ${} 를 이용하여 가능하다.
주의할점은 3의 명령어 실행은 $() - 괄호 이고 이번 텍스트 파서에서 쓰는것은 ${} - 대괄호 인 점이다.

사용법은 ${텍스트[#|%|##|%%]구분자} 이며, 구분자에는 * (와일드문자) 가 사용가능합니다.

#,% 검색방향과 규칙을 정의할때 쓰입니다.

>> 설명
#       왼쪽부터 검색하여 구분자와 처음    일치한 항목을 제외한 나머지를 반환합니다.
##      왼쪽부터 검색하여 구분자와 마지막 일치한 항목까지를 제외한 나머지를 반환합니다.
%      오른쪽부터 검색하여 구분자와 처음    일치한 항목을 제외한 나머지를 반환합니다. 
%%    오른쪽부터 검색하여 구분자와 마지막 일치한 항목까지를 제외한 나머지를 반환합니다.

왼쪽, 오른쪽이 헛갈리면 키보드를 보시면 됩니다. $ 을 사이에 두고 왼쪽에 #, 오른쪽에 % 이 있습니다.
그대로 외우시면 됩니다.

자 그럼 예제외 리턴값을 보며 익혀보면 되겠습니다.
$ TEST="abc.log.log.def"
$ echo ${TEST#*.}
log.log.def
$ echo ${TEST##*.}
def
$ echo ${TEST%.*}
abc.log.log
$ echo ${TEST%%.*}
abc

참쉽죠? -_-;;

대부분 파일명에서 확장자를 분리하기 위해서 쓰더군요..

이외 나머지 명령행 ( basename, dirname ) 은 man 을 참조하시면 되겠습니다.

궁금하신점은 언제나 리플로 질문!! -ㅁ-;

추신:: 
쉘스크립트 항목을 따로 만들려다가 프로그래밍 언어는 아니라는 판단에 리눅스 팁에 남깁니다.
앞으로도 도움되는 몇몇 명령행 프로그램이나 스크립트를 여기에 남겨볼려고 합니다~

반응형