고급 Bash 스 크 립 트 프로 그래 밍 가이드 (1): 간단 한 script 에서 출발 합 니 다.
8477 단어 shell
견지했어
셸 스 크 립 트 프로 그래 밍 학습 을 시작 합 니 다. 가시덤불 이 가득 합 니 다. O (∩ ∩) O ~, 시작 합 시다. 이것 은 "고급 Bash 스 크 립 트 프로 그래 밍 가이드"가 우 리 를 위해 만들어 준 "Hello World"입 니 다. 사실 이것 은 우리 가 아주 잘 아 는 명령 의 중첩 이기 때 문 입 니 다!O(∩_∩)O
로그 파일 지우 기/var/log
# , root .
cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
hello World 를 분석 하 는 것 처럼 우리 도 이 셸 스 크 립 트 를 말 합 시다!이것 은 이상 한 것 이 없습니다. 명령 이 쌓 여 있 을 뿐 입 니 다. console 이나 xterm 에서 하나의 입력 명령 을 편리 하 게 하 는 것 이 좋 습 니 다. 모든 명령 을 하나의 스 크 립 트 에 두 는 것 이 좋 습 니 다. 매번 두 드 리 지 않 아 도 됩 니 다. 그러면 이 스 크 립 트 는 도구 가 되 고 특정한 응용 프로그램 에 있어 서 이 스 크 립 트 는 수정 되 거나 맞 춤 형 으로 만 들 기 쉽 습 니 다.
그 중에서 첫 번 째\# 뒤에 한 마디 가 있 으 니 알 아 맞 혀 야 한다. 그래, 이것 은 주석 이다. 앞으로 너 는 자주 그 와 교제 할 것 이다. 먼저 아래 를 보 자.
cd/var/log 이 건 간단 해 요. 매일 쓰 고 있 으 니까 쓸데없는 소리 하지 마 세 요.
cat/dev/null > messages 이 앞 은 간단 합 니 다. 저도 매일 사용 합 니 다. 그런데 뒤에 무엇이 있 습 니까? '동부' 라 는 글자 처럼 위아래 로 나 눌 수 있 습 니 다. 1 학년 초등학생 들 이 모두 할 수 있 습 니 다. 그런데 이렇게 맞 추 면 모 르 겠 습 니 다. 구체 적 으로 어떤 글자 인지 스스로 찾 아 보 세 요. 여기 서 이 문장의 역할 은 cat/dev/null 이 얻 은 내용 을 messages 에 저장 하 는 것 입 니 다.일단 낯 익 게 해 주세요.
다음 구절 은 네가 즐겨 야 지, 한 수 배 워 야 지.
하지만 여기 서 나 는 이곳 의 이/dev/null 에 대해 더 많은 시간 을 들 여 이야기 하기 로 결정 했다. 왜냐하면 너 는 왜 messages 와 wtmp 에 저장 해 야 하 는 지 모 르 고 cat 의 이 유 는/dev/null 이기 때문이다.
리 눅 스 운영 체제 에서/dev/null 과/dev/zero 는 비슷 하면 서도 특수 한 파일 입 니 다. 특히 셸 스 크 립 트 개발 과 시스템 운영 과정 에서 이 두 파일 을 자주 사용 하기 때문에 리 눅 스 시스템 엔지니어 로 서 이 두 파일 의 차이 점 과 용법 을 알 아야 합 니 다.
1./dev/null 의 용법:
우 리 는/dev/null 파일 을 '블랙홀' 로 볼 수 있 습 니 다. 이것 은 파일 만 쓰 는 것 과 매우 같 습 니 다./dev/null 파일 에 기 록 된 모든 내용 을 잃 어 버 리 고/dev/null 파일 에서 도 읽 을 수 없습니다.그러나 이러한 특징 때문에 셸 스 크 립 트 개발 과 명령 행 유 지 를 할 때/dev/null 파일 은 크게 솜 씨 를 발휘 하여 매우 유용 합 니 다.
1. 표준 출력 금지
예 를 들 어 cat 에서 $filename 파일 을 보면 리 턴 정보 가 비어 있 습 니 다.
# cat $filename > /dev/null
2. 표준 오류 금지
예 를 들 어 rm 에서 파일 을 삭제 할 때 $badname 파일 이 존재 하지 않 으 면 다음 과 같은 방식 으로 잘못된 정 보 를 걸 러 냅 니 다.
# rm $badname 2> /dev/null
3. 표준 출력 과 표준 오류 의 패 배 를 금지 합 니 다.
예: cat 에서 $filename 파일 보기
# cat $filename 2>/dev/null >/dev/null
\# "$filename"이 존재 하지 않 으 면 잘못된 정보 알림 이 없습니다.
\# "$filename"이 존재 하면 파일 의 내용 이 표준 출력 으로 인쇄 되 지 않 습 니 다.
\# 따라서 위의 코드 는 아무런 정보 도 출력 하지 않 습 니 다.
4. 로그 파일 내용 지우 기
예 를 들 면:
# cat /dev/null > /var/log/wtmp
# cat /dev/null > /var/log/messages
\#: >/var/log/messages 는 같은 효과 가 있 지만 새로운 프로 세 스 가 발생 하지 않 습 니 다.여기 서 wtmp 와 messages 두 파일 을 어떻게 비 웠 는 지 알 아야 합 니까?cat/dev/null 의 결과 가 비어 있 기 때 문 입 니 다. 그리고 빈 내용 을 이 두 파일 에 저장 하면 비 우 는 것 과 같 지 않 습 니까?
5./dev/null 의 특수 한 용법 입 니 다. 프로그램 이 인쇄 한 로 그 는 더 이상 기록 되 지 않 고 시스템 공간 이 필요 하지 않 은 로그 에 차지 하지 않도록 합 니 다.
약간 고 급 스 러 운 것, 예 를 들 면:
# ln -s /dev/null ~/.netscape/cookies
이 쿠키 의 로그 파일 을/dev/null 에 연결 하면 이 파일 에 기 록 된 내용 은 모두 버 려 집 니 다.
2./dev/zero 의 용법:
/dev/zero 는/dev/null 과 마찬가지 로 가짜 파일 입 니 다. 그러나/dev/zero 는 실제 적 으로 끊임없이 null 의 흐름 (ASCII 형 이 아 닌 바 이 너 리 0 흐름) 을 만 들 수 있 습 니 다./dev/zero 의 출력 을 기록 하면 보이 지 않 고/dev/zero 에서 일련의 null 을 읽 는 것 도 어렵 습 니 다. dd 나 16 진 편집 기 를 통 해 도 할 수 있 지만,/dev/zero 의 주요 용 도 는 초기 화 에 사용 할 빈 파일 을 만 드 는 데 사 용 됩 니 다. 보통 dd 명령 과 함께 사용 합 니 다.
1./dev/zero 로 지정 한 크기 의 임시 파일 만 들 기
예 를 들 어 dd 명령 을 결합 하면 1024 * 1000 bit 크기 의 파일/swap 를 만 들 수 있 습 니 다. 물론 이 파일 의 크기 는 bs 와 count 인 자 를 통 해 조정 할 수 있 습 니 다.
# dd if=/dev/zero of=/swap bs=1024 count=1000
2./dev/zero 를 통 해 지정 한 크기 의 파일 에 0 을 채 워 특별한 수 요 를 사용 합 니 다.
예 를 들 어 RAM 장치 의 내용 을 0 으로 채 워 서 RAM 을 포맷 하 는 목적 을 실현 합 니 다.
# dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE
위 에서 말 한 바 와 같이/dev/null 과/dev/zero 파일 의 차이 점 과 용법 은 다음 과 같다.
/dev/null 파일 은 빈 장치 이 며 비트 통 (bit bucket) 이 라 고도 부 릅 니 다. 주로 '쓰기' 에 사 용 됩 니 다. 기록 한 출력 은 모두 버 려 집 니 다.메 시 지 를 표준 출력 으로 표시 하거나 파일 에 쓰 지 않 으 려 면/dev/null 로 메 시 지 를 바 꿀 수 있 습 니 다.따라서/dev/null 에 입력 한 모든 데 이 터 는 먹 을 수 있 고 버 티 지 않 습 니 다!
/dev/zero 파일 은 주로 표준 '0' 입력 장치 로 사용 되 며 0 을 무한 정 제공 할 수 있 으 며/dev/zero 를 사용 하여 파일 을 초기 화 할 수 있 습 니 다.
제거: 개량 된 제거 스 크 립 트
#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
exit
# 이 명령 은 스 크 립 트 를 올 바 르 고 적절하게 종료 하 는 방법 으로 비교적 표준적 인 'helloworld' 라 고 할 수 있다
이제 진정한 의미 의 스 크 립 트 를 보 여 줍 니 다. 그리고 우 리 는 더 멀리 갈 수 있 습 니 다. 여 기 는 위의 단일 명령 을 하나의 bash 파일 에 모 아서 처리 할 뿐 입 니 다. 속칭 '일괄 처리' 제거: 강화 되 고 넓 은 의미 의 logfile 을 삭제 하 는 스 크 립 트 입 니 다.
#!/bin/bash
LOG_DIR=/var/log
ROOT_UID=0
LINES=10
E_XCD=66
E_NOTROOT=67
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Must be root ro run this script!"
exit $E_NOTROOT
fi
#if [ -n "$1" ]
#then
# lines=$1
#else
# lines=$LINES
#fi
E_WORNGPARAM=65
case "$1" in
"" ) lines=10;;
*[!0-9]*) echo "Usage: wong param!";exit $E_WRONGPARAM;;
* ) lines=$1;;
esac
#cd $LOG_DIR
#if [ "$PWD" != "$LOG_DIR" ]
#then
# echo "Can't change to $LOG_DIR"
# exit $E_XCD
#fi
cd /var/log || {
echo "Can't change to necessary directory." >&2
exit $E_XCD
}
tail -$lines messages > mesg.tmp
mv mesg.tmp messages
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up!"
exit 0
시스템 log 를 모두 없 애고 싶 을 수도 있 기 때문에 이 버 전 은 log 메시지 의 마지막 부분 을 남 겼 습 니 다. 이 스 크 립 트 를 보완 하고 효율 을 높 일 수 있 는 새로운 방법 을 계속 찾 을 것 입 니 다.
모든 스 크 립 트 의 시작 부분 에 sha - bang (\#!) 을 사용 합 니 다. 이것 은 시스템 이 파일 의 실행 에 해석 기 를 지정 해 야 한 다 는 것 을 의미 합 니 다.\#!실제로 2 바이트 의 마법 숫자 입 니 다. 이것 은 파일 형식 을 지정 하 는 특수 한 태그 입 니 다. 다시 말 하면 이 경우 실행 가능 한 스 크 립 트 (man magic 을 입력 하여 이 매력 적 인 화제 에 대한 더 자세 한 정 보 를 얻 습 니 다) 를 말 합 니 다. sha - bang 에 이 어 경로 이름 입 니 다. 이 경로 이름 은 스 크 립 트 에서 명령 한 해석 프로그램 이 있 는 경 로 를 설명 하 는 것 입 니 다.셸 일 수도 있 고 프로그램 언어 일 수도 있 으 며 공구 꾸러미 의 명령 프로그램 일 수도 있 습 니 다.
이 설명 프로그램 은 스 크 립 트 의 명령 을 처음부터 설명 하고 실행 합 니 다. (sha - bang 줄 아래 줄 부터) 설명 을 무시 합 니 다.
여기 서 파일 의 첫 번 째 sha - bang 이 의미 가 있 고 시작 해 야 한다 고 강조 합 니 다. 그 다음 에 sha - bang 이 다시 나타 나 면 sha - bang 으로 해석 되 지 않 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
#!/bin/bash
echo "Part 1 of script."
a=1
#!/bin/bash # .
echo "Part 2 of script."
echo $a
모든 스 크 립 트 헤더 의 줄 에 다른 명령 해석 기 가 지정 되 어 있 습 니 다./bin/sh 라면 기본 셸 (Linux 시스템 에서 기본 값 은 bash) 입 니 다. 그렇지 않 으 면 다른 해석 기 입 니 다. 예 를 들 어 다음 과 같 습 니 다.
#!/bin/rm
# . rm , ,more
# , . . . .
WHATEVER=65echo "This line will never print (betcha!)."
exit $WHATEVER # , .
사용\#!/bin/sh, 대부분의 비 즈 니스 UNIX 시스템 에 서 는 Bourne shell 을 기본 셸 로 하기 때문에 non - Linux 기기 에 스 크 립 트 를 이식 할 수 있 습 니 다. Bash 의 독특한 특징 을 희생 하지만 스 크 립 트 는 POSIX 의 sh 기준 과 일치 합 니 다."sha - bang"뒤에 제 시 된 경로 이름 이 정확 해 야 합 니 다. 그렇지 않 으 면 오류 메시지 가 발생 합 니 다. 보통 "Command not found"입 니 다. 이것 은 이 스 크 립 트 를 실행 할 때 얻 은 유일한 결과 입 니 다.
물론무시 할 수도 있 습 니 다. 하지만 스 크 립 트 파일 은 명령 의 집합 일 뿐 셸 내 에 만들어 진 명령 을 사용 할 수 없습니다. 위의 두 번 째 예 는\#!처음에는 변 수 를 분 배 했 기 때 문 입 니 다. lines = 50, 이것 은 셸 특유 의 용법 을 사 용 했 습 니 다. 다시 한 번 알려 드 립 니 다\#!/bin/sh 는 기본 셸 해석 기 를 호출 합 니 다. Linux 기기 에 서 는 기본적으로/bin/bash 입 니 다.
여기 서 위의 스 크 립 트 에 대해 다음 과 같은 분석 을 합 니 다.
1. 변수 정의
2. 스 크 립 트 가 루트 권한 을 얻 었 는 지 확인 하고 두 가지 방식 으로 이해 하기 쉽 고 전문 적 인 방법 을 사용 합 니 다.
3. 입력 파 라 메 터 를 검사 하고 두 가지 방식 으로 이해 하기 쉬 우 며 더욱 전문 적 인 방법 을 사용한다.
4./var/log 디 렉 터 리 에 들 어 갔 는 지 확인 하고 두 가지 방식 으로 이해 하기 쉽 고 전문 적 인 방법
5. 클 린 업 동작 수행
마지막 으로 모듈 화 된 방식 으로 스 크 립 트 를 작성 하도록 권장 합 니 다. 평소에 도 대표 적 인 '모드' 코드 를 수집 하 는 것 에 주의해 야 합 니 다. 이 자질구레한 코드 들 은 앞으로 작 성 될 스 크 립 트 에 사 용 될 수 있 습 니 다. 마지막 으로 확장 가능 한 루틴 라 이브 러 리 를 만 들 수 있 습 니 다. 아래 스 크 립 트 를 예 로 들 면 스 크 립 트 가 호출 된 매개 변수 가 정확 한 지 테스트 하 는 데 사 용 됩 니 다.
대부분의 경우 특정한 작업 을 수행 하기 위해 스 크 립 트 를 만들어 야 합 니 다. 이 장 에서 첫 번 째 스 크 립 트 는 이러한 예 입 니 다. 그리고 다른 작업 을 수행 하기 위해 수정 할 것 입 니 다. 비슷 한 작업 을 수행 할 것 입 니 다. 죽은 ("하 드 인 코딩 (hard - wired)") 의 상수 대신 변 수 를 사용 하 는 것 이 좋 은 습관 입 니 다. 중 복 된 코드 를 함수 에 넣 는 것 입 니 다.좋 은 습관 이 야.
먼저 여기까지, O (∩ ∩) O ~
내 칼럼 주소:http://blog.csdn.net/column/details/shell-daily-study.html
계속...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ZSH에서 물고기까지ZSH는 수년 동안 내 기본 셸이었습니다. 이제 몇 달 동안 사용하면서 ZSH 구성에 대해 몇 가지 사항을 발견했습니다. 우리는 을 제공하는 시스템과 더 빨리 상호 작용하는 경향이 있습니다. 내.zshrc 구성에는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.