首页 > 代码库 > Bash编程(三)

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
            
            脚本:添加用户

[root@mt test]# cat adduser.sh 
#!/bin/bash
#
read -p "Enter a username : " name
[ -z $name ] && echo "username is needed ..." && exit 2
read -p "Enter a password for $name " passwd
[ -z $passwd ] && password="password"
if id $name &> /dev/null ;then
   echo "$name is exists."
else
   useradd $name
   echo "$password" | passwd --stdin $name &> /dev/null
   echo "useradd succeed.."
fi

        3.bash -n a.sh //语法错误,不能报告逻辑错误
            bash -x a.sh //调试执行
    
二、bash选择执行(if)
    过程式编程语言的执行流程:
        选择执行
        顺序执行
        循环执行
    选择执行:
        && ,||
        if语句
        case 语句
        
        if语句:三种格式
            单分支的if语句
                if CONDITION;then
                    if-true 分支;
                fi
            双分支的if语句
                if CONDITION ;then
                    if-true分支
                else
                    if-false 分支
                fi
            多分支的if语句
                if CONDITION1;then
                    条件1 为真分支
                elif CONDITION2;then
                    条件2;为真分支
                elif CONDITION3;then
                    条件3;为真分支
                ...
                else
                    所有条件都不满足时的分支
                注意:分支只会执行一个,首先测试为真;
                        多个条件同时都能满足,只执行第一个匹配到的
    脚本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:脚本传递一个文件名,判断文件类型是什么

    #!/bin/bash
    #
    if [ $# -lt 1 ] ;then
        echo "At lease one path.."
        exit 1
    fi
    if ! [ -e $1 ] ;then        //假如不存在
        echo "No suck file.."
        exit 2
    fi
    
    if [ -f $1 ] ;then
        echo "Common file.."
    elif [ -d $1 ] ; then
        echo "Directory.."
    elif [ -L $1 ] ; then
        echo "Symbolic file..."
    elif [ -b $1 ] ;then
        echo "block file..."
    elif [ -c $1 ] ; then
        echo "Character file..."
    elif [ -S $1 ]; then
        echo "Socket file..."
    else
        echo "Unknown ... "
    fi

    
脚本2:传递一个参数给脚本,此参数为用户名
    根据其id号判断其用于类型
        0:root
        1-999:系统用户
        1000+:登录用户

    #!/bin/bash
    #
    [ $# -lt 1 ] && echo "At least one user name." && exit 1
    ! id -u $1 &> /dev/null && echo "no suck user" && exit 2
    userid=$(id -u $1)
    if [ $userid -eq 0 ] ;then
        echo "root"
    elif [ $userid -ge 1000 ] ;then
        echo "logging user."
    else 
        echo "System user."
    fi

脚本3:列出如下菜单为用户
    disk)show disks info
    mem)show memory info;
    cpu)show cpu info
        cat /proc/meminfo或者lscpu
    *) quit
    提示用户给出自己的选择,而后显示对应其选择的相应系统信息

    #!/bin/bash
    #
    cat 《《  EOF
    disk) show disks info
    mem)  show memory info;
    cpu)  show cpu info
    *)    quit
    EOF
    read -p "Your choice: " opt
    if [ "$opt" == ‘disk‘ ] ;then  
        fdisk -l /dev/sd[a-z]
    elif [ "$opt" == ‘mem‘ ] ;then
        free -h
    elif [ "$opt" == ‘cpu‘ ] ;then
        lscpu
    else
        echo "Unknown option.."
        exit 3
    fi

    
脚本4:添加用户
    #!/bin/bash
    #
    for i in user20 user21 user22 ;do
        if id $i &> /dev/null ; then
            echo "$i exists.."
        else
            useradd  $i && echo "Add user $i succeed"
        fi
    done
    
脚本5:从1-100的和

    #!/bin/bash
    #
    declare -i sum=0
    for i in {1..100};do
        sum=$[$sum + $i] 
        echo "\$sum is $sum" // 可以对$进行转义
    done
    echo $sum

    
脚本6:判断/var/log下所有文件的类型
    方法1:file /var/log/*
    方法2:脚本

 #!/bin/bash
    #
    for filename in /var/log/* ; do
        echo -n "$filename    "
    if [ -f $filename ] ;then
        echo "Common file.."
    elif [ -d $filename ] ; then
        echo "Directory.."
    elif [ -L $filename ] ; then
        echo "Symbolic file..."
    elif [ -b $filename ] ;then
        echo "block file..."
    elif [ -c $filename ] ; then
        echo "Character file..."
    elif [ -S $filename ]; then
        echo "Socket file..."
    else
        echo "Unknown ... "
    fi
    done

脚本7:练习
1.分别求100以内所有偶数之和,以及奇数之和
2.计算当前系统上的所有用户的id之和
3.通过脚本参数传递一个目录给脚本,而后计算此目录下所有文件文件的行数,并说明此类文件的总数


本文出自 “黑马腾空” 博客,请务必保留此出处http://hmtk520.blog.51cto.com/12595610/1950192

Bash编程(三)