zoukankan      html  css  js  c++  java
  • (五)shell编程之read,case,流程控制

    使用read命令来接受输入

    使用read来把输入值分配给一个或多个shell变量,read从标准输入中读取值,给每个单词分配一个变
    量,所有剩余单词都被分配给最后一个变量,如果变量名没有指定,默认标准输入的值赋值给系统内置
    变量REPLY
    格式:

    read [options] [name ...]
    

    常见选项:

    -p 指定要显示的提示
    -s 静默输入,一般用于密码
    -n N 指定输入的字符长度N
    -d '字符' 输入结束符
    -t N TIMEOUT为N秒
    

    范例:

    [root@sz-kx-centos8 ~]# read
    longxuan
    [root@sz-kx-centos8 ~]# echo $REPLY
    longxuan
    
    [root@sz-kx-centos8 ~]# read NAME TITLE
    long ceo
    [root@sz-kx-centos8 ~]# echo $NAME
    long
    [root@sz-kx-centos8 ~]# echo $TITLE
    ceo
    
    [root@sz-kx-centos8 ~]# read -p "Please input your name: " NAME
    Please input your name: longwang
    [root@sz-kx-centos8 ~]# echo $NAME
    longwang
    

    范例:

    [root@sz-kx-centos8 ~]# read x y z <<< "I love you"
    [root@sz-kx-centos8 ~]# echo $x
    I
    [root@sz-kx-centos8 ~]# echo $y
    love
    [root@sz-kx-centos8 ~]# echo $z
    you
    

    范例:面试题 read和输入重定向

    [root@centos8 scripts]# cat test.txt
    1 2
    [root@centos8 scripts]# read i j < test.txt ; echo i=$i j=$j
    i=1 j=2
    [root@centos8 scripts]# echo 1 2 | read x y ; echo x=$x y=$y
    x= y=
    [root@centos8 ~]# echo 1 2 | ( read x y ; echo x=$x y=$y )
    x=1 y=2
    [root@centos8 ~]# echo 1 2 | { read x y ; echo x=$x y=$y; }
    x=1 y=2
    [root@centos8 ~]# man bash
    

    bash shell 的配置文件

    bash shell的配置文件很多,可以分成下面类别

    全局配置:针对所有用户皆有效

    /etc/profile
    /etc/profile.d/*.sh
    /etc/bashrc
    

    个人配置:只针对特定用户有效

    ~/.bash_profile
    ~/.bashrc
    

    交互式登录

    配置文件生效和执行顺序:

    #放在每个文件最前
    /etc/profile
    /etc/profile.d/*. sh
    /etc/bashrc
    ~/ .bash_ profile
    ~/ .bashrc
    /etc/bashrc
    
    #放在每个文件最后
    /etc/profile.d/*.sh
    /etc/bashrc
    /etc/profile
    /etc/bashrc #此文件执行两次
    ~/.bashrc
    ~/.bash_profile
    

    注意:文件之间的调用关系,写在同一个文件的不同位置,将影响文件的执行顺序

    非交互式登录

    /etc/profile.d/*.sh
    /etc/bashrc
    ~/.bashrc
    

    按功能划分分类

    Profile类

    全局:/etc/profile, /etc/profile.d/*.sh
    个人:~/.bash_profile
    
    功用:
    (1) 用于定义环境变量
    (2) 运行命令或脚本
    

    Bashrc类

    全局:/etc/bashrc
    个人:~/.bashrc
    
    功用:
    (1) 定义命令别名和函数
    (2) 定义本地变量
    

    编辑配置文件生效

    修改profile和bashrc文件后需生效两种方法:

    1. 重新启动shell进程
    2. source|. 配置文件

    注意:source 会在当前shell中执行脚本,所有一般只用于执行置文件,或在脚本中调用另一个脚本的场景
    范例:

    . ~/.bashrc
    

    流程控制

    选择执行 if 语句

    格式:

    if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
    

    单分支

    if 判断条件;then
       条件为真的分支代码
    fi
    

    双分支

    if 判断条件; then
       条件为真的分支代码
    else
       条件为假的分支代码
    fi
    

    多分支

    if 判断条件1; then
       条件1为真的分支代码
    elif 判断条件2; then
       条件2为真的分支代码
    elif 判断条件3; then
       条件3为真的分支代码
    ...
    else
       以上条件都为假的分支代码
    fi
    

    说明:
    多个条件时,逐个条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if语句

    范例:

    #根据命令的退出状态来执行命令
    if ping -c1 -W2 station1 &> /dev/null; then
       echo 'station1 is UP'
    elif grep -q 'station1' ~/maintenance.txt; then
       echo 'station1 is undergoing maintenance'
    else
       echo 'station1 is unexpectedly DOWN!'
       exit 1
    fi
    

    条件判断 case 语句

    格式:

    case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
    

    范例:

    case 变量引用 in
    PAT1)
       分支1
       ;;
    PAT2)
       分支2
       ;;
    ...
    *)
       默认分支
       ;;
    esac
    

    case支持glob风格的通配符:

    * 任意长度任意字符
    ? 任意单个字符
    [] 指定范围内的任意单个字符
    | 或者,如: a|b
    

    范例:

    #!/bin/bash
    # 
    #********************************************************************
    #Author:        xuanlv
    #QQ:            360956175
    #Date:          2021-06-10
    #FileName:     case_yesorno.sh
    #URL:           https://www.cnblogs.com/xuanlv-0413/
    #Description:      The test script
    #Copyright (C):     2021 All rights reserved
    #********************************************************************
    read -p "Do you agree(yes/no)?" INPUT
    INPUT=`echo $INPUT | tr 'A-Z' 'a-z'`
    
    case $INPUT in
    y|yes)
        echo "you input is YES"
        ;;
    n|no)
        echo "you input is NO"
        ;;
    *)
        echo "Input fales,please input yes or no!"
    esac
    

    范例:

    
    #!/bin/bash
    # 
    #********************************************************************
    #Author:        xuanlv
    #QQ:            360956175
    #Date:          2021-06-10
    #FileName:     case_yesorno.sh
    #URL:           https://www.cnblogs.com/xuanlv-0413/
    #Description:      The test script
    #Copyright (C):     2021 All rights reserved
    #********************************************************************
    read -p "Do you agree(yes/no)?" INPUT
    INPUT=`echo $INPUT | tr 'A-Z' 'a-z'`
    
    case $INPUT in
    [yY]|[yY][eE][sS])
        echo "you input is YES"
        ;;
    [nN]|[Nn][oO])                                                                                                       
        echo "you input is NO"
        ;;
    *)
        echo "Input fales,please input yes or no!"
    esac
    
  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/14881431.html
Copyright © 2011-2022 走看看