天天看點

Bash程式設計(三)

一、bash互動式程式設計 

    腳本參數:

    使用者互動://linux的重要思想,盡量避免和使用者互動

        1.腳本傳遞參數, a.sh  tom jery

        2.通過鍵盤擷取資料 

            read //

                -p 'promtpt' //提示符

                    // read a b 輸入tom和jerry會分别識别為a和b  

                -t timeout 逾時時間

            read a b //輸入 ja tom wolf  //a==ja ,b='tom wolf'    

            read -t 5 -p "enter a name: " name 

            腳本:添加使用者

<code>[root</code><code>@mt</code> <code>test]</code><code># cat adduser.sh </code>

<code>#!/bin/bash</code>

<code>#</code>

<code>read -p </code><code>"Enter a username : "</code> <code>name</code>

<code>[ -z </code><code>$name</code> <code>] &amp;&amp; echo </code><code>"username is needed ..."</code> <code>&amp;&amp; exit 2</code>

<code>read -p </code><code>"Enter a password for $name "</code> <code>passwd</code>

<code>[ -z </code><code>$passwd</code> <code>] &amp;&amp; password=</code><code>"password"</code>

<code>if</code> <code>id </code><code>$name</code> <code>&amp;&gt; /dev/null ;then</code>

<code>   </code><code>echo </code><code>"$name is exists."</code>

<code>else</code>

<code>   </code><code>useradd </code><code>$name</code>

<code>   </code><code>echo </code><code>"$password"</code> <code>| passwd --stdin </code><code>$name</code> <code>&amp;&gt; /dev/null</code>

<code>   </code><code>echo </code><code>"useradd succeed.."</code>

<code>fi</code>

        3.bash -n a.sh //文法錯誤,不能報告邏輯錯誤

            bash -x a.sh //調試執行

二、bash選擇執行(if)

    過程式程式設計語言的執行流程:

        選擇執行

        順序執行

        循環執行

    選擇執行:

        &amp;&amp; ,||

        if語句

        case 語句

        if語句:三種格式

            單分支的if語句

                if CONDITION;then

                    if-true 分支;

                fi

            雙分支的if語句

                if CONDITION ;then

                    if-true分支

                else

                    if-false 分支

            多分支的if語句

                if CONDITION1;then

                    條件1 為真分支

                elif CONDITION2;then

                    條件2;為真分支

                elif CONDITION3;then

                    條件3;為真分支

                ...

                    所有條件都不滿足時的分支

                注意:分支隻會執行一個,首先測試為真;

                        多個條件同時都能滿足,隻執行第一個比對到的

    腳本1-3位if語句

三、循環執行

        //将一段代碼重複執行0,1多次

    進入條件:滿足條件才進入循環

    退出條件:每個循環都有退出條件,

    bash腳本:

        for循環

        while循環

        until循環

    for循環

        兩種格式:

            (1)周遊清單

            (2)控制變量

        周遊清單:

            for VARIABLE in LIST; do

                循環體

            done

            進入條件:隻要清單有元素,即可進入循環

            退出條件:清單中的元素周遊完成

    LIST的生成方式

        (1)直接給出

        (2)整數清單

            {start..end} / echo {20..30}

            seq 10 //1-10

            seq 5 10 //從5到10

            seq 1 2 10 //步數為2,隻輸出奇數清單    

        (3)cat/ls /var   :傳回清單的指令

            cat /etc/issue

        (4) ls -d /etc/p* 

            for i in /etc/p* 就可以

        (5) 變量引用

            $@,$# 等

腳本1:腳本傳遞一個檔案名,判斷檔案類型是什麼

<code>    </code><code>#!/bin/bash</code>

<code>    </code><code>#</code>

<code>    </code><code>if</code> <code>[ $</code><code># -lt 1 ] ;then</code>

<code>        </code><code>echo </code><code>"At lease one path.."</code>

<code>        </code><code>exit 1</code>

<code>    </code><code>fi</code>

<code>    </code><code>if</code> <code>! [ -e </code><code>$1</code> <code>] ;then        //假如不存在</code>

<code>        </code><code>echo </code><code>"No suck file.."</code>

<code>        </code><code>exit 2</code>

<code>    </code> 

<code>    </code><code>if</code> <code>[ </code><code>-f</code> <code>$1</code> <code>] ;then</code>

<code>        </code><code>echo </code><code>"Common file.."</code>

<code>    </code><code>elif [ -d </code><code>$1</code> <code>] ; then</code>

<code>        </code><code>echo </code><code>"Directory.."</code>

<code>    </code><code>elif [ -L </code><code>$1</code> <code>] ; then</code>

<code>        </code><code>echo </code><code>"Symbolic file..."</code>

<code>    </code><code>elif [ -b </code><code>$1</code> <code>] ;then</code>

<code>        </code><code>echo </code><code>"block file..."</code>

<code>    </code><code>elif [ -c </code><code>$1</code> <code>] ; then</code>

<code>        </code><code>echo </code><code>"Character file..."</code>

<code>    </code><code>elif [ -S </code><code>$1</code> <code>]; then</code>

<code>        </code><code>echo </code><code>"Socket file..."</code>

<code>    </code><code>else</code>

<code>        </code><code>echo </code><code>"Unknown ... "</code>

腳本2:傳遞一個參數給腳本,此參數為使用者名

    根據其id号判斷其用于類型

        0:root

        1-999:系統使用者

        1000+:登入使用者

<code>    </code><code>[ $</code><code># -lt 1 ] &amp;&amp; echo "At least one user name." &amp;&amp; exit 1</code>

<code>    </code><code>! id -u </code><code>$1</code> <code>&amp;&gt; /dev/null &amp;&amp; echo </code><code>"no suck user"</code> <code>&amp;&amp; exit 2</code>

<code>    </code><code>userid=$(id -u </code><code>$1</code><code>)</code>

<code>    </code><code>if</code> <code>[ </code><code>$userid</code> <code>-eq</code> <code>0 ] ;then</code>

<code>        </code><code>echo </code><code>"root"</code>

<code>    </code><code>elif [ </code><code>$userid</code> <code>-ge</code> <code>1000 ] ;then</code>

<code>        </code><code>echo </code><code>"logging user."</code>

<code>    </code><code>else</code> 

<code>        </code><code>echo </code><code>"System user."</code>

腳本3:列出如下菜單為使用者

    disk)show disks info

    mem)show memory info;

    cpu)show cpu info

        cat /proc/meminfo或者lscpu

    *) quit

    提示使用者給出自己的選擇,而後顯示對應其選擇的相應系統資訊

<code>    </code><code>cat 《《  EOF</code>

<code>    </code><code>disk) show disks info</code>

<code>    </code><code>mem)  show memory info;</code>

<code>    </code><code>cpu)  show cpu info</code>

<code>    </code><code>*)    quit</code>

<code>    </code><code>EOF</code>

<code>    </code><code>read -p </code><code>"Your choice: "</code> <code>opt</code>

<code>    </code><code>if</code> <code>[ </code><code>"$opt"</code> <code>== </code><code>'disk'</code> <code>] ;then  </code>

<code>        </code><code>fdisk -l /dev/sd[a-z]</code>

<code>    </code><code>elif [ </code><code>"$opt"</code> <code>== </code><code>'mem'</code> <code>] ;then</code>

<code>        </code><code>free -h</code>

<code>    </code><code>elif [ </code><code>"$opt"</code> <code>== </code><code>'cpu'</code> <code>] ;then</code>

<code>        </code><code>lscpu</code>

<code>        </code><code>echo </code><code>"Unknown option.."</code>

<code>        </code><code>exit 3</code>

腳本4:添加使用者

    #!/bin/bash

    #

    for i in user20 user21 user22 ;do

        if id $i &amp;&gt; /dev/null ; then

            echo "$i exists.."

        else

            useradd  $i &amp;&amp; echo "Add user $i succeed"

        fi

    done

腳本5:從1-100的和

<code>    </code><code>declare -i sum=0</code>

<code>    </code><code>for</code> <code>i </code><code>in</code> <code>{1..100};</code><code>do</code>

<code>        </code><code>sum=$[</code><code>$sum</code> <code>+ </code><code>$i</code><code>] </code>

<code>        </code><code>echo </code><code>"\$sum is $sum"</code> <code>// 可以對$進行轉義</code>

<code>    </code><code>done</code>

<code>    </code><code>echo </code><code>$sum</code>

腳本6:判斷/var/log下所有檔案的類型

    方法1:file /var/log/*

    方法2:腳本

<code> </code><code>#!/bin/bash</code>

<code>    </code><code>for</code> <code>filename </code><code>in</code> <code>/</code><code>var</code><code>/</code><code>log</code><code>/</code><code>*</code> <code>; do</code>

<code>        </code><code>echo </code><code>-</code><code>n </code><code>"$filename    "</code>

<code>    </code><code>if</code> <code>[ </code><code>-</code><code>f $filename ] ;then</code>

<code>    </code><code>elif</code> <code>[ </code><code>-</code><code>d $filename ] ; then</code>

<code>    </code><code>elif</code> <code>[ </code><code>-</code><code>L $filename ] ; then</code>

<code>    </code><code>elif</code> <code>[ </code><code>-</code><code>b $filename ] ;then</code>

<code>    </code><code>elif</code> <code>[ </code><code>-</code><code>c $filename ] ; then</code>

<code>    </code><code>elif</code> <code>[ </code><code>-</code><code>S $filename ]; then</code>

腳本7:練習

1.分别求100以内所有偶數之和,以及奇數之和

2.計算目前系統上的所有使用者的id之和

3.通過腳本參數傳遞一個目錄給腳本,而後計算此目錄下所有檔案檔案的行數,并說明此類檔案的總數

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1950192,如需轉載請自行聯系原作者