제 27과 -Shell 고급 프로그래밍 스크립트
28.1 스크립트 무엇입니까
일련의이 포함 된 스크립트 명령 시퀀스 의 텍스트 파일 (에디터가 편집 할 수 있으며, 수행 할 수 있습니다). 이 스크립트 파일을 실행하면 파일이 일련의 명령이 자동으로 실행됩니다 포함되어 있습니다. 예를 들어, 우리는 일곱 개 파일을 생성, 당신은 또한 스크립트 파일 (의 .sh 파일)을 생성 할 수 있습니다, 일곱 개 파일을 만들 계속할 수 있습니다.
28.2 스크립팅 기술
1. 기본 구조
(1) 파서 : #! 스크립트 파서 동작을 의미 후반부;
(2) 커맨드 서열 명령 다수.
2. 변수
쉘 스크립트 설정하고 숫자 나 문자열, 사용자가 유형을 지정하지 않아도 할 수 있으며, 사용하기 전에 정의 할 필요가 없습니다 자신의 변수를 사용하는 것을 허용합니다. 공간이없는 권리의 할당 및 왼쪽 , 코멘트 #로 시작합니다.
#! / 빈 / SH
A = "안녕하세요!"
B = 5
에코 "A는 : $ a를"
에코 "는 B %의 B는"
참고 : 우리가 창 아래에있는 파일을 리눅스에서 다른 파일을 사용하고 있기 때문에 프로그램을 실행하기 전에 우리가 그 잘못 찾을 수 있습니다. 그래서 우리는 DOS2UNIX의 shell.sh로 전환했다. 우리는 변환하기 전에 적절한 rpm 패키지를 설치하려고합니다.
3. 매개 변수
C 프로그램과 마찬가지로, 쉘 스크립트는 명령 줄 매개 변수를 사용할 수 있습니다
$ 번호 : 스크립트에 명령 줄 매개 변수의 수
$의 * : 개별 매개 변수 값 사이의 모든 명령 줄 매개 변수 값이 비어
$ 0 : 명령 자체 (자체 쉘)
$ 1 : 첫 번째 명령 줄 인수
$ 2 : 두 번째 명령 줄 인수
예를 들면 :
# 2.3
에코 "VAR 번호 :"$ #
* $ "바르의 값"에코
$ 0 "으로 이름을 스크립트의"에코
"VAR1의 값"$ 1 에코
"VAR2의 값"$ 2 에코
우리가 명령을 입력 한 후 3, 쇼를 ./shell.sh
VAR의 수 : 2
값은 3 바르
스크립트 ./shell.sh의 이름
VAR1 A의 값
VAR2 3 값
4. 디지털 컴퓨팅
쉘 스크립트는 5 + 1 expre 등의 수학적 표현을 계산하는 특별한 명령 EXPR을 제공하지만, 계산의 결과가 다른 변수에 복제해야 할 때, 당신은 또한 역 따옴표를 사용해야합니다. ~ 기호를 다음 줄은 '
만약 expr =`20 / 10`이었다
예를 들면 :
# 2.4
VAR1 = 10
VAR2 = 20
VAR3 =`expr에 $ var1에 / $ var2`
Var4 =`expr에 $ VAR1 + $ var2`
에코 $ VAR3
에코 $ var4
결과 : 0
(30)
5. 공정 제어
(1) 쉘 스크립트 형식을 사용하여 기본 유량 제어 명령 IF-다음이다 :
만약 [조건] (특별 참고 사항 : 대괄호의 왼쪽과 오른쪽에 공백이 있어야합니다)
그때
명령
그밖에
명령
있다
L 조건은
작업을 비교 |
정수 연산 |
문자열 조작 |
같은 |
-eq |
= |
다른 |
-do |
! = |
보다 큼 |
-gt |
> |
이하 |
-lt |
< |
보다 크거나 같음 |
-provide |
|
보다 작거나 같 |
-THE |
|
널 |
가진 - |
|
그것은 비어 있지 |
-엔 |
|
예 :
정수 A 및 B의 비교는 동일하다 : 만약 [$ $ A = B (EQ가 또한 사용될 수있다)
정수 A를 결정하는 정수 (B)보다 크다 : [A -gt $으로의 B를 $] 만약
비교 캐릭터 (A 및 B)은 동일하다 : 만약 [$ A = $ B]
문자열이 비어 있는지 여부를 결정합니다 : if [-z $ A]
정수 변수 A를 분석하는 단계 (B)보다 크다 : 만약 [$ A -gt $으로의 B]
참고 :
왼쪽과 오른쪽 괄호 난 비어 있습니다
L "="떠난 공간
파일 디렉토리
-e 파일이 이미 존재
-f 파일은 일반 파일입니다
-s 파일 크기가 0이 아닌
-d 파일은 디렉토리입니다
현재 사용자 -r 파일을 읽을 수 있습니다
쓸 수있는 현재 사용자에 대한 -w 파일
-x 파일은 현재 사용자에 대해 실행할 수 있습니다
#! / 빈 / SH
폴더 = / 집
[-R "$ 폴더"] && 현재 표면 상태의 "$ 폴더를 읽을 수있는"에코 사실은 다음 동작들을 수행
[-F "$ 폴더"] || 조건 에코의 현재의 얼굴 후자가 거짓 일 때 동작을 수행하도록 "이 파일이 아닙니다"
예 :
= 10이었다
경우의 [$ var에 -gt 5]
그때
"값은 다음 qreater 5"에코
있다
결과를 작동 : 값이 qreater 다음 5
(2) 문
프로그래밍 언어가 같은 사이클에 대한 유사한 문을 작성하는 데 사용되는 C 쉘 스크립트는 문을 제공합니다. 형식을 사용 :
목록에서 VAR에 대한
해야 할 것
명령
끝난
예 :
#! / 빈 / bash는
목록 = "일 월 화 수 목 금 토"
$ 목록에서 하루
해야 할 것
$ 일 에코
끝난
결과 :
태양
월
화
결혼시키다
목
금
토
(3) 동안 문
프로그래밍 언어는 동안 같은주기에서 유사한 문을 작성하는 데 사용되는 C 쉘 스크립트는 잠시 문을 제공합니다. 형식을 사용 :
조건 동안
해야 할 것
명령
끝난
예 :
#! / 빈 / bash는
했다 = 5
동안의 [$ var에 -gt 0]
해야 할 것
에코 $ var에
VAR =`EXPR의 $이었다 - 1 '
끝난
결과 :
5
4
삼
이
1
6. 편집기를 나오지도
SED (스트림 Editior) : AKA 스트림 편집기 라인 (멈춤) 편집기, 형식의 타임 라인 편집 :
SED [옵션] '명령'파일 이름
공통 옵션 :
-n : 지정된 가공 라인 만이 표시 되어도
-e : 여러 편집 작업을 확인
-i : 대신 직접 화면의 출력, 읽을 수있는 파일의 내용을 수정
리터 공통 명령 옵션 :
P 인쇄 정합 라인
새로운
C 대안 라인
위치 줄 거라고 삭제
라인의 일부가 대신이야
L SED 예
이러한 변경 사항은 원본 파일에 영향 -i 추가에 추가됩니다.
(1) 표시
SED -n '2P'tmp.txt에만 디스플레이 라인 2
SED -n '1,3p'tmp.txt 인쇄 라인 1 라인에 3 -F
SED -n '/ MOV /'P는 tmp.txt 포함 된 영화의 인쇄 라인
(2) 삭제
SED '2D'는 행 2 (나머지를 인쇄)을 삭제 tmp.txt
나오지도 '3 $ d를'마지막 줄에 세 번째 줄을 삭제 tmp.txt, $ : 마지막 줄
(3) 쿼리
SED -n '/ 인사 / P'의 모든 행 키워드 쿼리를 포함 tmp.txt 안녕하세요
(4) 대신에
나오지도 '1C 안녕'하이 대신에 tmp.txt 첫 번째 행
SED -n '/ / P 안녕하세요'tmp.txt | 나오지도 'SED의 / 인사 / 새 / g'
(5) 삽입
나오지도 -i 마지막 행의 안녕에 삽입 tmp.txt '부전승이 $'
7. AWK 분석기
AWK는 여러 필드에 각 행을 분할 기본 구분 된 공간, 라인하여 파일 라인을 읽는 강력한 텍스트 분석 도구입니다.
사용 : AWK '{패턴 + 액션}'파일 이름
패턴의 내용을 찾으려면
일치가 발견되면 명령 작업이 수행
예 :
마지막 -n 5 | AWK '{인쇄 $ 1}'마지막 -n 5는 가장 최근 다섯 사용자 로그인을 나타냅니다.
고양이 / etc / passwd에 | AWK의 -F '' ''{$ 1 인쇄} -F 지정된 구분 기호를 나타냅니다
AWK -F ':'$ 1 == "루트" '/ etc / passwd에'{$ 0 인쇄}
통합 예 28.3
QCD 분석
qcd.sh
QCD ()
{
에서 mkdir -p /.qcd/tmp
[-x /.qcd/tmp/qcd_tmp] || /.qcd/tmp/qcd_tmp 접촉
chmod를 700 /.qcd/tmp
QD = /. QCD / tmp를 / qcd_tmp
수출 QD
합니다 / usr / local / sbin / qcde "$의 @"
[! `고양이 $ QD`] || CD "`고양이 $ QD`"
은 rm -f "$ QD"
해제 QD;
}
설치
#! / 빈 / SH
설치 #qcd
xiewei 2004 년 #written
setup_content =은 / etc / QCD
history_dir = $ setup_content / history_dir
bin_content = / usr / 지방 / sbin에
prof_content =은 / etc / profile.d
설정()
{
#검사
[-r $ history_dir] # $ history_dir하면 현재 사용자가 읽을 수있는 경우
그때
"당신 QCD를 설치 한 것이 (예를 \의 Y 또는 Q의 \ Q 또는 N \ N)를 덮어 쓰시겠습니까?"-n 에코
읽기 선택하면서
해야 할 것
[ "$ 선택"= "Y"-o "$ 선택"= "Y"] # 설치 경로를 다시 작성하는 경우
그때
단절
있다
[ "$ 선택"= "Q"-o "$ 선택"= "Q"] # 할 아무것도 출구 경우
그때
"아무!"에코 없다
1 번 출구
있다
[ "$ 선택"= "N"-o "$ 선택"= "N"] # 기본 위치에 설치 한 경우
그때
CP -f ./qcd $ bin_content /
CP -f ./qcd.sh $ prof_content /
에코 "QCD 확인을 설치,하지만 그것을 덮어 쓰지 않습니다!"
에코 "버전은 1.00이다"
1 번 출구
있다
"당신 QCD를 설치 한 것이 (예를 \의 Y 또는 Q의 \ Q 또는 N \ N)를 덮어 쓰시겠습니까?"-n 에코
끝난
있다
만약 [-r $ setup_content]
그때
:
그밖에
MKDIR $ setup_content
있다
CP -f ./qcde $ bin_content /
CP -f ./history_dir $ setup_content /
CP -f ./qcd.sh $ prof_content /
}
지우다()
{
[-r $ history_dir] || [-r $ bin_content] || \
! "컴퓨터가 QCD하지!"에코 || ! "아무!"에코 없다
-n 에코 "당신은 QCD (y를 \의 Y 또는 q의 \의 Q)을 삭제 하시겠습니까?"
읽기 선택하면서
해야 할 것
만약 [ "$ 선택"= "Y"-o "$ 선택"= "Y"]
그때
단절
있다
만약 [ "$ 선택"= "Q"-o "$ 선택"= "Q"]
그때
"아무!"에코 없다
1 번 출구
있다
-n 에코 "당신은 QCD (y를 \의 Y 또는 q의 \의 Q)을 삭제 하시겠습니까?"
끝난
RF RM은 $ setup_content
RM은 -f의 $의 bin_content / QCD
RM -f $ prof_content / qcd.sh
}
용법()
{
"<설치> 컴퓨터에 QCD를 설치합니다."에코
"<델를 설치하기> 컴퓨터에서 QCD를 삭제합니다."에코
1 번 출구
}
"소프트웨어를 설치 QCD"에코
"XieWei 2004 년 작성된"에코
만약 파라미터의 개수는 다음 ≠ 0에 전달할 경우 [$ # -eq 0] #
설정
"QCD 확인을 설치!"에코
에코 "버전은 1.00이다"
1 번 출구
있다
[$ # -gt 1] 인수 # 번호는 들어오는 경우 0보다 큰 경우
그때
용법
있다
첫 번째 인수는 델 인 경우 #에서 $ 1 케이스
의)
지우다
에코 "QCD 확인을 삭제 해!"
;;
*)
사용 # 프롬프트
;;
ESAC