Shell 프로 그래 밍: 간결 한 Bash Programming 기법

12331 단어 programming
간결 한 Bash Programming 기법 이라는 일련의 글 은 Bash 프로 그래 밍 에서 간결 한 기 교 를 전문 적 으로 소개 하여 여러분 에 게 Bash 프로 그래 밍 의 효율 을 제공 합 니 다. 현재 이 시 리 즈 는 세 편의 글 이 있 고 관심 이 있 는 학생 들 은 다른 두 편의 속편 (1)(2) 을 계속 읽 을 수 있 습 니 다.
아래 의 이 몇 가 지 는 내 가 셸 코드 를 쓸 때 비교적 좋아 하 는 몇 가지 기법 으로 벽돌 을 던 져 옥 을 끌 어 올 리 는 것 이다.
 
1. 명령 실행 이 성 공 했 는 지 확인
첫 번 째 표기 법 은 비교적 흔히 볼 수 있다.
echo abcdee | grep -q abcd

if [ $? -eq 0 ]; then
    echo "Found"
else
    echo "Not found"
fi

 
간결 한 표기 법:
if echo abcdee | grep -q abc; then
    echo "Found"
else
    echo "Not found"
fi

 
물론 if/else 를 원 하지 않 아 도 됩 니 다. 그러나 이렇게 가 독성 이 떨 어 집 니 다.
[Sun Nov 04 05:58 AM] [kodango@devops] ~/workspace 
$ echo abcdee | grep -q abc && echo "Found" || echo "Not found"
Found

 
2. 표준 출력 과 표준 오류 출력 을/dev/null 로 재 설정
첫 번 째 표기 법 은 비교적 흔히 볼 수 있다.
grep "abc" test.txt 1>/dev/null 2>&1

 
일반적인 오류 쓰기:
grep "abc" test.txt 2>&1 1>/dev/null

 
간결 한 표기 법:
grep "abc" test.txt &> /dev/null

 
3. awk 사용
실제 예 를 들 어 Xen DomU 의 id 를 가 져 옵 니 다.
흔히 볼 수 있 는 쓰기:
sudo xm li | grep vm_name | awk '{print $2}'

 
간결 한 표기 법:
sudo xm li | awk '/vm_name/{print $2}'

 
4. 한 텍스트 의 모든 줄 을 쉼표 로 연결
파일 내용 이 다음 과 같다 고 가정 합 니 다.
[Sat Nov 03 10:04 PM] [kodango@devops] ~/workspace 
$ cat /tmp/test.txt 
1
2
3

 
Sed 명령 사용:
[Sat Nov 03 10:14 PM] [kodango@devops] ~/workspace 
$ sed ':a;$!N;s/
/,/;ta' /tmp/test.txt 1,2,3

 
간결 한 표기 법:
[Sat Nov 03 10:04 PM] [kodango@devops] ~/workspace 
$ paste -sd, /tmp/test.txt 
1,2,3

 
5. 중복 줄 걸 러 내기
파일 내용 이 다음 과 같다 고 가정 합 니 다.
[SatNov0310:16 PM][kodango@devops]~/workspace 
$ sort /tmp/test.txt 
1123

 
자주 사용 하 는 방법:
[SatNov0310:16 PM][kodango@devops]~/workspace 
$ sort /tmp/test.txt | uniq
123
 
간단 한 표기 법:
[SatNov0310:16 PM][kodango@devops]~/workspace 
$ sort /tmp/test.txt -u
123

 
6. grep 단어 찾기
텍스트 의 줄 마다 ip 주소 라 고 가정 합 니 다. 예 를 들 어
[SatNov0310:20 PM][kodango@devops]~/workspace 
$ cat /tmp/ip.list 
10.0.0.110.0.0.1210.0.0.123

 
grep 를 사용 하여 10.0.0.1 이 ip 주 소 를 포함 하 는 지 찾 습 니 다.흔히 볼 수 있 는 쓰기:
[SatNov0310:22 PM][kodango@devops]~/workspace 
$ grep '10.0.0.1\>'/tmp/ip.list 
10.0.0.1

 
간단 한 방법.
[SatNov0310:23 PM][kodango@devops]~/workspace 
$ grep -w '10.0.0.1'/tmp/ip.list 
10.0.0.1
 
그리고 grep 의 - n/- H/- v/- f/- c 이 몇 가지 매개 변 수 는 모두 유용 합 니 다.
 
7. 환경 변수 임시 설정
흔히 볼 수 있 는 쓰기:
[SatNov0310:26 PM][kodango@devops]~/workspace 
$ export LC_ALL=zh_CN.UTF-8[六11月0310:26下午][kodango@devops]~/workspace 
$ date
2012年11月03日星期六22:26:55 CST
 
간결 한 표기 법:
[六11月0310:26下午][kodango@devops]~/workspace 
$ unset LC_ALL

[SatNov0310:27 PM][kodango@devops]~/workspace 
$ LC_ALL=zh_CN.UTF-8 date 
2012年11月03日星期六22:27:43 CST
 
명령 에 앞서 환경 변경 설정 을 추가 하고 현재 명령 을 수행 하 는 환경 만 임시로 변경 합 니 다.
 
8. $1, $2... 등 위치 매개 변수 사용
만약 에 $2, $3 만 사용 하고 싶다 고 가정 하면 흔히 볼 수 있 는 방법 은:
shift
echo "$@"
 
왜 이렇게 안 써 요?
echo "${@:2}"

 
9. 물 러 서서 그 다음 의 서법 을 구한다.
이러한 요구 사항 이 있 을 것 이 라 고 믿 습 니 다. 매개 변수 값 이 제공 되 지 않 았 을 때 기본 값 을 사용 할 수 있 습 니 다. 흔히 볼 수 있 는 쓰기 방법 은:
arg=$1

if[-z "$arg"];then
   arg=0fi
 
간결 한 문법 은 다음 과 같다.
arg=${1:-0}

 
10. bash 특수 매개 변수 - 의 용법
grep 로 문자열 에 - i 가 포함 되 어 있 는 지 찾 으 려 면 이렇게 시도 합 니 다.
[SatNov0310:45 PM][kodango@devops]~/workspace 
$ echo 'abc-i'| grep "-i"Usage: grep [OPTION]... PATTERN [FILE]...Try'grep --help'for more information.[SatNov0310:45 PM][kodango@devops]~/workspace 
$ echo 'abc-i'| grep "\-i"
abc-i

 
간결 한 방법 은:
[SatNov0310:45 PM][kodango@devops]~/workspace 
$ echo 'abc-i'| grep ---i
abc-i

 
bash 에서 - 뒤의 매개 변 수 는 옵션 으로 해석 되 지 않 습 니 다.
 
11. 함수 의 반환 값 은 기본적으로 마지막 줄 문장의 반환 값 입 니 다.
 
# Check whether an item is a function# $1: the function name# Return: 0(yes) or 1(no)function is_function(){local func_name=$1
    test "`type -t $1 2>/dev/null`"="function"}
 사족 을 그리 지 말고 뒤에 return $를 한 줄 더 넣 으 세 요.
 
12. printf 포맷 의 결 과 를 변수 에 할당 합 니 다.
예 를 들 어 숫자 를 16 진법 으로 바 꾸 면 흔히 볼 수 있 는 문법 은 다음 과 같다.
[SatNov0310:55 PM][kodango@devops]~/workspace 
$ var=$(printf '%%%02x'111)

 
간단 한 표기 법 은:
[SatNov0310:54 PM][kodango@devops]~/workspace 
$ printf -v var '%%%02x'111

 
봐 봐 printf 의 help:
[SatNov0310:53 PM][kodango@devops]~/workspace 
$ help printf | grep -A 1-B 1---v
printf: printf [-v var] format [arguments]Formats and prints ARGUMENTS under control of the FORMAT.--Options:-v var	assign the output to shell variable VAR rather than
    		display it on the standard output

 
13. 파일 줄 인쇄
인쇄 파일 의 첫 줄:
head -1 test.txt

 
파일 을 인쇄 하 는 두 번 째 줄:
sed -n '2p' test.txt

 
파일 을 인쇄 하 는 두 번 째 줄 에서 다섯 번 째 줄:
sed -n '2,5p' test.txt

 
파일 을 인쇄 하 는 두 번 째 줄 의 시작 (두 번 째 줄 포함) 5 줄 의 내용:
sed -n '2,+4p' test.txt

 
인쇄 마지막 두 번 째 줄:
$ tail -2 test.txt | head -1
$ tac test.txt | sed -n '2p'

 
14. let 또는 () 명령 을 잘 사용 하여 산술 연산 을 한다.
어떻게 숫자 에 + 연산 을 합 니까? 아마도 당신 은 이렇게 사용 할 것 입 니 다.
a=1
a=`expr a + 1`

 
왜 당신 이 익숙 하지 않 습 니까?
a=1
let a++
let a+=2

 
15. 소프트 연결 이 지정 한 실제 파일 이름 가 져 오기
만약 당신 이 모른다 면, 당신 은 이렇게 얻 을 수 있 습 니 다:
[SatNov0311:12 PM][kodango@devops]~/workspace 
$ ls -l /usr/bin/python | awk -F'->''{print $2}'| tr -d ' '/usr/bin/python2

 
readlink 라 는 명령 이 있다 는 것 을 알 고 있다 면:
[SatNov0311:13 PM][kodango@devops]~/workspace 
$ readlink /usr/bin/python
/usr/bin/python2

 
16. 문자 ASCII 코드 가 져 오기
 
[SatNov0311:14 PM][kodango@devops]~/workspace 
$ printf '%02x'"'+"2b[SatNov0311:30 PM][kodango@devops]~/workspace 
$ echo -n '+'| od -tx1 -An| tr -d ' '2b

 
17. 파일 비우 기
흔히 볼 수 있 는 용법:
echo ""> test.txt

 
간단 한 표기 법:
> test.txt

 
18 here document 있 는 거 잊 지 마 세 요.
다음 코드:
grep -v 1/tmp/test.txt |while read line;do
    let a++
    echo --$line--done

echo a:$a

 
실행 후 무슨 문제 가 있 습 니까?
[SunNov0405:35 AM][kodango@devops]~/workspace 
$ sh test.sh 
--2----3--
a:

 
a 라 는 변 수 는 할당 되 지 않 았 습 니 다. 왜 일 까요? 파이프 뒤의 코드 는 키 셸 에서 실행 되 기 때문에 변경 사항 은 현재 셸 에 영향 을 주지 않 습 니 다. 자 연 스 럽 게 a 라 는 변 수 는 할당 되 지 않 습 니 다.
생각 을 바 꾸 면 이렇게 할 수 있다.
grep -v 1/tmp/test.txt >/tmp/test.tmp

while read line;do
    let a++
    echo --$line--done</tmp/test.tmp

echo a:$a
rm -f /tmp/test.tmp

 
임시 파일 이 하나 더 생 겼 습 니 다. 마지막 으로 삭제 해 야 합 니 다. 여 기 는 사실 here document 에 사용 할 수 있 습 니 다.
while read line2;do
    let b++
    echo ??$line2??done<< EOF
`grep -v 1 /tmp/test.txt`
EOF

echo b: $b

 
here document 는 스 크 립 트 의 help 함수 와 같은 큰 텍스트 를 출력 해 야 하 는 곳 에 사 용 됩 니 다.
 
19. 문자열 의 첫 번 째 또는 마지막 문 자 를 삭제 합 니 다.
문자열 을 다음 과 같이 가정 합 니 다:
[SunNov0410:21 AM][kodango@devops]~/workspace 
$ str="aremoveb"

 
아마도 당신 의 첫 번 째 생각 은 sed 나 다른 명령 을 통 해 이 기능 을 완성 하 는 것 일 것 입 니 다. 그러나 사실은 아주 간단 한 방법 이 있 습 니 다.
[SunNov0410:24 AM][kodango@devops]~/workspace 
$ echo "${str#?}"
removeb

[SunNov0410:24 AM][kodango@devops]~/workspace 
$ echo "${str%?}"
aremove

 
비슷 하 게 2 개, 3 개, 4 개 를 삭제 할 수 있 습 니 다.
첫 번 째 문자 와 마지막 문 자 를 한꺼번에 삭제 하 는 방법 이 있 습 니까? 답 은 당연히 긍정 적 입 니 다.
[SunNov0410:26 AM][kodango@devops]~/workspace 
$ echo "${str:1:-1}"
remove

 
이러한 변수 교체 에 관 한 내용 은 bash 의 man 매 뉴 얼 에 설명 되 어 있 습 니 다.
 
20. 쉼표 join 배열 요 소 를 사용 합 니 다.
배열 요소 에 빈 칸 이 없다 고 가정 하면 이런 방법 을 사용 할 수 있 습 니 다.
[SunNov0410:14 AM][kodango@devops]~/workspace 
$ a=(123) 
$ b="${a[*]}"[SunNov0410:15 AM][kodango@devops]~/workspace 
$ echo ${b///,}1,2,3

 
주의: 이 배열 의 길이 가 매우 길 때 이런 교체 시간 을 사용 하면 비용 이 많이 들 고 성능 이 떨 어 지 므 로 sed 를 추천 합 니 다.
배열 요소 에 빈 칸 이 포함 되 어 있다 고 가정 하면 printf 명령 을 사용 하여 도달 할 수 있 습 니 다.
[SunNov0410:15 AM][kodango@devops]~/workspace 
$ a=(1"2 3"4)[SunNov0410:15 AM][kodango@devops]~/workspace 
$ printf ",%s""${a[@]}"| cut -c2-1,23,4

 
21. Shell 의 다 중 프로 세 스
명령 행 아래 명령 행 뒤에 & 기 호 를 추가 하여 이 명령 을 배경 에서 실행 합 니 다. 셸 스 크 립 트 에서 "(cmd)"를 사용 하면 fork 키 셸 로 명령 을 수행 할 수 있 습 니 다. 이 두 가 지 를 이용 하여 셸 의 다 중 스 레 드 를 실현 할 수 있 습 니 다.
job_num=10function do_work(){
    echo "Do work.."}for((i=0; i < job_num ;i++));do
    echo "Fork job $i"(do_work)&done

wait   # wait for all job done
echo "All job have been done!"

 
마지막 wait 명령 을 주의 하 십시오. 모든 하위 프로 세 스 가 끝 날 때 까지 기다 리 는 역할 을 합 니 다.
몇 가지 팁 을 첨부 합 니 다:
1)sudo iptables -L -n | vim -
2)grep -v xxx | vim -
3)echo $'\''
4)set -- 1 2 3; echo "$@"
5)搜索stackoverflow/superuser等站点
6)VIM编辑远程文件 vim scp://xxx//etc/vimrc
7)远程执行脚本 ssh xxx bash < xxx.sh

 
더 많은 내용 은 이 시리즈 의 다음 글 을 보십시오. 간결 한 Bash Programming 기법 속편
(최근 일주일 넘 게 sed 에 관 한 일련의 글 을 썼 다. Sed & awk 필기 sed 편
 
옮 겨 싣 기: 둥 근 둥지, 본 고의 고정 링크: 간결 한 Bash Programming 기법
 

좋은 웹페이지 즐겨찾기