현재 위치 - 주공해몽공식사이트 - 랜덤 번호 뽑기 점술 - 셸 스크립트 작성 방법

셸 스크립트 작성 방법

셸 스크립트 작성 방법

이 문서에서는 쉘 스크립트를 작성하는 방법에 대해 많은 예를 제공합니다.

왜 쉘 프로그래밍을 해야 합니까?

Linux 시스템에서는 다양한 그래픽 인터페이스 도구가 있지만 sell 은 여전히 매우 유연한 도구입니다. 셸은 명령의 집합일 뿐만 아니라 위대한 프로그래밍 언어이기도 하다. 셸을 사용하여 많은 작업을 자동화할 수 있습니다. 셸은 시스템 관리 작업, 특히 사용 편의성, 서비스 용이성, 이식성이 효율성보다 더 중요한 작업에 특히 능숙합니다.

셸이 어떻게 작동하는지 살펴 보겠습니다.

스크립트를 생성합니다

Linux 에는 여러 가지 셸이 있지만 일반적으로 bash (bourne 및 shell) 를 사용하여 셸 프로그래밍을 수행합니다. bash 는 무료이고 사용하기 쉽기 때문입니다. 따라서 이 문서에서 작성자가 제공한 스크립트는 모두 bash 를 사용하지만, 대부분의 경우 bash 의 큰언니인 ——bourne shell 에서도 실행할 수 있습니다.

다른 언어와 마찬가지로 nedit, kedit, emacs, VI 와 같은 텍스트 편집기를 사용할 수 있습니다.

우리의 쉘 프로그램을 쓰길 기다리고 있다.

프로그램은 다음 줄로 시작해야 합니다 (파일의 첫 번째 줄에 있어야 함).

#! /bin/sh

기호 #! 다음 매개변수가 파일을 실행하는 데 사용되는 프로그램을 시스템에 알리는 데 사용됩니다. 이 예에서는 /bin/sh 를 사용하여 프로그램을 실행합니다.

스크립트를 편집할 때 스크립트를 실행하려면 스크립트를 실행 가능하게 만들어야 합니다.

스크립트를 실행 가능하게 만들려면 다음을 수행합니다.

Chmod +x 파일 이름

그런 다음 다음을 입력하여 다음을 입력할 수 있습니다. /파일 이름.

주다주석을 달다

셸 프로그래밍에서 # 으로 시작하는 문장은 본 줄이 끝날 때까지 주석을 나타낸다. 프로그램에서 주석을 사용하는 것이 좋습니다. 주석을 사용하면 스크립트를 오랫동안 사용하지 않아도 짧은 시간 안에 스크립트의 기능과 작동 원리를 이해할 수 있다.

가변적

다른 프로그래밍 언어에서 변수를 사용해야 합니다. 셸 프로그래밍에서 모든 변수는 문자열로 구성되므로 변수를 선언할 필요가 없습니다. 변수에 값을 지정하려면 다음을 쓸 수 있습니다.

변수 이름 = 값

변수 값을 꺼낼 때 변수 앞에 달러 기호 ($) 를 넣을 수 있습니다.

#! /bin/sh

# 변수에 값 지정:

A = "헬로 월드"

# 이제 변수 a 의 내용을 인쇄합니다.

에코 "A 는:"

Echo $a

편집기에 위 내용을 입력하고 먼저 파일로 저장합니다. 그런 다음 먼저 chmod +x 를 실행합니다.

실행할 수 있게 하고, 결국 들어가다. /먼저 스크립트를 실행합니다.

이 스크립트는 다음을 출력합니다.

하나는 다음과 같습니다.

안녕, 세상

변수 이름은 다음과 같은 다른 단어와 쉽게 혼동될 수 있습니다.

수량 =2

에코 "이것은 $numnd" 입니다

이렇게 하면 "이것은 2 번" 이 인쇄되지 않고 "예" 만 인쇄됩니다. 셸은 numnd 변수의 값을 검색하지만 이 변수에는 값이 없기 때문입니다. 중괄호를 사용하여 num 변수를 인쇄하고자 한다고 셸에 알릴 수 있습니다.

수량 =2

에코 "이것은 $ {num} 번째입니다."

이것은 인쇄 될 것입니다: 이것은 두 번째입니다.

시스템에서 자동으로 설정하는 변수는 여러 가지가 있습니다. 나중에 이러한 변수를 사용할 때 설명합니다.

수학 표현식을 처리해야 하는 경우 expr 과 같은 프로그램을 사용해야 합니다 (아래 참조).

프로그램 내에서만 유효한 일반 쉘 변수 외에도 환경 변수가 있습니다. Export 키워드로 처리되는 변수를 환경 변수라고 합니다. 환경 변수는 일반적으로 로그인 스크립트에서만 사용되기 때문에 논의하지 않습니다.

셸 명령 및 프로세스 제어

셸 스크립트에서 다음 세 가지 유형의 명령을 사용할 수 있습니다.

1) 유닉스 명령:

셸 스크립트에서 임의의 UNIX 명령을 사용할 수 있지만 비교적 자주 사용하는 명령이 있습니다. 이러한 명령은 일반적으로 파일 및 텍스트 작업에 사용됩니다.

자주 사용하는 명령의 구문 및 기능

일부 텍스트 반향: 화면에 텍스트 내용을 인쇄합니다.

Ls: 파일 리스트

Wc -l filewc -w filewc -c 파일: 파일의 행 수 계산, 파일의 단어 수 계산, 파일의 문자 수 계산.

Cp 소스 파일 destfile: 파일 사본

파일 이름을 바꾸거나 파일을 이동합니다.

Rm 파일: 파일 삭제

Grep 'pattern' file: 파일에서 문자열을 검색합니다 (예: grep 'searchstring' file.txt)

Cut -b colnum file: 표시할 파일 컨텐츠 범위를 지정하고 표준 출력 장치로 출력합니다 (예: 행당 5-9 번째 문자 출력). Cut -b5-9 file.txt 는 완전히 다른 두 명령인 cat 명령과 혼동해서는 안 됩니다.

Cat file.txt: 파일 내용을 표준 출력 장치 (화면) 로 출력합니다.

File somefile: 파일 형식 가져오기

Var 읽기: 사용자에게 입력을 요청하고 입력을 변수에 할당합니다.

File.txt 정렬: file.txt 파일의 행을 정렬합니다.

Uniq: sort file.txt | uniq 와 같이 텍스트 파일에 나타나는 행과 열을 삭제합니다.

Expr: 수학 계산 수행 예: 2 와 3 expr2 "+"3 을 더합니다.

찾기는 파일을 검색합니다 (예: 파일별 찾기 검색 찾기). -이름 파일 이름-인쇄.

Tee: 데이터를 somecommand | tee outfile 과 같은 표준 출력 장치 (화면) 및 파일로 출력합니다.

Basename file: 경로가 없는 파일 이름을 반환합니다. 예를 들어 basename /bin/tux 는 tux 를 반환합니다.

Dirname file: 파일이 있는 경로를 반환합니다. 예를 들어 dirname /bin/tux 는 /bin 을 반환합니다.

헤더 파일: 텍스트 파일의 처음 몇 줄을 인쇄합니다.

꼬리 파일: 텍스트 파일의 마지막 몇 줄을 인쇄합니다.

Sed: Sed 는 기본적인 찾기 및 바꾸기 프로그램입니다. 명령 파이프와 같은 표준 입력에서 텍스트를 읽고 그 결과를 표준 출력 (화면) 으로 출력할 수 있습니다. 이 명령은 정규식 (참조 참조) 을 사용하여 검색합니다. 셸의 와일드카드 문자와 혼동하지 마십시오. 예를 들어 linuxfocus 를 LinuxFocus: cattext.file | sed 의/linuxfocus/linuxfocus/'> newtext.file 로 바꿉니다

Awk: awk 는 텍스트 파일에서 필드를 추출하는 데 사용됩니다. 기본적으로 필드 구분 기호는 공백이며 -F 를 사용하여 다른 구분 기호를 지정할 수 있습니다. 고양이 파일. Txt | awk-f,' {print $ 1',' $3}' 여기서 필드 구분 기호로 사용되어 첫 번째와 세 번째 필드를 모두 인쇄합니다. 파일 내용이 Adam Bor, 34, IndiaKerry Miller, 22, USA command 인 경우 출력은 Adam Bor, India Kerry Miller, USA 입니다.

2) 개념: 파이프, 리디렉션 및 backlog.

이것들은 시스템 명령이 아니지만, 그것들은 정말 중요하다.

파이프 (|) 는 한 명령의 출력을 다른 명령의 입력으로 사용합니다.

Grep "hello" file.txt | WC -l

File.txt 에서 "hello" 가 포함된 행을 검색하여 행 수를 계산합니다.

여기서 grep 명령의 출력은 WC 명령의 입력으로 사용됩니다. 물론 여러 명령을 사용할 수 있습니다.

이동: 명령 결과를 표준 출력 (화면) 대신 파일로 출력합니다.

& gt 파일을 쓰고 이전 파일을 덮어씁니다.

& gt& gt 는 파일 끝에 추가되며 이전 파일의 내용을 유지합니다.

역슬래쉬

백슬래시를 사용하여 한 명령의 출력을 다른 명령의 명령행 인수로 사용합니다.

명령:

찾았습니다. -mtime-1 형 f -print

지난 24 시간 동안 수정된 파일을 찾는 데 사용됩니다 (-mtime–2 는 지난 48 시간을 나타냄). 찾은 모든 파일을 패키지화하려면 다음 스크립트를 사용할 수 있습니다.

#! /bin/sh

# 토큰은 일반 따옴표 (') 가 아닌 역부호 (`) 입니다.

타르 -zcvf lastmod.tar.gz' 발견. -mtime-1 유형 f-인쇄 ` 유형

3) 프로세스 제어

"if" 표현식 조건이 참인 경우 다음 섹션을 수행합니다.

만약 ...; 그리고 나서

....

그렇지 않으면 ...; 그리고 나서

....

기타

....

선측은 화물 적재 비용을 부담하지 않습니다

대부분의 경우 테스트 명령을 사용하여 조건을 테스트할 수 있습니다. 예를 들어 문자열을 비교하여 파일이 있는지, 읽을 수 있는지 등을 확인할 수 있습니다.

일반적으로 "[]" 는 조건 테스트를 나타내는 데 사용됩니다. 여기 공백에주의를 기울이는 것이 중요합니다. 대괄호 안의 공백을 확인합니다.

[-f "somefile"]: 문서인지 여부를 결정합니다.

[-x "/bin/ls"]: /bin/ls 가 있는지, 실행 권한이 있는지 확인합니다.

[-n "$var"]: $var 변수에 값이 있는지 확인합니다.

["$a" = "$b"]: $a 와 $b 가 같은지 여부를 결정합니다.

Man test 를 실행하여 모든 테스트 표현식이 비교 및 판단할 수 있는 유형을 확인합니다.

다음 스크립트를 직접 실행합니다.

#! /bin/sh

If ["$ shell" = "/bin/bash"]; 그리고 나서

Echo "로그인 셸은 bash (bourne again shell)" 입니다

기타

Echo "로그인 셸은 bash 가 아니라 $ 쉘입니다."

선측은 화물 적재 비용을 부담하지 않습니다

변수 $ 셸에는 로그인 셸의 이름이 포함되어 있으며 /bin/bash 와 비교했습니다.

바로 가기 연산자

C 언어에 익숙한 친구들은 다음과 같은 표현을 좋아할 수 있습니다.

[-f "/etc/shadow"] & & ampecho "이 컴퓨터는 그림자 암호를 사용합니다."

여기 & amp;; 바로 가기 연산자입니다. 왼쪽 표현식이 참인 경우 오른쪽 문을 실행합니다. 논리적 연산에서 AND 연산으로 생각할 수도 있습니다. 위 예에서 /etc/shadow 파일이 있으면 "이 컴퓨터는 그림자 암호를 사용합니다." 가 표시됩니다. 동일한 OR 작업 (| |) 을 셸 프로그래밍에도 사용할 수 있습니다. 여기 한 가지 예가 있습니다.

#! /bin/sh

Mailfolder =/var/spool/mail/James

[-[-r "$ mail folder "]“{ echo" 는 $ mail folder "를 읽을 수 없습니다. 수출1; }

Echo "$mailfolder 메일 출처: "

Grep "^from" $ 메일 폴더

이 스크립트는 먼저 mailfolder 를 읽을 수 있는지 여부를 결정합니다. 읽을 수 있는 경우 파일의 "시작" 행을 인쇄합니다. 읽을 수 없는 경우 OR 작업이 적용되고 오류 메시지를 인쇄한 후 스크립트가 종료됩니다. 여기에 한 가지 문제가 있습니다. 우리는 두 가지 주문을 해야 합니다.

-오류 메시지를 인쇄합니다

-프로그램 종료

우리는 중괄호를 사용하여 두 개의 명령을 익명 함수로 하나로 묶었습니다. 다음은 일반적인 기능에 대한 설명입니다.

And 및 or 연산자가 없으면 if 표현식에 대해 아무 것도 할 수 있지만 AND 또는 OR 연산자를 사용하는 것이 훨씬 편리합니다.

Case 표현식을 사용하여 숫자가 아닌 지정된 문자열을 일치시킬 수 있습니다.

상황 ...

...) 여기서 뭐 좀 해; 을 눌러 섹션을 인쇄할 수도 있습니다

Environmental systems applications center 환경 시스템 애플리케이션 센터

예를 하나 들어보죠. File 명령은 지정된 파일의 파일 유형을 인식합니다. 예를 들면 다음과 같습니다.

Lf.gz 파일

이렇게 하면 다음이 반환됩니다.

Lf.gz: gzip 압축 데이터, 축소, 원본 파일 이름,

최종 수정일: 2006 년 8 월 27 일 월요일 23:09: 18

Bzip2, gzip 및 zip 유형의 압축 파일을 자동으로 추출할 수 있는 smartzip 이라는 스크립트를 작성합니다.

#! /bin/sh

Ftype = `file' $1"` 0

사례 "$ftype" 은

"$ 1: Zip 아카이브" *)

$1'의 압축을 풉니다. 을 눌러 섹션을 인쇄할 수도 있습니다

"$ 1: gzip compressed"*)

Gunzip "$1"; 을 눌러 섹션을 인쇄할 수도 있습니다

"$ 1: bzip2 compressed"*)

Bunzip2 "$1"; 을 눌러 섹션을 인쇄할 수도 있습니다

*) 오류 "파일 $ 1 smartzip 으로 압축을 풀 수 없습니다."; 을 눌러 섹션을 인쇄할 수도 있습니다

Environmental systems applications center 환경 시스템 애플리케이션 센터

여기서 특별한 변수 $ 1 을 사용했다는 것을 알 수 있습니다. 이 변수에는 프로그램에 전달된 첫 번째 매개변수 값이 포함되어 있습니다. 즉, 우리가 실행할 때:

Smartzip articles.zip

$1은 articles.zip 문자열입니다

Select expression 은 bash 의 확장 어플리케이션으로, 특히 대화형 사용에 능숙합니다. 서로 다른 값 세트에서 선택할 수 있습니다.

변수 선택 위치 ...; 하다

파열

완성

... 이제 $var 를 사용할 수 있습니다 ....

여기 한 가지 예가 있습니다.

#! /bin/sh

에코 "좋아하는 운영 체제는 무엇입니까? 클릭합니다

Linux”“Gnu Hurd”“Free BSD 기타에서 var 을 선택합니다

파열

완성

"$var 을 선택하셨습니다" 를 반향합니다

스크립트 실행 결과는 다음과 같습니다.

가장 좋아하는 운영 체제는 무엇입니까?

1) 리눅스

2) Gnu 허드

3) 무료 BSD

4) 기타

#? 1

Linux 를 선택하셨습니다

셸에서 다음 루프 표현식을 사용할 수도 있습니다.

안에 ... 기간 ...; 하다

....

완성

While-loop 은 표현식 테스트가 true 가 될 때까지 계속 실행됩니다. 우리가 테스트한 표현식이 참일 때 실행됩니다. 키워드 "break" 는 루프에서 벗어나는 데 사용됩니다. 키워드 "continue" 는 나머지 부분을 수행하지 않고 다음 루프로 건너뛰는 데 사용됩니다.

For 루프 표현식은 문자열 목록 (공백으로 구분된 문자열) 을 보고 변수에 할당합니다.

변화를 위해서 ...; 하다

....

완성

다음 예에서 ABC 는 각각 화면에 인쇄됩니다.

#! /bin/sh

B C 에서 변경하는 데 사용됩니다. 하다

에코' varis $ var'

완성

다음은 일부 RPM 패키지에 대한 통계를 인쇄하는 데 유용한 스크립트인 showRPM 입니다.

#! /bin/sh

# 일부 RPM 패키지의 내용 요약 나열

# 사용법: showrpm rpm 파일1rpm 파일 2 ...

# 예: showrpm /cdrom/RedHat/RPMS/*. 분당 회전수

$ * 의 rpmpackage 에 대해 다음을 수행합니다

If[-r "$ rpmpackage "];]; 그리고 나서

Echo "= = = = = = = = = = = = = = = = $ rpm package = = = = = = = = = = = = = = = = = = = = = =" 입니다

Rpm-qi-p $ rpm 패키지

기타

Echo "오류: $rpmpackage" 파일을 읽을 수 없습니다

선측은 화물 적재 비용을 부담하지 않습니다

완성

두 번째 특수 변수인 $ * 가 여기에 나타나고 모든 입력 명령줄 인수 값이 포함됩니다. Showrpm OpenSSH 를 실행하는 경우. Rpmw3m.rpmwebgrep.rpm

$ * 에는 OpenSSH 라는 세 개의 문자열이 포함됩니다. Rpm, W3M 입니다. Rpm 및 웹 grep. 회전 속도.

인용

프로그램에 인수를 전달하기 전에 프로그램에서 와일드 카드와 변수를 확장합니다. 여기서 확장명이란 프로그램에서 와일드카드 문자 (예: *) 를 적절한 파일 이름으로 대체하고 다른 변수는 변수 값으로 대체하는 것을 말합니다. 프로그램이 이러한 교체를 하지 않도록 따옴표를 사용할 수 있습니다. 예를 들어 현재 디렉토리에 몇 개의 파일, 두 개의 jpg 파일, mail.jpg 및 tux.jpg 가 있다고 가정해 보겠습니다.

#! /bin/sh

에코 *. Jpeg 파일 교환 형식으로 저장된 인코딩된 이미지 파일 확장자

이렇게 하면 "mail.jpg tux.jpg" 의 결과가 인쇄됩니다.

따옴표 (작은따옴표와 큰따옴표) 를 사용하면 와일드카드 확장이 방지됩니다.

#! /bin/sh

에코 "*. Jpg'

에코 *. Jpg'

이렇게 하면' *' 가 인쇄됩니다. Jpg' 를 두 번 클릭합니다.

작은따옴표가 더 엄격합니다. 모든 변수가 확대되는 것을 막을 수 있습니다. 큰따옴표는 와일드카드 확장을 방지하지만 변수 확장을 허용합니다.

#! /bin/sh

Echo $SHELL

에코 "$SHELL"

에코' $ 셸'

실행 결과는 다음과 같습니다.

/bin/bash

/bin/bash

$ 셸

마지막으로, 이 확장을 막을 수 있는 또 다른 방법은 이스케이프 문자인 대각선을 사용하는 것입니다.

에코 *. Jpeg 파일 교환 형식으로 저장된 인코딩된 이미지 파일 확장자

Echo $SHELL

이렇게 하면 다음과 같이 출력됩니다.

*. JPEG 파일 교환 형식으로 저장된 인코딩된 이미지 파일 확장자

$ 셸

여기 문서

여기서 documents 는 명령에 몇 줄의 텍스트를 전달하는 좋은 방법입니다. 각 극본에 도움이 되는 글을 쓰는 것은 매우 유용하다. 이때, 만약 우리가 그 here 문서를 가지고 있다면, echo 함수를 사용하여 한 줄씩 출력할 필요가 없다. "여기 문서" 는

#! /bin/sh

# 우리는 세 가지 논점 미만이다. 도움말 텍스트 인쇄:

If [$ #-lt3]; 그리고 나서

Cat<& lt 도움말

Ren-sed 정규식을 사용하여 여러 파일의 이름을 바꿉니다

사용법: ren 'regexp' 'replacement' 문서 ...

예: 모든 * 이름 바꾸기. HTM 파일은 * 에 있습니다. Html:

HTM$' 'html' * 을 맡다. Html 파일의 접미사

도움

출구 0

선측은 화물 적재 비용을 부담하지 않습니다

OLD="$ 1 "

NEW="$2 "

Shift 명령은 리스트에서 매개변수를 제거합니다

# 명령행 스위치.

변화

변화

# $ * 이제 모든 파일이 포함됩니다.

$ * 에 있는 파일의 경우 : 하다

If[-f "$ file "];]; 그리고 나서

New file = `echo "$ file" | sed "s/$ {old}/$ {new}/g" `1

If[-f "$ new file "];]; 그리고 나서

Echo "오류: $newfile 이 이미 있습니다."

기타

"$file 을 $newfile 로 이름 변경 ..." 을 반향합니다

Mv "$file" "$newfile "

선측은 화물 적재 비용을 부담하지 않습니다

선측은 화물 적재 비용을 부담하지 않습니다

완성

이것은 더 복잡한 예입니다. 아래에서 자세히 토론합시다. 첫 번째 if 표현식은 입력 명령행 인수가 3 보다 작은지 여부를 결정합니다 (매개변수 수를 나타내는 특수 변수 $ #). 입력 매개변수가 3 보다 작으면 도움말 텍스트가 cat 명령에 전달되고 cat 명령에 의해 화면에 인쇄됩니다. 도움말 텍스트를 인쇄한 후 프로그램이 종료됩니다. 입력 매개변수가 3 보다 크거나 같으면 첫 번째 매개변수는 OLD 변수에, 두 번째 매개변수는 NEW 변수에 지정합니다. 다음으로 shift 명령을 사용하여 매개변수 리스트에서 첫 번째와 두 번째 매개변수를 제거하여 원래의 세 번째 매개변수가 매개변수 리스트 $ * 의 첫 번째 매개변수가 되도록 합니다. 그런 다음 루프를 시작하고 명령줄 인수 목록이 $file 변수에 하나씩 할당됩니다. 그런 다음 파일이 있는지 확인하고 있는 경우 검색하고 sed 명령으로 대체하여 새 파일 이름을 생성합니다. 그런 다음 백슬래시의 명령 결과를 newfile 에 할당합니다. 이렇게 우리는 목적을 달성했다: 우리는 오래된 파일 이름과 새 파일 이름을 얻었다. 그런 다음 mv 명령을 사용하여 이름을 바꿉니다.

기능

좀 더 복잡한 프로그램을 쓰면, 프로그램의 여러 곳에서 같은 코드를 사용할 수 있다는 것을 알게 될 것이고, 우리가 함수를 사용한다면 훨씬 더 편리할 것이다. (존 F. 케네디, 공부명언) 함수는 다음과 같습니다.

함수 이름 ()

{

# 함수 본문 $ 1 에서 함수의 첫 번째 매개 변수입니다

# $2 초 ...

}

각 프로그램의 시작 부분에서 이 함수를 선언해야 합니다.

다음은 터미널 창의 이름을 변경할 수 있는 xtitlebar 라는 스크립트입니다. 여기에 헬프라는 함수가 사용되었습니다. 보시다시피 이 정의의 함수는 두 번 사용되었습니다.

#! /bin/sh

# vim: set sw=4 ts=4 et:

도움말 ()

{

Cat<& lt 도움말

Xterm, gnome 터미널 또는 kde konsole 의 이름을 수정합니다

사용법: xtitlebar [-h] "string _ for _ titelbar"

옵션: -h 도움말 텍스트

예: xtitlebar“CVS "

도움

출구 0

}

# 오류가 발생하거나 -h 가 지정된 경우 help 함수를 호출합니다.

[-z "$1"] & & amp 도움말

["$1"= "-h"] & & amp 도움말

# 이스케이프 시퀀스를 전송하여 xterm titelbar 변경:

Echo-e "33] 0; $ 107 "

#

스크립트에 도움을 주는 것은 다른 사용자 (및 사용자) 가 스크립트를 쉽게 사용하고 이해할 수 있도록 하는 좋은 프로그래밍 습관입니다.

명령줄 인수

$ * 및 $ 1, $2...$9 와 같은 특수 변수를 보았습니다. 이러한 특수 변수에는 사용자가 명령줄에서 입력한 매개변수가 포함되어 있습니다. 지금까지 몇 가지 간단한 명령줄 구문 (예: 일부 필수 매개변수 및 도움말을 보는 -h 옵션) 만 배웠습니다. 그러나 더 복잡한 프로그램을 작성할 때 더 많은 사용자 정의 옵션이 필요하다는 것을 알 수 있습니다. 일반적인 방법은 모든 선택적 매개변수 앞에 빼기 기호를 추가하고 그 뒤에 매개변수 값 (예: 파일 이름) 을 추가하는 것입니다.

입력 매개변수를 분석하는 방법에는 여러 가지가 있지만 다음은 case 표현식을 사용하는 좋은 예입니다.

#! /bin/sh

도움말 ()

{

Cat<& lt 도움말

이것은 일반적인 명령줄 파서 데모입니다.

사용법 예: cmd parser-l hello-f-some file1some file 2

도움

출구 0

}

While [-n "$1"]; 하다

사례 $ 1 인치

도움말; Shift1; 을 눌러 섹션을 인쇄할 수도 있습니다 # 함수 도움말 호출

-f) opt _ f =1; Shift1; 을 눌러 섹션을 인쇄할 수도 있습니다 # 변수 opt_f 가 설정되었습니다

-l) opt _ l = $2; 교대 2 을 눌러 섹션을 인쇄할 수도 있습니다 # -l 하나의 매개변수 허용-> 이동 2

-) 시프트 깨뜨리다 을 눌러 섹션을 인쇄할 수도 있습니다 # 옵션 끝

-*) echo "오류: $ 1 옵션이 없습니다. -h 는 도움을 의미합니다. " 수출1; 을 눌러 섹션을 인쇄할 수도 있습니다

*) 깨진; 을 눌러 섹션을 인쇄할 수도 있습니다

Environmental systems applications center 환경 시스템 애플리케이션 센터

완성

Echo“opt _ f 는 $opt_f "입니다

Echo“opt _ l 은 $opt_l "입니다

Echo "첫 번째 인수는 $ 1" 입니다

Echo "두 번째 매개 변수는 $2" 입니다

다음과 같이 스크립트를 실행할 수 있습니다.

Cmd parser-l hello-f--some file1some file 2

반환된 결과는 다음과 같습니다.

Opt_f 는 1 입니다

Opt_l 은 헬로입니다

첫 번째 매개변수는 -somefile 1 입니다

두 번째 매개변수는 somefile2 입니다

이 스크립트는 어떻게 작동합니까? 스크립트는 먼저 모든 입력 명령행 인수를 반복하고, 입력 인수를 case 표현식과 비교하며, 변수를 설정하고, 일치하는 경우 매개변수를 삭제합니다. 유닉스 시스템에서는 마이너스 기호가 포함된 매개변수를 먼저 입력해야 합니다.

일반 프로그래밍 단계

이제 대본을 쓰는 일반적인 단계를 논의해 보겠습니다. 모든 우수한 스크립트에는 도움말 및 입력 매개변수가 있어야 합니다. 그리고 유사 스크립트 (framework.sh) 를 작성하는 것은 대부분의 스크립트에 필요한 프레임워크 구조를 포함하는 좋은 아이디어입니다. 이 시점에서 새 스크립트를 작성할 때 copy 명령만 실행하면 됩니다.

Cp framework.sh myscript

그런 다음 자체 함수를 삽입하십시오.

두 가지 예를 더 살펴 보겠습니다.

이진에서 십진수로 변환

스크립트 b2d 는 바이너리 (예: 1 10 1) 를 해당 10 진수로 변환합니다. 또한 expr 명령을 사용한 수학 연산의 예입니다.

#! /bin/sh

# vim: set sw=4 ts=4 et:

도움말 ()

{

Cat<& lt 도움말

B2h-이진을 십진수로 변환합니다

사용법: b2h [-h] binarynum

옵션: -h 도움말 텍스트

예: b2h111010

58 이 반환됩니다

도움

출구 0

}

오류 ()

{

# 인쇄 오류 및 종료

에코 "$1"

1 호 출구

}

Lastchar ()

{

# $rval 에 있는 문자열의 마지막 문자를 반환합니다

If [-z "$1"]; 그리고 나서

# 빈 문자열

Rval= ""

돌아오다

선측은 화물 적재 비용을 부담하지 않습니다

# WC 는 출력 뒤에 약간의 공간을 남겨 두고 있습니다. 이것이 바로 sed 가 필요한 이유입니다.

Numofchar =' echo-n' $1"| WC-c | sed' s///g' `1

# 이제 마지막 문자 제거

Rval =' echo-n "$1"| cut-b $ numofchar'

}

참수 ()

{

# 문자열의 마지막 문자를 삭제하고 $rval 에 반환합니다

If [-z "$1"]; 그리고 나서

# 빈 문자열

Rval= ""

돌아오다

선측은 화물 적재 비용을 부담하지 않습니다

# WC 는 출력 뒤에 약간의 공간을 남겨 두고 있습니다. 이것이 바로 sed 가 필요한 이유입니다.

Numofchar =' echo-n' $1"| WC-c | sed' s///g' `1

If ["$ numofchar" = "1"]; 그리고 나서

# 문자열에 한 문자만 있습니다

Rval= ""

돌아오다

선측은 화물 적재 비용을 부담하지 않습니다

Numofchar MINUS1=' expr $ numofchar'-"1'

# 이제 마지막 문자를 제외한 모든 문자를 삭제합니다.

Rval =' echo-n' $1"| cut-B0-$ {numofchar MINUS1} `/kloc-

}

While [-n "$1"]; 하다

사례 $ 1 인치

도움말; Shift1; 을 눌러 섹션을 인쇄할 수도 있습니다 # 함수 도움말 호출

-) 시프트 깨뜨리다 을 눌러 섹션을 인쇄할 수도 있습니다 # 옵션 끝

-*) 오류: $ 1 옵션이 없습니다. -h 는 도움을 의미합니다. " 을 눌러 섹션을 인쇄할 수도 있습니다

*) 깨진; 을 눌러 섹션을 인쇄할 수도 있습니다

Environmental systems applications center 환경 시스템 애플리케이션 센터

완성

# 주 프로그램

합계 =0

무게 = 1

# 매개변수를 지정해야 합니다.

[-z "$1"] & & amp 도움말

Binnum="$ 1 "

Binnumorig="$ 1 "

While[-n "$ binnum "];]; 하다

Lastchar "$binnum "

If ["$ rval" = "1"]; 그리고 나서

Sum =' expr' $ weight'+'$ sum' `

선측은 화물 적재 비용을 부담하지 않습니다

# $binnum 의 마지막 위치 삭제

도장 "$binnum"

Binnum="$rval "

Weight = `expr "$ weight" "*" 2'

완성

Echo "이진 $binnumorig 는 십진수 $sum"

#

스크립트에 사용되는 알고리즘은 이진 "1 0" 과 같은 십진수 및 이진 가중치 (1,2,4,8, 16, ...) 를 사용하는 것입니다

0 * 1+1 * 2 = 2

이진수를 얻기 위해 lastchar 함수를 사용합니다. 이 함수는 WC–c 를 사용하여 문자 수를 계산한 다음 cut 명령을 사용하여 마지막 문자를 제거합니다. Chop 함수는 마지막 문자를 삭제하는 것입니다.

파일 순환 프로그램

보낸 모든 메일을 한 파일에 저장하고자 하는 사람 중 한 명일 수도 있지만, 몇 달 후에는 파일이 너무 커져서 파일 액세스 속도가 느려질 수 있습니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 문서명언) 다음 스크립트인 rotatefile 은 이 문제를 해결할 수 있습니다. 이 스크립트는 메시지 저장 파일 (outmail 이라고 가정) 의 이름을 outmail. 1 으로 바꾸고 outmail. 1 의 경우 outmail.2 등으로 바꿀 수 있습니다. ...

#! /bin/sh

# vim: set sw=4 ts=4 et:

Ver="0. 1 "

도움말 ()

{

Cat<& lt 도움말

Rotatefile-회전 파일 이름

사용법: rotatefile [-h] 파일 이름

옵션: -h 도움말 텍스트

예: rotatefile out

예를 들어 out.2 를 out.3 으로, out. 1 을 out.2 로, out 을 out. 1 으로 바꿉니다

빈 출력 파일을 만듭니다

최대 수량은 10 입니다

버전 $ver

도움

출구 0

}

오류 ()

{

에코 "$1"

1 호 출구

}

While [-n "$1"]; 하다

사례 $ 1 인치

도움말; Shift1; 을 눌러 섹션을 인쇄할 수도 있습니다

-) 깨진; 을 눌러 섹션을 인쇄할 수도 있습니다

-*) echo "오류: $ 1 옵션이 없습니다. -h 는 도움을 의미합니다. " 수출1; 을 눌러 섹션을 인쇄할 수도 있습니다

*) 깨진; 을 눌러 섹션을 인쇄할 수도 있습니다

Environmental systems applications center 환경 시스템 애플리케이션 센터

완성

# 검사 입력:

If [-z "$1"]; 그리고 나서

오류 "오류: 도움을 받으려면 -h 를 사용하여 파일을 지정해야 합니다."

선측은 화물 적재 비용을 부담하지 않습니다

Filen="$ 1 "

# 모든. 1,. 2 등의 파일 이름 바꾸기:

9 8 7 6 5 4 3 2 1 중 n 의 경우 : 하다

If [-f "$ 파일. $ n "]; 그리고 나서

P=' 표현식 $n+1' 입니다

에코 "mv $filen. $ n $ 파일. $p "

Mv $ 파일. $ n $ 파일. $p

선측은 화물 적재 비용을 부담하지 않습니다

완성

# 원본 파일 이름 바꾸기:

If[-f "$ filen "];]; 그리고 나서

Echo "mv $filen $filen. 1 "

Mv $filen $filen. 1

선측은 화물 적재 비용을 부담하지 않습니다

Echo touch $filen

터치 $ 파일

이 스크립트는 어떻게 작동합니까? 사용자가 파일 이름을 제공한 것을 감지한 후 9 부터 1 까지 순환했습니다. 파일 9 는 10, 파일 8 은 9 등으로 이름이 바뀝니다. 루프가 완료되면 원본 파일의 이름을 file 1 으로 지정하고 원본 파일과 이름이 같은 빈 파일을 작성합니다.

파일럿 테스트/디버그

가장 간단한 디버깅 명령은 물론 echo 명령을 사용하는 것입니다. Echo 를 사용하여 문제가 의심되는 곳에 변수 값을 인쇄할 수 있습니다. 이것이 대부분의 쉘 프로그래머들이 프로그램을 디버깅하는 데 80% 의 시간을 소비하는 이유입니다. 쉘 프로그램의 장점은 다시 컴파일할 필요가 없고 echo 명령을 삽입하는 데 시간이 많이 걸리지 않는다는 것입니다.

쉘은 또한 실제 디버깅 모드를 가지고 있습니다. 스크립트' strangescript' 에 오류가 있으면 다음과 같이 디버그할 수 있습니다.

Sh -x 단일 스크립트

이렇게 하면 스크립트가 실행되고 모든 변수의 값이 표시됩니다.

셸에는 스크립트를 실행할 필요 없이 구문만 검사하면 되는 모드도 있습니다. 이렇게 사용할 수 있습니다.

너의 대본

그러면 모든 구문 오류가 반환됩니다.