시스템 관리 중 bash 셸 스 크 립 트 상용 방법 요약

10059 단어
시스템 관리 중 bash 셸 스 크 립 트 상용 방법 요약
일상적인 시스템 관리 작업 에서 특정한 기능 을 수행 하기 위해 스 크 립 트 를 작성 해 야 합 니 다. 셸 스 크 립 트 를 작성 하 는 것 은 기본 적 인 기능 입 니 다!작성 하 는 과정 에서 자주 사용 하 는 기교 와 문법 을 파악 하면 대부분의 기능 을 완성 할 수 있 습 니 다. 즉, 2/8 원칙 입 니 다.
1. 작은 따옴표 와 작은 따옴표 의 차이
작은 따옴표 와 작은 따옴표 의 가장 큰 차이 점 은 작은 따옴표 가 변수의 내용 을 인용 할 수 있 지만 작은 따옴표 안 은 일반 문자 일 뿐 변수의 인용 을 하지 않 고 문 자 를 직접 출력 하 는 것 입 니 다.다음 과 같은 예 를 보십시오.
  [root@linux ~]# name=HaHa
[root@linux ~]# echo $name
HaHa
[root@linux ~]# myname="$name is wow"
[root@linux ~]# echo $myname
HaHa is wow
[root@linux ~]# myname='$name is wow'
[root@linux ~]# echo $myname
$name is wow

위의 예 에서 보 듯 이 작은 따옴표 를 사 용 했 을 때 $name 은 보통 문자 일 뿐 직접 출력 할 뿐 입 니 다!
2. 한 줄 씩 파일 읽 기
  • 순환 을 위해 파일 읽 기
      for line in `cat file.txt`
    do
    echo $line
    done
  • 메모: for 를 사용 하여 파일 의 줄 을 읽 을 때 자동 으로 빈 칸 과 줄 바 꿈 자 를 같은 구분자 로 합 니 다. 줄 에 빈 칸 이 있 을 때 출력 결과 가 복잡 하기 때문에 줄 연속 으로 빈 칸 이나 줄 바 꿈 자 를 가 질 수 없 는 파일 에 만 적 용 됩 니 다.
  • while 순환 으로 파일 읽 기
      cat file.txt |while read line
    do
    echo $line
    done



    while read line
    do
    echo $line
    done < file.txt
  • 메모: while 를 사용 하여 파일 의 줄 을 읽 을 때 전체 줄 로 읽 기 때문에 줄 의 내용 (빈 칸..) 에 관심 이 없 기 때문에 for 읽 기 파일 보다 더 좋 은 적용 성 이 있 습 니 다. while 순환 으로 파일 을 읽 는 것 을 추천 합 니 다.
    3. bash 셸 스 크 립 트 에서 자주 사용 되 는 변수
    $0
    현재 실행 중인 스 크 립 트 나 명령 이름
    $1-$9
    매개 변수의 위 치 를 대표 합 니 다. 예 를 들 어 $1 은 첫 번 째 매개 변 수 를 대표 합 니 다.
    $#
    스 크 립 트 호출 매개 변수의 개수
    $@
    모든 매개 변수의 내용
    $*
    모든 매개 변수의 내용
    $$
    현재 실행 중인 스 크 립 트 의 프로 세 스 번호
    $?
    명령 실행 후 되 돌아 오 는 상태
    $!
    배경 에서 실행 되 는 마지막 프로 세 스 번호
    주의: $?이전 명령 이 올 바 르 게 실행 되 었 는 지 확인 하 는 데 사 용 됩 니 다. (Linux 에서 명령 종료 상 태 는 0 으로 명령 이 올 바 르 게 실행 되 었 음 을 표시 합 니 다. 0 값 이 아 닌 명령 이 잘못 되 었 음 을 표시 합 니 다) $$변 수 는 임시 저장 파일 의 이름 으로 임시 저장 파일 이 중복 되 지 않도록 하 는 것 이 가장 흔 합 니 다. $*$@ 과 출력 이 같 지만 for 순환 을 사용 하고 있 습 니 다. 더 블 따옴표 (") 를 사용 할 때"$* "는 하나의 요소 로 출력 되 고"$@ "은 매개 변수 가 하나의 요소 로 출력 됩 니 다.
    테스트 예 를 보십시오
      #cat test.sh
    #!/bin/sh
    echo '"$@" output.....'
    for i in "$@"
    do
    echo $i
    done
    echo '"$*" output ....'
    for i in "$*"
    do
    echo $i
    done

    출력 결과
      #sh test.sh a b c d
    "$@" output.....
    a
    b
    c
    d
    "$*" output ....
    a b c d

    출력 결 과 를 보면 '$*' 출력 은 한 줄 이 고 '$@' 출력 은 네 줄 임 을 알 수 있 습 니 다.
    4. 변수 내용 의 삭제 와 교체
    우 리 는 일부 상황 에서 변수 에 있 는 문 자 를 삭제 하거나 교체 하려 면 다음 표 에 표 시 된 방법 을 사용 해 야 합 니 다.
    변수 설정 방식
    설명 하 다.
    ${변수\# 키워드}
    변수 내용 이 처음부터 시 작 된 자료 가 '키워드' 에 부합 하면 최 단 자 료 를 삭제 합 니 다.
    ${변수\#\# 키워드}
    변수 내용 이 처음부터 시 작 된 자료 가 '키워드' 에 부합 하면 최 장 자 료 를 삭제 합 니 다.
    ${변수% 키워드}
    변수 내용 이 끝 에서 앞으로 의 자료 가 '키워드' 에 부합 하면 가장 짧 은 자 료 를 삭제 합 니 다.
    ${변수%% 키워드}
    변수 내용 이 끝 에서 앞으로 의 자료 가 '키워드' 에 부합 하면 가장 긴 자 료 를 삭제 합 니 다.
    ${변수/오래된 문자열/새 문자열}
    변수 내용 이 '오래된 문자열' 에 맞 으 면 '첫 번 째 오래된 문자열 은 새 문자열 로 대 체 됩 니 다.
    ${변수//오래된 문자열/새 문자열}
    변수 내용 이 '오래된 문자열' 에 맞 으 면 '모든 오래된 문자열 이 새 문자열 로 대 체 됩 니 다.
    예 를 들 어 다음 과 같 습 니 다.
      [root@linux ~]# export test_str="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
    [root@linux ~]# echo ${test_str#/*kerberos/bin:}
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    5. 변수 조건 테스트 할당
    어떤 때 에 우 리 는 특정한 변수 가 존재 하 는 지 판단 해 야 합 니 다. 변수 가 존재 하면 이 변 수 를 새로운 변수 에 할당 하고 변수 가 존재 하지 않 으 면 다른 값 을 새로운 변수 에 할당 합 니 다.
    변수 설정 방식
    str 정의 되 지 않 음
    str 빈 문자열
    str 가 비어 있 지 않 은 문자열 로 할당 되 었 습 니 다.
    var=${str-expr}
    var=expr
    var=
    var=$str
    var=${str:-expr}
    var=expr
    var=expr
    var=$str
    var=${str+expr}
    var=
    var=expr
    var=expr
    var=${str:+expr}
    var=
    var=
    var=expr
    var=${str?expr}
    expr 를 stderr 로 출력
    var=
    var=$str
    var=${str:?expr}
    expr 를 stderr 로 출력
    expr 를 stderr 로 출력
    var=$str
    var=${str=expr}
    var=expr
    var=
    var=$str
    var=${str:=expr}
    var=expr
    var=expr
    var=$str
    예 를 들 면 다음 과 같다.
      [root@linux ~]# test_name=""
    [root@linux ~]# test_name=${test_name-root}
    [root@linux ~]# echo $test_name
    <== test_name ! !
    [root@linux ~]# test_name=${test_name:-root}
    [root@linux ~]# echo $test_name
    root <== ‘:’ , !

    기본적으로 이러한 변수의 테스트 도 셸 script 안의 if... then 을 통 해 처리 할 수 있 습 니 다. 그러나 상기 에서 언급 한 간단 한 방법 으로 변 수 를 테스트 하 는 것 은 프로그램 이 더욱 간소화 해 보 입 니 다!
    6. 셸 의 구분자: 변수 IFS 사용
    셸 스 크 립 트 에서 for 를 사용 하여 한 문 자 를 반복 하면 기본적으로 빈 칸 으로 문 자 를 나 눕 니 다. 그리고 앞에서 언급 한 for 순환 을 사용 하여 한 줄 한 줄 씩 파일 내용 을 읽 을 때 파일 줄 에 빈 칸 이 있 으 면 출력 결과 도 어 지 럽 습 니 다. 이 럴 때 IFS 변 수 를 사용 하여 특정한 문자 분할 문 자 를 설정 하여 출력 이 올 바른 목적 을 달성 합 니 다. 기본 값 으로 는 IFS 변 수 를 사용 합 니 다.IFS 는 < space > < tab > < new line >, 빈 칸 't' n 을 기본 분할 문자 로 사용 합 니 다.
    앞에서 for 를 사용 하여 파일 을 한 줄 씩 읽 는 예 를 개선 하면 출력 이 정확 합 니 다. 아래 를 보십시오.
      #!/bin/bash
    IFS_old=$IFS # IFS ,
    IFS=$’"n’ # IFS $’"n’
    for line in `cat file.txt`
    do
    echo $line
    done

    file. txt 파일 내용 은 다음 과 같 습 니 다.
      [root@linux]$ cat file.txt
    sdfsdfsdfsdf
    ssssss ssssss ssssss sssss
    sdfsdfsdfsdfsdf

    테스트 프로그램 출력 결 과 는 다음 과 같 습 니 다 (올 바른 출력)
      [root@linux]$ sh test.sh
    sdfsdfsdfsdf
    ssssss ssssss ssssss sssss
    sdfsdfsdfsdfsdf

    IFS 변수 가 설정 되 어 있 지 않 으 면 기본 IFS 변수 값 을 사용 합 니 다. 출력 결 과 는 다음 과 같 습 니 다.
      [root@linux]$ sh test.sh
    sdfsdfsdfsdf
    ssssss
    ssssss
    ssssss
    sssss
    sdfsdfsdfsdfsdf

    상기 테스트 프로그램의 출력 결 과 는 자신의 수요 에 따라 IFS 변 수 를 설정 할 수 있 습 니 다. 예 를 들 어 다음 과 같 습 니 다.
      while IFS=: read userName passWord userID groupID geCos homeDir userShell
    do
    echo "$userName -> $homeDir"
    done < /etc/passwd

    7. 셸 배열 의 사용
    배열 할당 방식:
      (1) array=(var1 var2 var3 ... varN)
    (2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
    (3) array[0]=var1
    arrya[1]=var2
    ...
    array[n]=varN

    배열 요소 의 개수 나 길 이 를 계산 합 니 다:
      (1) ${#array[@]}
    (2) ${#array[*]}

    배열 기초 문법 을 알 게 되 었 습 니 다. 예 를 들 어 설명 하 겠 습 니 다. 보 세 요.
      #!/bin/bash
    NAMESERVERS=("ns1.www.net." "ns2.www.net." "ns3.www.net.")
    #
    tLen=${#NAMESERVERS[@]}

    #
    for (( i=0; i<${tLen}; i++ ));
    do
    echo ${NAMESERVERS[$i]}
    done

    복잡 한 예 를 보고 파일 내용 을 배열 로 읽 습 니 다.
      #!/bin/bash

    # IFS ("n)
    OLDIFS=$IFS
    IFS=$'"n'

    #
    fileArray=($(cat file.txt))

    # restore it
    IFS=$OLDIFS
    tLen=${#fileArray[@]}

    #
    for (( i=0; i<${tLen}; i++ ));
    do
    echo "${fileArray[$i]}"
    done

    8. 논리 적 판단 조건 테스트
  • 파일 속성 에 대한 판단
  • 조작 부호
    테스트 결과
    -e filename
    파일 이 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    -r filename
    파일 을 읽 고 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    -w filename
    파일 은 1 을 되 돌려 쓸 수 있 습 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    -x filename
    파일 은 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    -o filename
    파일 은 사용자 본인 이 1 로 돌아 가 는 것 입 니 다. 그렇지 않 으 면 0 으로 돌아 갑 니 다.
    -z filename
    파일 길 이 는 0 으로 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    -f filename
    파일 은 일반 파일 로 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    -d filename
    파일 이 디 렉 터 리 파일 일 때 1 을 되 돌려 줍 니 다. 그렇지 않 으 면 0 을 되 돌려 줍 니 다.
    예 를 들 어 다음 과 같이 파일 이 존재 하 는 지 테스트 합 니 다.
      #!/bin/bash
    echo "checks the existence of the messages file."
    echo -n "Checking..."
    if [ -f /var/log/messages ];then
    echo "/var/log/messages exists."
    fi
    echo
    echo "...done."
  • 문자열 비교
  • 조작 부호
    결 과 를 비교 하 다
    str1 = str2
    두 문자열 이 같 을 때 진짜 입 니 다.
    str1 != str2
    두 문자열 이 같 지 않 을 때 진실 이다.
    -n str1
    문자열 의 길이 가 0 보다 클 때 진짜 입 니 다.
    -z str1
    문자열 의 길이 가 0 일 때 진짜 입 니 다.
    str
    문자열 이 비어 있 지 않 을 때 진실 입 니 다.
    예 를 들 어 다음 과 같이 문자열 을 비교 하여 사용자 ID 를 테스트 합 니 다.
      if [ "$(whoami)" != 'root' ]; then
    echo "You have no permission to run $0 as non-root user."
    exit 1;
    fi
  • 수치 비교 (정수)
  • 조작 부호
    결 과 를 비교 하 다
    num1 -eq num2
    두 수가 같 으 면 진짜 가 된다.
    num1 -ne num2
    두 수가 같 지 않 으 면 진짜 가 된다.
    num1 -gt num2
    num 1 이 num 2 보다 크 면 진짜 입 니 다.
    num1 -ge num2
    num 1 이 num 2 보다 크 면 진짜 입 니 다.
    num1 -lt num2
    num 1 이 num 2 보다 작 으 면 진짜 입 니 다.
    num1 -le num2
    num 1 보다 작 으 면 num 2 가 진짜 입 니 다.
    예 를 들 면 다음 과 같다.
      num=`wc -l work.txt`
    if [ $num -gt 150 ];then
    echo "you've worked hard enough for today."
    echo
    fi

    자세 한 테스트 동작 을 보 려 면 man 매 뉴 얼 man test 를 볼 수 있 습 니 다.

    좋은 웹페이지 즐겨찾기