天天看点

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,如需转载请自行联系原作者