Linux運維第6天:Linux下shell編程

shell編程:


編譯器,解釋器


編程語言:機器語言,彙編語言,高級語言


靜態語言:編譯型語言
    強類型
    關鍵字
    事先轉換成可執行格式
    C,C++,JAVA,C#
    
動態語言:解釋性語言
    弱類型
    邊解釋邊執行(on the fly)
    PHP,SHELL,python,perl
    
bash:腳本解釋器


面向對象
面向過程


變量:內存空間,命名


內存:編址的存儲單元


變量類型:事先確定數據的存儲格式和長度
    字符
    數值
        整型
        浮點型
    
強類型:變量在使用前,必須事先聲明,甚至還要初始化
弱類型:變量用時聲明,甚至不區分類型


顯式轉換
隱式轉換


bash變量類型:默認是字符串
    環境變量
    本地變量(局部變量)
    位置變量
    特殊變量


本地變量:
    VARNAME=VALUE:作用域爲個整個bash進程
    local VARNAME=VALUE:作用域爲當前代碼段
    
環境變量:
    export VARNAME=VALUE
    export VARNAME
    
變量引用:${}


腳本執行時會啓動一個子shell
    命令行中啓動的腳本會繼承當前shell環境變量
    系統自動執行的腳本(非命令行啓動)就需要自我定義各環境變量
    


位置變量:
    $1,$2,$3,...
    
特殊變量:
    $?:上一個命令的執行狀態返回值
    
程序執行返回值:
    結果
    返回代碼
        0:正確
        1-255:錯誤
        
    /dev/null:軟件設備,bit bucket,數據黑洞


撤消變量:
    unset VARNAME
    
查看當前shell變量 :set
查看當前shell環境變量:printenv,env,export


腳本:命令的堆砌


shebang:魔數
#!/bin/bash


#後面爲註釋


練習:寫一個腳本,完成以下任務
    1.添加5個用戶, user1,..., user5
    2.每個用戶的密碼同用戶名,而且要求,添加密碼完成後不顯示passwd命令的執行結果信息;
    3.每個用戶添加完成後,都要顯示用戶某某已經成功添加;
    useradd user1
    echo "user1" | passwd --stdin user1 &> /dev/null
    echo "Add user1 successfully."


bash中的條件判斷
條件測試類型:
    整數測試
    字符測試
    文件測試
條件測試的表達式:
    [expression](命令)
    [[expression]](關鍵字)
    test expression
    
整數比較:
    -eq:equal
    -ne:not equal
    -gt:greater than
    -lt:less than
    -ge:greater or equal
    -le:less or equal


命令的邏輯關係:
    與:&&        第一個條件成立時才執行第二個條件
    或:||        第一個條件不成立時才執行第二個條件
    
    command1 && command2 || command3
    command1執行正確時執行command2
    command1執行錯誤時執行command3
    
練習,寫一個腳本,完成以下要求:
    1.添加3個用戶user1, user2, user3;但要先判斷用戶是否存在,不存在而後再添加;
    2.添加完成後,顯示一共添加了幾個用戶;當然,不能包括因爲事先存在而沒有添加的;
    3.最後顯示當前系統上共有多少個用戶;
    
練習,寫一個腳本,完成以下要求:
給定一個用戶:
    1.如果其UID爲0,就顯示此爲管理員;
    2.否則,就顯示其爲普通用戶;
    
練習:寫一個腳本
判斷當前系統上是否有用戶的默認shell爲bash;
   如果有,就顯示有多少個這類用戶;否則,就顯示沒有這類用戶;
   
練習:寫一個腳本
判斷當前系統上是否有用戶的默認shell爲bash;
   如果有,就顯示其中一個的用戶名;否則,就顯示沒有這類用戶;


練習:寫一個腳本
給定一個文件,比如/etc/inittab
判斷這個文件中是否有空白行;
如果有,則顯示其空白行數;否則,顯示沒有空白行。


練習:寫一個腳本
給定一個用戶,判斷其UID與GID是否一樣
如果一樣,就顯示此用戶爲“good guy”;否則,就顯示此用戶爲“bad guy”。
進一步要求:不使用id命令獲得其id號;


練習:寫一個腳本
給定一個用戶,獲取其密碼警告期限;
而後判斷用戶密碼使用期限是否已經小於警告期限;
    提示:計算方法,最長使用期限減去已經使用的天數即爲剩餘使用期限;
    
如果小於,則顯示“Warning”;否則,就顯示“OK”。


圓整:丟棄小數點後的所有內容


練習:寫一個腳本
判定命令歷史中歷史命令的總條目是否大於1000;如果大於,則顯示“Some command will gone.”;否則顯示“OK”。






條件判斷,控制結構:
    
    if ...; then
        ...
        
    fi 
    
    if ...; then
        ...
    else
        ...
    fi
    
    if ...; then
        ...
    elif ...;then
        ...
    elif ...;then
        ...
    ...
    else
        ...
    fi
    


shell中算術運算:
    1.let 運算表達式
    2.$[運算表達式]
    3.$((運算表達式))
    4.expr 運算表達式  c=`expr $a + $b`
    
exit:退出腳本
    exit n
    如果腳本沒有明確定義退出碼,那麼,最後執行的一條命令的退出碼作爲腳本退出碼
    
文件測試:
    -e:exist
    -f:regular file
    -d:directory
    -r:readable
    -w:writeable
    -x:excutable
    
測試腳本是否有語法錯誤
    bash -n filename:語法
    bash -x filename:單步
    
練習:寫一個腳本
給定一個文件:
如果是一個普通文件,就顯示之;
如果是一個目錄,亦顯示之;
否則,此爲無法識別之文件;


位置參數:
    ./filetest.sh /etc/fstab /etc/inittab
          $0          $1          $2
    shift:參數偏移
        shift n;
          
特殊變量:
    $?:上一個命令退出碼
    $#:位置參數的個數(不包括腳本本身)
    $*:位置參數列表
    $@:位置參數列表
          
練習:寫一腳本
能接受一個參數(文件路徑)
判定:此參數如果是一個存在的文件,就顯示“OK.”;否則就顯示"No such file."


練習:寫一個腳本
給腳本傳遞兩個參數(整數);
顯示此兩者之和,之乘積;


練習:寫一個腳本,完成以下任務
    1.使用一個變量保存一個用戶名;
    2.刪除此變量中的用戶,且一併刪除其家目錄;
    3.顯示“用戶刪除完成”類的信息;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章