셸 script 입문 축적

1.1 형식
1.셸 스 크 립 트,한 줄 에 여러 명령 을 쓸 수 있 지만 명령 사이 에 사용 해 야 합 니 다.한 줄 에 명령 만 쓰 면 쓰 지 않 아 도 됩 니 다....하면 된다
  셸 변수 전체:  세 가지 로 나 뉜 다:일반적인 변수  환경 변수  특수 위치의 변수:URL  셸 변수 전체:http://zccst.iteye.com/blog/1135109
 export 변수/etc/profile ~/.bash_profile   ~/.bashrc  
http://blog.sina.com.cn/s/blog_67146a750100y6zr.html
http://linux.chinaunix.net/doc/system/2005-02-03/1084.shtml
2. 테스트 명령[ -d DIR ]
만약DIR존재 하고 디 렉 터 리 가 있다 면 정말 입 니 다.[ -f FILE ]
[ -s FILE ]
[ -z FILE ]

만약 에FILE존재 하고 일반 파일 이 진실 이 라면 FILE 파일 이 비어 있 지 않 으 면 파일 에 데이터 가 있 으 면 진실 입 니 다.만약 에 FILE 파일 이 비어 있 으 면 파일 에 데이터 가 없 으 면 진실 입 니 다.[ -z STRING ]
길이 가 0 이면 진짜 입 니 다.STRING
길이 가 0 이 아니면 진짜 입 니 다.[ -n STRING ]
두 문자열 이 같 으 면 진짜 입 니 다.STRING
문자열 이 다 르 면 진짜 입 니 다.[ STRING1 = STRING2 ]
4.567914.와 4.567914.정수 또는 수치 가 정수 인 변수 여야 한다.
정수,문자열 비교 형식:
http://www.cnblogs.com/happyhotty/articles/2065412.html
C 언어 와 유사 하고 테스트 조건 간 에 비 논리 적 연산 도 할 수 있 습 니 다.[ STRING1 != STRING2 ]
4.567914.위 표 의 임 의 테스트 조건 이 될 수 있 습 니 다!논리[ ARG1 OP ARG2 ]
4.567914.와 4.567914.위 표 의 임 의 테스트 조건 일 수 있 습 니 다.4.567914.논리 와ARG1
4.567914.와 4.567914.위 표 의 임 의 테스트 조건 일 수 있 습 니 다.4.567914.논리 또는
2.if/elseif/else 형식
#!/bin/bash
name=$1
if [ $name = "shuming" ];then
   echo "hello,shuming"
elif [ $name = "caohong" ]; then
   echo "hello,caohong"
else
   echo "hello,erverone"
fi
(1) if [  사이
빈 칸 분리,그렇지 않 으 면 문법 오류 가 발생 할 수 있 습 니 다.
(2) elif    ----->elseif 아니에요.
(3)]then 사이 에 사용 하기;칸 막 이
(4)반드시 fi   if 구조의 끝 을 표시 합 니 다.
(5)크기 비교[]주의사항:양쪽 칸 띄 우기,-eq-ne -gt -lt -ge -le  
if else 형식 도&&로 구현 할 수 있 습 니 다.command 1&command 2 는 command 1 이 성공 적 으로 실 행 된 후에 만 command 2 를 실행 할 수 있 습 니 다.
test "$(whoami)" != "root" && echo "it is net root running!"

whoami 가 root 라면 뒤의 문 구 를 실행 하지 않 습 니 다.
#/bin/bash
kfc_proc_count=`ps -u ads|grep kfc|wc -l`;
disp_proc_count=`ps -u ads|grep dispatch|wc -l`;

ret=`ps aux|grep ads|grep -v grep|grep dispatch`;
ret_wc=`ps aux|grep ads|grep -v grep|grep dispatch|wc -l`;
isbindip=`/sbin/ifconfig|grep 172.24.130.33|wc -l`;
ismain=`echo $ret|grep main|wc -l`;     ---->echo  cat   
isext=`echo $ret|grep ext|wc -l`;
if [ $kfc_proc_count = 1 ] && [ $disp_proc_count = 1 ];then    ---> &&  ||      

    if [ $ismain = 1 ] && [ $isbindip = 1 ]; then
       main_ext_OK=1;
    elif [ $isext = 1 ] && [ $isbindip = 0 ]; then
       main_ext_OK=1;
    else
       main_ext_OK=0;
    fi
else
    main_ext_OK=0;
fi
if [ -f "$file" -a `cat $file  2>/dev/null|grep -v '^#'|grep "$key"|wc -l` -gt 0 ]; then
                return 0
        else
                return 1
fi

3.case/esac 구조
case 명령 은 C 의 switch/case 문 구 를 유추 할 수 있 으 며,esac 는 case 문장의 끝 을 나타 낸다.C 언어의 case 는 정형 이나 문자 형 상수 표현 식 만 일치 할 수 있 고 셸 스 크 립 트 의 case 는 문자열 과 Wildcard 를 일치 시 킬 수 있 습 니 다.각 일치 하 는 지점 마다 몇 가지 명령 이 있 을 수 있 으 며 끝 은 반드시 있어 야 합 니 다. 끝 났 습 니 다.실행 할 때 첫 번 째 일치 하 는 가 지 를 찾 아 해당 하 는 명령 을 실행 한 다음 에 esac 로 바로 이동 한 후에 C 언어 처럼 break 에서 뛰 어 나 올 필요 가 없습니다.
#!/bin/bash
echo "Is it morning? Please answer yes or no."
read yes_or_no
case "$yes_or_no" in
  yes|y|YES|Y)
      echo "Good morning";;
  [nN]*)
      echo "Good afternon";;
  *)
      echo "It is error"
esac

(1)case  변수 
(2)대응 하 는 값)  괄호 가 반 개 밖 에 없어 요.
(3)각 분기 대응 명령 뒤 에는;칸 막 이,마지막 으로 안 써!
(4)esac 종료 case 문장
#!/bin/bash
case $1 in
  start)
     echo "start the process of apache"
     echo "ok,start";;
  stop)
     echo "stop the process of apache";;
  restart)
      echo "restart the process of apache";;
  reload|force-reload)
     echo "reload the configfile";;
  *)
     echo "It is error"
esac

4. for/do/done  순환 하 다.
4
#!/bin/bash
for var in cao shu ming
do
  echo "I like $var"
  echo "Hello everyone"
done
(1)var 는 변수(스스로 설정 하면 됩 니 다)이 고 in 다음은 문자 직렬 입 니 다.
(2) do  ------done 
인쇄 결과:
[[email protected] ~]$ ./shuming.sh I like shuming Hello everyone I like caohong Hello everyone I like liuchao Hello everyone
문자열 줄 이 반드시 일련의 문자열 을 누적 하 는 것 이 아니 라 다른 명령 의 결과 일 수 있 습 니 다.
for 순환 용법 대전:http://hi.baidu.com/plp_cm/blog/item/d828d1881b05e2faf11f3607.html
4.while/do/done 구조
#!/bin/bash
for var in $(awk -F: '{print $1}' /home/caoshuming.pt/t.txt)
do
  echo "I like $var"
  echo "Hello everyone"
done
(1)  do  done 구조
(2)  판단 조건 [  *****  ]  
#!/bin/bash
num=0
while [ $num -ne 10 ]
do
   echo "please inter number"
   read num
done
echo "the num is 10"
파일 t.txt 의 데 이 터 를 읽 고 모든 행동 기준 으로:
[[email protected] ~]$ ./shuming.sh dkdkjfafja aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbb cccccccccccccccccc eeeeeeeeeeeeeeeeee
5.함수 구조
 #!/bin/bash
  2 while read line
  3 do
  4    echo $line
  5 done < t.txt
(1)함 수 는 먼저 정의 한 후에 호출 해 야 한다.
(2)함수 안의$1$2 는 함수 뒤의 매개 변 수 를 호출 하 는 것 입 니 다.$1$2 는 함수 내부 에서 외부 매개 변수 에 영향 을 주지 않 습 니 다.
(3)만약{ 명령 과 한 줄 에 있 으 면 빈 칸 으로 구분 하고 여러 명령 을 같은 줄 에 사용 해 야 합 니 다.분리 하고 마지막 명령 이}과 같은 줄 에 있 으 면 명령 뒤에 추가 합 니 다.
(4).함수 직접 호출 isdirectory "dir"   반환 값 이 반환 값 을 설정 하면  정수   a=$?  반환 값 을 가 져 오 면 됩 니 다.
(5). exit 0  스 크 립 트 추출   모든.sh 의 실행 을 끝 냅 니 다.
6.파일,디 렉 터 리 존재 여부 판단
 #/bin/bash
is_directory()
{
  DIR_NAME=$1
  if [ ! -d $DIR_NAME ]; then
    return 1
  else
    return 0
  fi
}
for DIR in "$@"; do
  if is_directory "$DIR"
  then :
  else
    echo "$DIR doesn't exist. Creating it now..."
    mkdir $DIR > /dev/null 2>&1
    if [ $? -ne 0 ]; then
      echo "Cannot create directory $DIR"
      exit 1
    fi
  fi
done

3.일반 파일 은  [ -f $file ]  경 로 는[-d path]  파일 이 든 경로 든 존재 여 부 를 판단 하 는 것 이 라면-e 매개 변수 로   [ -e /.../ ]
#!/bin/sh  
  
myPath="/var/log/httpd/"  
myFile="/var /log/httpd/access.log"  
  
#   -x     $myPath                 
if [ ! -x "$myPath"]; then  
mkdir "$myPath"  
fi  
  
#   -d     $myPath      
if [ ! -d "$myPath"]; then  
mkdir "$myPath"  
fi  
  
#   -f    $myFile      
if [ ! -f "$myFile" ]; then  
touch "$myFile"  
fi  
  
#      -n,-n               
if [ ! -n "$myVar" ]; then  
echo "$myVar is empty"  
exit 0  
fi  
  
#            
if [ "$var1" = "$var2" ]; then  
echo '$var1 eq $var2'  
else  
echo '$var1 not eq $var2'  
fi  

그 중에서 주의해 야 할 것 은 eval 의 용법:eval 의 기능 은 명령 을 실행 하기 전에 먼저 명령 을 스 캔 하여 진행 하 는 것 입 니 다.
모든 교체,eval 은 한 번 의 스 캔 으로 완전히 교체 할 수 없 는 상황 에서 eval 은 두 번 의 스 캔 을 통 해 명령 의 변수 와 다른 직접 사용 하지 않 는 변 수 를 모두 교체 할 수 있 도록 합 니 다.

좋은 웹페이지 즐겨찾기