1. 程式人生 > >Shell程式設計零基礎教學

Shell程式設計零基礎教學

Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。Ken Thompson 的 sh 是第一種 Unix Shell,Windows Explorer 是一個典型的圖形介面 Shell。

正則表示式

在學習shell程式設計要有一定的正則表示式的基礎知識。

    符號                含義                        舉例
    ^                  開始標記                 "^abc"滿足的例子abc
    ^                 非(在[]內)             "[^abc]"滿足例子:ddd、mpd
    $                  結束標記                "abc$"滿足例子:abc,mmabc
    \               匹配轉義後的字串
    .                  任意字元                "a.c"滿足例子:abc,abcd
    \<               匹配單詞開始               "\<abc"滿足的例子abc、abcd
    \>               匹配單詞結束               "abc\>"滿足的例子abc,pmrabc
    |                   或                     "AAA|BBB"滿足例子:AAA,BBBpp
    ?             匹配前一個字元0或1次           "abc?"滿足的例子ab、mabcd
    好*            匹配錢一個字元>=0次            “abc*”滿足的例子:abbb
    好+            匹配前一個字元>=1次 
    {}          {m}{m,n}{m,}{,n}分別匹配錢一個字元m次、m到n次、>=m次、<=n次
    []          []範圍內選其一,比較特殊的[0-9]代表數字,[a-z]代表小寫字母
    ()         將候選的所有元素放在()內,用|分隔開      "a(1|2|3)b"滿足的例子a1b

這裡寫圖片描述

shell程式設計

  • shell 變數
    環境變數:用於爆粗能作業系統執行時使用的環境變數,用set命令檢視
    可分為使用者環境變數(.bash_profile)和系統環境變數(/etc/profile)

位置變數 :將傳遞給指令碼的引數儲存在位置變數中,以便於在指令碼中引用這些引數
其中Bash定義了9個位置變數,分別是$1 ….指令碼編寫者在指令碼中引用這9個變數,獲取傳遞給指令碼的引數

注意:

       $1    位置引數
       $0     指令碼名稱

例如

shell算術運算

“+”“-” “*”“/”“%”
使用方法

  • $((experssion))
  • $[expression]
  • expr expression

    舉例

    • $((5+4))
    • expr 5/4

注意:expr要有空格 # expr 5 + 2

shell內建測試判斷

這裡寫圖片描述

舉例1
這裡寫圖片描述

[] 方式最常見 注意:測試表達式與中括號之間一定要有空格

舉例2
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

例子3
這裡寫圖片描述
注意 字串一定要打引號

Data

  • Date –s “2017-06-19 07:30:13” 修改系統時間(臨時)
  • Date ‘+%Y%m%d’ 20170609 輸出時間 按年月日
  • Date –d ‘7 day ago’ ‘+%Y%m%d’ 輸出7天前的日期

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

指令碼案例

#!bin/bash               宣告環境
#test               以#開頭的部分全部表示註釋
#shell指令碼從上往下依次執行
date
grep 'root' /etc/passwd

執行Shell指令碼
新增許可權命令: chmod 744 1.sh
./1.sh (./ 表示當前目錄)

. /temp/1.sh 表示執行這個檔案

控制語句

for

這裡寫圖片描述
舉例1:
這裡寫圖片描述

例子2

#!/bin/bash
for i in {1..10}
do 
mkdir /home/zxq/shell/test/dir$i
done

這裡寫圖片描述

這裡寫圖片描述

#!/bin/bash
for i in ‘seq 50’   #反應好代表命令預先執行
do 
mkdir /home/zxq/shell/test/dir$i
done

#!/bin/bash
For((i=1;i<=10;i++))
Do
Sum=$((SUM+1))
Done
Echo $SUM

while

這裡寫圖片描述

#!/bin/bash
i=1
while [ $i –le 10 ]      #注意空格
do
SUM=$((SUM+i))
i=$[i+1]
done
echo $SUM

讀取檔案
#!/bin/bash
while read –r line     #read    逐行讀取
do
echo $line
done < /etc/passwd     # < 後面接檔案

這裡寫圖片描述

這裡寫圖片描述

if

這裡寫圖片描述

#!/bin/bash
if [ 3 –eq 3 ]  #注意 if後面要有空格  [] 也要有空格
then 
echo yes
fi

這裡寫圖片描述

case

這裡寫圖片描述

#!/bin/bash
case $1 in 
top)
    top
    ;;
free)
    free
    ;;
df)
    df
    ;;
*)
    echo "usage:$0{top|free|df}"
esac

這裡寫圖片描述

這裡寫圖片描述

Shell 函式

這裡寫圖片描述

#!/bin/bash
sum(){
    echo $(($1+$2))
}
sum 5 6

計劃任務

一次性的計劃任務

這裡寫圖片描述

週期性的計劃任務

crontab

1)確保服務啟動

service crond status
chkconfig --list

2)制定計劃任務內容

Crontab –e

和vi介面一樣進行輸入 * * * * * cmd 前面五列表示時間用空格分開

這裡寫圖片描述

例如:

0 2 * * 3 cp /etc/passwd /tmp       
每週三凌晨2點備份檔案/etc/passwd 到tem資料夾中

5 1 10,25 * *   rm –rf /tmp/*   
 每個月10號和25號凌晨1點5分執行(沒半個月清空一次tmp)

*/10 * * * * ntpdata 時間伺服器IP    
每10分鐘執行時間同步

0 1-6 * * *                        
 每天1點到6點執行

3)重啟crond服務

service crond restart