zoukankan      html  css  js  c++  java
  • bash 编程中循环语句用法

    1.if 是单分支语句,使用格式如下: 
    if condition ; then 
    statement 
    ….. 
    fi 
    2.if … else 是双分支语句,使用格式如下: 
    if condition ; then 
    statement 
    …. 
    else 
    statement 
    …. 
    fi 
    3.if …elif…elif…else 是多分支语句,使用格式如下: 
    if condition ; then 
    statement 
    …. 
    elif condition ; then 
    statement 
    ….. 
    elif condition ; then 
    statement 
    ….. 



    else 
    statement 
    …. 
    fi 
    4.while 语句是循环语句,当条件满足的情况下才循环,不满足则退出循环,使用格式如下: 
    while condition ; do 
    statement 
    ….. 
    done 
    5.until 语句也是循环语句,当条件不满足的情况下循环,满足则不循环,使用格式如下: 
    until condition ; do 
    statement 
    ….. 
    done 
    6.case 也是循环语句,使用格式如下: 
    case $var(变量) ; in 
    value1) 
    …… 

    value2) 
    ….. 

    *) 

    .. 
    .. 
    .. 
    esac 

    脚本练习: 

    1.计算100以内所有能被3整除的正整数的和。 

    复制代码代码如下:

    #!/bin/bash 
    declare -i sum=0 
    for I in {1..100}; do 
    if [ $[$I%3] -eq 0 ]; then 
    let sum+=$I 
    fi 
    done 
    echo " the sum is :$sum" 


    2.计算100以内所有奇数的和以及所有偶数的和 

    复制代码代码如下:

    #!/bin/bash 
    # echo "exercise" 
    declare -i sum1=0 
    declare -i sum2=0 
    for I in {1..100}; do 
    if [ $[$I%2] -eq 0 ]; then 
    let sum1+=$I 
    else 
    let sum2+=$I 
    fi 
    done 
    echo " the even sum is :$sum1" 
    echo " the oddnumber sum is :$sum2" 


    3.判断/var/log下的文件的类型: 
    如果是普通文件,则说明其为普通文件; 
    如果是目录文件,则说明其为目录文件; 
    如果是符号链接文件,则说明其为符号链接文件; 
    否则,说明文件类型无法识别; 

    复制代码代码如下:

    #!/bin/bash 
    file1=/var/log/* 
    for file in $file1 ; do 
    if [ -f $file ]; then 
    echo "$file is common file" 
    elif [ -d $file ]; then 
    echo "$file is directory file" 
    else 
    echo "$file is unknow" 
    fi 
    done 


    4.写一个脚本,分别显示当前系统上所有默认shell为bash的用户和默认shell为 
    /sbin/nologin的用户 
    并统计各类shell下的用户总数,显示结果形如:bash,3user,they 
    are:root,redhat,gentoo nologn,2user,they are:bin,ftp 

    复制代码代码如下:

    #!/bin/bash 
    file=/etc/passwd 
    bsh='/bin/bash' 
    nobsh='/sbin/nologin' 
    use=`cat $file | cut -d: -f1` 
    declare -i d1=0 
    declare -i d2=0 
    for I in $use ; do 
    s=`grep "^$I:" $file | cut -d: -f7` 
    if [ "$s" = $bsh ] ; then 
    let d1=$d1+1 
    muser=$I\,$muser 
    elif [ "$s" = $nobsh ] ; then 
    let d2=$d2+1 
    suser=$I\,$suser 
    fi 
    done 
    echo "BASH,$d1 users ,they are:" 
    echo $muser 
    echo 
    echo "NOLOGIN,$d2 users ,they are:" 
    echo $suser 


    5.写一个脚本: 
    (1)如果不存在,就创建文件/tmp/maintenance;如果存在,就事先删除 
    (2)在文件/tmp/maintenance中添加如下内容: 
    172.16.0.6 
    172.16.0.17 
    172.16.0.20 
    (3)测试172.16.0.0/16网络内的所有主机是否在线,如果在线就显示其在线,如果此主机 
    在/tmp/maintenance文件中,就显示其正处于维护状态;否则,就显示其状态未知; 

    复制代码代码如下:

    #!/bin/bash 
    file=/tmp/maintenace 
    if [ -e $file ]; then 
    rm -rf $file &> /dev/null 
    fi 
    touch $file 
    cat >> $file << EOF 
    172.16.0.6 
    172.16.0.17 
    172.16.0.20 
    EOF 
    bnet=172.16 
    for net in {0..254} ; do 
    for host in {1..254} ; do 
    if ping -c1 -W1 $bnet.$net.$host &> /dev/null ; then 
    echo "$bnet.$net.$host is up." 
    elif grep "$bnet.$net.$host$" $file &> /dev/null ;then 
    echo "$bnet.$net.$host is under maintenance." 
    else 
    echo "$bnet.$net.$host state is unknow." 
    fi 
    done 
    done 


    6写一个脚本,完成以下功能: 
    (1)、提示用户输入一个用户名; 
    (2)、显示一个菜单给用户,形如: 
    U|u show UID 
    G|g show GID 
    S|s show SHELL 
    Q|q quit 
    (3)、提醒用户选择一个选项,并显示其所选择的内容;如果用户给的是一个非上述所提示的选项,则提醒用户给出的选项错误,并请其重新选择后执行; 
    第一种方法: 

    复制代码代码如下:

    #!/bin/bash 
    read -p "Enter a user name:" username 
    ! id $username &> /dev/null && echo " Come on ,the user you input unexit" && exit 9 
    cat << EOF 
    U|u show UID 
    G|g show GID 
    S|s show SHELL 
    Q|q quit 
    EOF 
    read -p "Enter your choice:" op 
    case $op in 
    U|u) 
    id -u $username;; 
    G|g) 
    id -g $username;; 
    S|s) 
    grep "^$username>" /etc/passwd | cut -d: -f7;; 
    Q|q) 
    exit 8 ;; 
    *) 
    echo "input option wrong ,quit" 
    exit 9 

    esac 


    第二种方法: 

    复制代码代码如下:

    #!/bin/bash 
    read -p "Enter a user name:" username 
    ! id $username &> /dev/null && echo "Come on ,you input user notexit" && exit 9 
    cat << EOF 
    U|u show UID 
    G|g show GID 
    S|s show SHELL 
    Q|q quit 
    EOF 
    read -p "Enter your option:" op 
    while true; do 
    case $op in 
    U|u) 
    id -u $username 
    break 

    G|g) 
    id -g $username 
    break 

    S|s) 
    grep "^$username>" /etc/passwd | cut -d: -f7 
    break 

    Q|q) 
    exit 7 ;; 
    *) 
    read -p "Wrong option,Enter a right option:" op ;; 
    esac 
    done 


    7写一个脚本: 
    (1)、判断一个指定的脚本是否是语法错误;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本; 
    (2)、如果用户通过vim打开编辑后保存退出时仍然有错误,则重复第1步中的内容;否则,就正常关闭退出。 
    第一种方法 

    复制代码代码如下:

    #!/bin/bash 
    [ ! -f $1 ] && echo "wrong path." && exit 2 
    until bash -n $1 &> /dev/null ; do 
    read -p " Q|q to quit .others to edit:" opt 
    case $opt in 
    Q|q) 
    echo "quit..." 
    exit 3 

    *) 
    vim $1 

    esac 
    done 


    第二种方法: 

    复制代码代码如下:

    #!/bin/bash 
    [ ! -f $1 ] && echo "wrong path." && echo "Quit!" && exit 9 
    until bash -n $1 &> /dev/null ; do 
    read -p " Grammar wrong please enter Q|q to quit .others to edit:" opt 
    case $opt in 
    Q|q) 
    echo "quit..." 
    exit 3 

    *) 
    vim $1 
    bash -n $1 &> /dev/null 
    val=$? 
    [ "$val" -ne 0 ] && echo "xiu gai bu cheng gong. " 

    esac 
    done 


    第三种方法 

    复制代码代码如下:

    #!/bin/bash 
    [ ! -f $1 ] && echo "Wrong scripts." && exit 4 
    bash -n $1 &> /dev/null 
    valu=$? 
    until [ $valu -eq 0 ] ; do 
    read -p "Q|q to quit ,others to edit:" op 
    case $op in 
    Q|q) 
    echo "Quit." 
    exit 9 

    *) 
    vim $1 
    bash -n $1 &> /dev/null 
    valu=$? 

    esac 
    done 


    8 写一个脚本: 
    查看redhat用户是否登录了系统,如果登录了,就通知当前脚本执行者“redhat 
    is logged on.”;否则,就睡眠5秒钟后再次进行测试;直到其登录为止退出; 
    第一种方法 

    复制代码代码如下:

    #!/bin/bash 
    who | grep "^redhat>" &> /dev/null 
    reval=$? 
    until [ $reval -eq 0 ] ;do 
    sleep 5 
    who | grep "^redhat>" &> /dev/null 
    reval=$? 
    done 
    echo "redhat is logged on." 


    第二种方法: 

    复制代码代码如下:

    #!/bin/bash 
    until who | grep "^redhat>" &> /dev/null ; do 
    sleep 5 
    done 
    echo "redhat is logged on" 


    9写一个脚本: 
    (1)、向系统中添加20个用户,名字为linuxer1-linuxer20,密码分别为其用户名,要使用while循环; 
    (2)、要求:在添加每个用户之前事先判断用户是否存在,如果已经存在,则不再添加此用户; 
    (3)、添加完成后,显示linuxer1-linuxer20每个用户名及对应的UID号码和GID号码,形如 stu1, UID: 1000, GID: 1000 

    复制代码代码如下:

    #!/bin/bash 
    declare -i I=1 
    while [ $I -le 20 ] ; do 
    l=linuxer$I 
    let I++ 
    ! id $l &> /dev/null && useradd $l &> /dev/null && echo "the user:$l" | passwd --stdin $l &> /dev/null && echo "a dd user $l successfully" || echo " The user $l is exit. " 
    d=`id -u $l` 
    g=`id -g $l` 
    echo " $l ,UID:$d,GID:$g " 
    done 
  • 相关阅读:
    在js中如何将字符串类型的日期("2020-11-30T02:21:42.000+0000")进行格式化
    微信小程序:报错fail webview count limit exceed
    微信小程序:picker组件实现下拉框效果
    微信小程序:post请求参数放在请求体中还是拼接到URL中需要看后台是如何接收的
    【华为云技术分享】如何用交互式特征工程工具进行数据分析处理
    【云小课】基础服务第25课 容灾演练:平时多练兵,急时保可用!
    【华为云分享】软件工程的迷途与沉思
    WebSocket 从入门到写出开源库
    教你轻松截获 Selenium 中的 Ajax 数据
    【华为云技术分享】Scrum Master如何引导团队中的刺头
  • 原文地址:https://www.cnblogs.com/fjping0606/p/4573542.html
Copyright © 2011-2022 走看看