shell語法快速入門(1)

#獲得絕對路徑
DIR=$(cd `dirname $0`;pwd)
$DIR/file.txt
#去掉#註釋
egrep -v "(#|^$)" /etc/zabbix/zabbix_server.conf
 
基本語法:
  • export 變量=變量值    聲明全局變量
  • unset $變量名  清空變量
  • read  -p "真的卸載?(yes|no)"  flag
  • 使用 read [-p "提示信息" ] 變量名 聲明交互變量
  • 常見環境變量$USER $LOGNAME $UID $SHELL $HOME $PWD $PATH $PS1 $PS2
  • $n (n在1-9之間)位置變量
  • 預約義變量:
                     $#傳遞到當前腳本的參數的總個數,
                     $*以一個單字符串顯示全部向腳本傳遞的參數,
                     $?上一條指令執行後返回的狀態,
                     $$當前所在進程的進程號,$!後臺運行的最後一個進程,
                     $0當前執行的進程程序名
  • 條件斷定:
                    &&成功執行一個命令,再執行下一個命令    modprobe ppp-compress-18 && echo success
                    ||一個命令執行失敗後再執行下一個命令
                    ()在一個子shell裏執行的一組命令     {}在當前shell裏執行一組命令,修改變量值當即起效
  • 多種括號的使用
                    ((  ))多用於計算表達式    [[   ]]  語法最兼容,邏輯判斷    ()   優先級最高    [   ]  邏輯判斷,兼容性不高
  • 運算    加`expr $1 + 2` 減  `expr $1 -2 `  除`expr $1 / 2`  
  • 經常使用文件斷定
        -e文件存在               -f 文件是個普通文件        -s 文件大小不爲零
        -d 文件是一個目錄     -b 文件是一個塊設備              -c 文件是一個字符設備
         -p 文件是一個管道       -h|-L 文件是一個符號連接       -s 文件是一個socket
         -t 文件與一個終端設備相關     -r 文件是否可讀           -w 文件是否可寫             -x 文件是否可執行
        f1 -nt f2 文件f1比f2新    f1 -ot f2 文件f1比f2舊    f1 –ef f2 文件f1與f2是相同文件的硬連接
  • 字符串斷定
            -z 字符串爲null          -n 字符串不爲null
  • 數值斷定
            -eq 等於     –ne不等於     –gt大於 
            –ge大於等於    –lt 小於         –le 小於等於 
  • 經常使用斷定符
            =  != 可在[ ]中使用
            <  <=  >=  > 可在雙括號內 [[ ]] 使用
  • 邏輯斷定
            -a 邏輯與    -o 邏輯或
 
條件判斷if
 if [ $# = 0 ] ;then           // [ =  ]間有空格, then前有;號
    ...
elif [  $a -lt 3 ];then
...
fi
多條件判斷
    if [ -n $port1 ] && [ -n $port2 ] && [ -n $port3 ] && [ -n $port4 ] && [ -n $port5 ];then
    if [ -n $port1 ] || [ -n $port2 ] || [ -n $port3 ] || [ -n $port4 ] || [ -n $port5 ];then
注意:若是if 的條件中包含字符串變量變量,請注意使用「」,如:if [ -z "$test" ];then
 
條件判斷case
case  $letter   in
  U|u) whoami ; ;
  L|l) ls –l / ; ;
  E|e)exit ;;
  *) echo 「please input true parm!!!」 ; ;
esac
 for 循環
 (使用return  0或1來退出循環)
格式1:
  int j=0
   for i in $arr   //$arr爲鏈表
   do
    echo "第$j次循環"
    j=`expr $j + 1`
   done
格式2:
    for (( i = 0; i < $len ; i++ )) ; do
        echo "第$i次循環"
    done
 
 while循環
(使用return  0或1來退出循環)
格式:
  While [ $num  –lt  10  ]
  Do 
  Done
 
sample1:
    while [ $# -ne 2 ]
    do
        echo "輸出$#"
        sleep 1            //休息1s
        if [ $i -eq 100 ]
        then
        break //退出
        fi
        shift
    done
 
until循環
 (使用return  0或1來退出循環)
  Util [ $num –lt 10 ]
  Do
  Done
 
數組
聲明
array[key]=value #array[0]=one,array[1]=two
declare -a array   #array被看成數組名
array=( value1 value2 value3 ... )
array=( [1]=one [2]=two [3]=three )
array="one two three" # echo ${array[0|@|*]}  把array變量看成數組來處理,但數組元素只有字符串元素自己
訪問
${array[key]}  #${array[1]}
${array[@|*]}    #輸出全部元素
${array[@]:1}    #從第二(1+1)個元素開始,後面全部的元素
${array[@]:0:2} #從第一(0+1)個元素開始的兩個元素
${array[@]:1:3}  #從第二個元素開始的三個元素
${#array}       #計算數組第一個元素的長度
${#array[0]}    #同上
${#array[*}}     #計算數組的個數
${#array[@]}     #同上
刪除
unset array[1]  #刪除數組中的第一個元素
unset array #刪除整個數組
${array[@]#t*e} #刪除字符串左邊開始最短的匹配t*e
${array[@]##t*e} #刪除字符串左邊開始最長的匹配t*e
${array[@]%o}   #刪除字符串右邊開始最短的匹配
${array[@]%%o}   #刪除字符串右邊開始最長的匹配
字串替換
${array[@] /o/m} #數組中全部的o都會被替換爲m
${array[@] /o/}    #全部匹配到的o都會被刪除
${array[@] /#o/m}  #數組已o開頭的匹配將會被替換
${array[@] /%o/m}  #數組已o結尾的匹配將會被替換
sample排序
bak_date_ns=(`cat $tmpfile1|awk -F "." '{print $1}'`)   //排序前
bak_date=($(for val in "${bak_date_ns[@]}"  //排序後
        do
          echo "$val"
        done|sort)
       )
 
函數
使用函數的好處:能夠將一組功能打包,在同一shell中,屢次調用。
函數的聲明
function chk_clientip() #檢驗client_ip參數
{
         if_net_well=0
         cle_ip=$1
         client_ip=$2
         server_ip=$3
         if [ -n "$cle_ip" ]  &&  [ -n "$client_ip" ] && [ -n "$server_ip" ];then
    if_net_well=1
         fi
        return $if_net_well
}
函數的調用
chk_clientip $cle_ip $client_ip $server_ip
result=$?    //函數執行結果,返回的$if_net_well 的值
 
正則表達式:
ip地址 [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$
相關文章
相關標籤/搜索