리눅스 쉘은 어떻게 쓰나요?
。 /smartzip 은 스크립트를 실행할 수 있습니다. 。
각 명령 행의 시작 부분에는 공백이 필요하지 않습니다. 。
부품 1. Linux 스크립트 기반
1..1구문 기본 소개
1..1..1시작
프로그램은 다음 줄로 시작해야 합니다 (파일의 첫 번째 줄에 있어야 함).
#! /bin/sh
기호 #! 다음 매개변수가 파일을 실행하는 데 사용되는 프로그램을 시스템에 알리는 데 사용됩니다. 이 예에서는 /bin/sh 를 사용하여 프로그램을 실행합니다.
스크립트를 편집할 때 스크립트를 실행하려면 스크립트를 실행 가능하게 만들어야 합니다.
스크립트를 실행 가능하게 만들려면 다음을 수행합니다.
Chmod +x filename 을 컴파일하여 와 함께 사용할 수 있도록 합니다. /파일 이름.
1..1.2 참고
셸 프로그래밍에서 # 으로 시작하는 문장은 본 줄이 끝날 때까지 주석을 나타낸다. 프로그램에서 주석을 사용하는 것이 좋습니다.
주석을 사용하면 스크립트를 오랫동안 사용하지 않아도 짧은 시간 안에 스크립트의 기능과 작동 원리를 이해할 수 있다.
1..1.3 변수
다른 프로그래밍 언어에서 변수를 사용해야 합니다. 셸 프로그래밍에서 모든 변수는 문자열로 구성되므로 변수를 선언할 필요가 없습니다. 변수에 값을 지정하려면 다음을 쓸 수 있습니다.
#! /bin/sh
# 변수에 값 지정:
A = "헬로 월드"
# 이제 변수 a 의 내용을 인쇄합니다.
에코 "A 는:"
Echo $a
변수 이름은 다음과 같은 다른 단어와 쉽게 혼동될 수 있습니다.
수량 =2
에코 "이것은 $numnd" 입니다
이렇게 하면 "이것은 2 번" 이 인쇄되지 않고 "예" 만 인쇄됩니다. 셸은 numnd 변수의 값을 검색하지만 이 변수에는 값이 없기 때문입니다. 중괄호를 사용하여 num 변수를 인쇄하고자 한다고 셸에 알릴 수 있습니다.
수량 =2
에코 "이것은 $ {num} 번째입니다."
이것은 인쇄 될 것입니다: 이것은 두 번째입니다.
1..1.4 환경 변수
Export 키워드로 처리되는 변수를 환경 변수라고 합니다. 환경 변수는 일반적으로 로그인 스크립트에서만 사용되기 때문에 논의하지 않습니다.
1..1.5 셸 명령 및 프로세스 제어
셸 스크립트에서 다음 세 가지 유형의 명령을 사용할 수 있습니다.
1) 유닉스 명령:
셸 스크립트에서 임의의 UNIX 명령을 사용할 수 있지만 비교적 자주 사용하는 명령이 있습니다. 이러한 명령은 일반적으로 파일 및 텍스트 작업에 사용됩니다.
자주 사용하는 명령의 구문 및 기능
일부 텍스트 반향: 화면에 텍스트 내용을 인쇄합니다.
Ls: 파일 리스트
Wc -l 파일: 통계 파일 행 수입니다.
Wc -w 파일: 통계 파일의 단어 수입니다.
Wc -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: cattext.file | sed 의/linuxfocus/linuxfocus/'> newtext.fileawk: awk 를 linuxfocus 로 바꾸면 텍스트 파일에서 사용됩니다 기본적으로 필드 구분 기호는 공백이며 -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) 프로세스 제어
1.if
"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 연산자를 사용하는 것이 훨씬 편리합니다.
2. 사례
대/소문자: 표현식은 숫자가 아닌 지정된 문자열을 일치시키는 데 사용할 수 있습니다.
상황 ...
...) 여기서 뭐 좀 해; 을 눌러 섹션을 인쇄할 수도 있습니다
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"; 을 눌러 섹션을 인쇄할 수도 있습니다
*) echo "파일 $ 1 smartzip 으로 압축을 풀 수 없음"; 을 눌러 섹션을 인쇄할 수도 있습니다
Environmental systems applications center 환경 시스템 애플리케이션 센터
여기서 특별한 변수 $ 1 을 사용했다는 것을 알 수 있습니다. 이 변수에는 프로그램에 전달된 첫 번째 매개변수 값이 포함되어 있습니다.
즉, 우리가 실행할 때:
Smartzip articles.zip
$1은 articles.zip 문자열입니다
3. 셀스터
Select expression 은 bash 의 확장 어플리케이션으로, 특히 대화형 사용에 능숙합니다. 서로 다른 값 세트에서 선택할 수 있습니다.
변수 선택 위치 ...; 하다
파열
완성
... 이제 $var 를 사용할 수 있습니다 ....
여기 한 가지 예가 있습니다.
#! /bin/sh
에코 "좋아하는 운영 체제는 무엇입니까? 클릭합니다
Linux”“Gnu Hurd”“Free BSD 기타에서 var 을 선택합니다
파열
완성
"$var 을 선택하셨습니다" 를 반향합니다
스크립트 실행 결과는 다음과 같습니다.
가장 좋아하는 운영 체제는 무엇입니까?
1) 리눅스
2) Gnu 허드
3) 무료 BSD
4) 기타
#? 1
Linux 를 선택하셨습니다
4. 루프
루프 표현식:
안에 ... 기간 ...; 하다
....
완성
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. 회전 속도.
5. 따옴표
프로그램에 인수를 전달하기 전에 프로그램에서 와일드 카드와 변수를 확장합니다. 여기서 확장명이란 프로그램에서 와일드카드 문자 (예: *) 를 적절한 파일 이름으로 대체하고 다른 변수는 변수 값으로 대체하는 것을 말합니다. 프로그램이 이러한 교체를 하지 않도록 따옴표를 사용할 수 있습니다. 예를 들어 현재 디렉토리에 몇 개의 파일, 두 개의 jpg 파일, mail.jpg 및 tux.jpg 가 있다고 가정해 보겠습니다.
1.2 셸 스크립트 컴파일
#ch#! /bin/sh mod +x 파일 이름
Cho *. Jpg ≈ 천천히? 。 /filename 을 사용하여 스크립트를 실행합니다.
이렇게 하면 "mail.jpg tux.jpg" 의 결과가 인쇄됩니다.
따옴표 (작은따옴표와 큰따옴표) 를 사용하면 와일드카드 확장이 방지됩니다.
#! /bin/sh
에코 "*. Jpg'
에코 *. Jpg'
이렇게 하면' *' 가 인쇄됩니다. Jpg' 를 두 번 클릭합니다.
작은따옴표가 더 엄격합니다. 모든 변수가 확대되는 것을 막을 수 있습니다. 큰따옴표는 와일드카드 확장을 방지하지만 변수 확장을 허용합니다.
#! /bin/sh
Echo $SHELL
에코 "$SHELL"
에코' $ 셸'
실행 결과는 다음과 같습니다.
/bin/bash
/bin/bash
$ 셸
마지막으로, 이 확장을 막을 수 있는 또 다른 방법은 이스케이프 문자인 대각선을 사용하는 것입니다.
Echo /*. Jpeg 파일 교환 형식으로 저장된 인코딩된 이미지 파일 확장자
Echo/$ 셸
이렇게 하면 다음과 같이 출력됩니다.
*. JPEG 파일 교환 형식으로 저장된 인코딩된 이미지 파일 확장자
$ 셸
6. 여기 문서
여기서 documents 는 명령에 몇 줄의 텍스트를 전달하는 좋은 방법입니다. 각 극본에 도움이 되는 글을 쓰는 것은 매우 유용하다. 이때, 만약 우리가 그 here 문서를 가지고 있다면, echo 함수를 사용하여 한 줄씩 출력할 필요가 없다. "여기 문서" 는
여기 문서는 특수 용도의 코드 블록입니다. I/O 리디렉션을 사용하여 명령 시퀀스를 FTP, cat 또는 ex text editor 와 같은 대화형 프로그램이나 명령으로 전송합니다.
1 명령
제한 문자열은 명령 시퀀스의 범위를 지정하는 데 사용됩니다. 특수 기호
이 문서의 형식은 다음과 같습니다.
1 #! /bin/bash
2 대화형 절차
이름이 이상한 제한 문자열을 선택하면 명령 표와 제한 문자열 중복 이름 문제가 방지됩니다.
다음은 여러 파일의 이름을 바꾸고 here documents 를 사용하여 도움말을 인쇄하는 예입니다.
#! /bin/sh
# 우리는 세 가지 논점 미만이다. 도움말 텍스트 인쇄:
If [$ #-lt3]; 그리고 나서
고양이
4) 기능
좀 더 복잡한 프로그램을 쓰면, 프로그램의 여러 곳에서 같은 코드를 사용할 수 있다는 것을 알게 될 것이고, 우리가 함수를 사용한다면 훨씬 더 편리할 것이다. (존 F. 케네디, 공부명언) 함수는 다음과 같습니다.
함수 이름 ()
{
# 함수 본문 $ 1 에서 함수의 첫 번째 매개 변수입니다
# $2 초 ...
몸
}
각 프로그램의 시작 부분에서 이 함수를 선언해야 합니다.
다음은 터미널 창의 이름을 변경할 수 있는 xtitlebar 라는 스크립트입니다.
여기에 헬프라는 함수가 사용되었습니다. 보시다시피 이 정의의 함수는 두 번 사용되었습니다.
#! /bin/sh
# vim: set sw=4 ts=4 et:
도움말 ()
{
카트 벨러 시프트 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 표현식과 비교하며, 변수를 설정하고, 일치하는 경우 매개변수를 삭제합니다. 유닉스 시스템의 규칙에 따라 입력할 첫 번째 매개변수는 마이너스 기호가 포함된 매개변수여야 합니다.
2 부 예
이제 대본을 쓰는 일반적인 단계를 논의해 보겠습니다. 모든 우수한 스크립트에는 도움말 및 입력 매개변수가 있어야 합니다. 그리고 유사 스크립트 (framework.sh) 를 작성하는 것은 대부분의 스크립트에 필요한 프레임워크 구조를 포함하는 좋은 아이디어입니다. 이 시점에서 새 스크립트를 작성할 때 copy 명령만 실행하면 됩니다.
Cp framework.sh myscript
그런 다음 자체 함수를 삽입하십시오.
두 가지 예를 더 살펴 보겠습니다.
(1) 이진에서 십진수로 변환
스크립트 b2d 는 바이너리 (예: 1 10 1) 를 해당 10 진수로 변환합니다. 또한 expr 명령을 사용한 수학 연산의 예입니다.
#! /bin/sh
# vim: set sw=4 ts=4 et:
도움말 ()
{
고양이
3 부: 디버깅
가장 간단한 디버깅 명령은 물론 echo 명령을 사용하는 것입니다. Echo 를 사용하여 문제가 의심되는 곳에 변수 값을 인쇄할 수 있습니다. 이것이 대부분의 쉘 프로그래머들이 프로그램을 디버깅하는 데 80% 의 시간을 소비하는 이유입니다. 쉘 프로그램의 장점은 다시 컴파일할 필요가 없고 echo 명령을 삽입하는 데 시간이 많이 걸리지 않는다는 것입니다.
쉘은 또한 실제 디버깅 모드를 가지고 있습니다. 스크립트' strangescript' 에 오류가 있으면 다음과 같이 디버그할 수 있습니다.
Sh -x 단일 스크립트
이렇게 하면 스크립트가 실행되고 모든 변수의 값이 표시됩니다.
셸에는 스크립트를 실행할 필요 없이 구문만 검사하면 되는 모드도 있습니다. 이렇게 사용할 수 있습니다.
너의 대본
그러면 모든 구문 오류가 반환됩니다.
셸 프로세스 디버그
사용자가 방금 쉘 프로그램을 작성했을 때 불가피하게 오류가 발생합니다. 이제 Bsh 에 제공된 추적 옵션을 사용하여 방금 실행한 명령과 매개변수를 표시할 수 있습니다. Shell 명령을 통해 -x 옵션을 켜거나 셸을 시작할 때 -x 옵션을 사용하여 셸을 추적 모드로 설정할 수 있습니다. 예를 들어 다음 코드 ice_tx 가 있습니다.
If [$# -eq 0]
그리고 나서
Echo "사용법: sumints 정수 목록"
1 호 출구
선측은 화물 적재 비용을 부담하지 않습니다
합계 =0
[$# -eq 0] 까지
하다
Sum='expr $sum+$ 1' 입니다
변화
완성
Echo $sum
우리는 추적 모드로 운영합니다.
$sh -x ice_tx 2 3 4
결과는 다음과 같습니다.
+[ 3 -eq 0]
+sum=0
+[ 3 -eq 0]
+표현식 0+2
+sum=2
+shift
+[ 2 -eq 0]
+표현식 2+3
+sum=5
+shift
+[ 1 -eq 0]
+표현식 5+4
+sum=9
+[ 0 -eq 0]
+에코 9
아홉;구;9
위에서 볼 수 있듯이 trace 모드에서 셸은 실행된 각 명령과 명령에 사용된 변수가 대체된 매개변수 값을 표시합니다. If, then, till 등과 같은 일부 제어어. 표시되지 않습니다.