zoukankan      html  css  js  c++  java
  • Linux Vim和Shell脚本及流程控制常用命令

    input and output:
    输入输出的重定向:
    标准输入重定向(STDIN,文件描述为0):默认从键盘输入,也可以从其他文件或者命令 中输入
    标准输出重定向(STDOUT,文件描述为1):默认输出到屏幕
    错误输出重定向(STDERR,文件描述为2):默认输出到屏幕
    参数:
    输入重定向:
    命令 < 文件 将文件作为命令的标准输入
    命令 << 分界符 从标准输入中读入,知道遇见分界符才停止 如:<< over就是分界符
    命令 <文件1> 文件2 将文件1作为命令的标准输入并将标准输出到文件2
    输出重定向:
    命令 > 文件 将标准输出重定向到一个文件中(清空原有文件的数据)
    命令 2> 文件 将错误输出重定向到一个文件中(清空原有文件的数据)
    命令 >> 文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
    命令 2>> 文件 将错误输出重定向到一个文件中(追加到原有内容后面)

    命令 >> 文件 2>&1 
    命令 &>> 文件   这两个命令一样:将标准输出与错误输出共同写入到文件中(追加)
    

    管道命令:把前一个命令原本要输出到屏幕的数据当作后一个命令的标准输入
    ls -l /etc/ | more
    echo “Linuxprobe” | passwd –stdin root
    echo “Content” | mail -s “Subject” linuxprobe
    mail -s “Readme” root@linuxprobe.com << over

    命令行的通配符:
    ls -l /dev/sda
    ls -l /dev/sda1
    ls -l /dev/sda2
    ls -l /dev/sda3
    ….
    通配符的使用:
    ls -l /dev/sda*
    如果后面是跟一个字符的文件的相关信息:
    ls -l /dev/sda?
    如果使用的是[0-9]来匹配0-9的单个数字的话:
    ls -l /dev/sda[0-9]
    ls -l /dev/sda[135]

    常用的转义字符:
    反斜杠():是反斜杠后面的一个变量变为单纯的字符串
    单引号(”):转义其中所有的变量为单纯的字符串
    双引号(“”):保留其中的变量属性,不进行转义处理
    反引号(`):在左上方,把其中的命令执行后返回结果
    $$的作用是显示当前程序的进程ID号码 例如: PRICE=5 echo "price is /$$PRICE"
    如果要某个命令的输出值时,可以使用
    命令,反引号扩起来
    下面是显示本就的liunx版本和内核信息:
    echo
    uname -a`

    重要的环境变量:
    用户执行了一条命令之后,Linux执行4个步骤:
    第一步:
    判断用户是否以绝对路径或是相对路径的方式输入命令(/bin/ls),
    如果是,则直接执行
    第二步:
    Liunx系统检查用户输入的命令是否为”别名命令”,即用了一个自定义的 命令名称来替换原本的命令名称。(alias)可以使用alias这个命令来 创建一个属于你自己的命令别名,格式为:alias 别名=命令。
    要取消一个命令别名时,则是使用unalias命令,格式:unalias 别名
    例如:
    ls
    rm test.txt
    这里默认让你输入y/n
    alias rm
    先查看rm 的别名有什么命令
    unalias rm
    rm test1.txt
    第三步:
    Bash解释器判断用户输入的是内部命令还是外部命令。
    内部命令是解释器内部指令,会被直接执行。
    而用户在绝大部分时间输入的是外部命令
    可以使用:type 命令名称 —-》判断输入的内部还是外部命令
    例如:
    type ls 就是外部命令
    type touch 就是内部命令

    第四步:
        系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫     做PATH,可以简单的理解为”解释器的小助手“,作用是告诉Bash解释     器待执行的命令可能存放的位置,然后Bash解释器就会乖乖的在这些位       置中租个查找。PATH是由多个路径组成的变量,每个路径值之间用冒号
        隔开,对这些路径的增加和删除操作都将影响到Bash解释器对Liunx命     令的查找
        如果你想查看PATH:
        echo PATH
        PATH中增加值:
        PATH=$PATH:/root/bin           
    Liunx系统中最重要的环境变量:
        HOME    用户的主目录(及家目录)
        SHELL   用户在使用的Shell解释器名称
        HISTSIZE 输出的历史命令记录条数
        HISTFILESIZE 保存的历史命令记录条数
        MAIL    邮件保存路径
        LANG    系统语言、语系名称
        RANDOM  生成一个随机数字
        PS1 Bash解释器的提示符
        PATH     定义解释器搜索用户执行命令的路径
        EDITOR  用户默认的文本编辑器
    
    例如:
        //这里是root
        echo $HOME
        //切换用户
        su - LVY//LVY是自己的普通用户
        echo $HOME
        //可以发现这两个用户的HOME是不同的
    
        也可以自己定义一个变量
        //root权限
        mkdir /home/workdir
        WORKDIR=/home/workdir
        cd $WORKDIR
    
        当时这样的变量不具有全局性,作用的范围是有限的
        默认不可以被其他用户使用
        可以使用export命令提升为全局变量,这样其他用户就可以使用了
        su - LVY
        cd $WORKDIR
        echo $WORKDIR//不能使用
        exit        
        export WORKDIR
        su - LVY
        cd $WORKDIR
        pwd
    

    Vim编辑器与Shell命令脚本
    Linux 系统中的一切都是文件,而配置一个服务就是在修改其配置
    文件的参数

    了解:
    vim编辑器设置了3种模式:命令模式,末行模式和编辑模式
    
    Vim编辑器常用的命令:
        dd 删除(剪切)光标所在整行
        5dd 删除(剪切)从光标出开始的5行
        yy 复制光标所在的整行
        5yy 复制从光标开始的5行
        n 显示搜索命令定位到的下一个字符串
        N 显示搜索命令定位到的上一个字符串
        u 撤销上一步的操作
        p 将之前删除(dd)或者复制(yy)过得数据粘贴到光标的后面
    
    末行模式:
        :w 保存
        :q 退出
        :q! 强制退出(不保存)
        :wq! 强制保存退出
        :set nu 显示行号
        :set nonu 不显示行号
        :命令 执行该命令
        :整数 跳转到该行
        :s/one/two 将当前光标所在行的第一个one替换成two
        :s/one/two/g 将当前光标所在行的所有one替换成two
        :%s/one/two/g 将全文中的所有one替换成two
        ?字符串 在文本中从下至上搜索该字符串
        /字符串 在文本中从上至下搜索该字符串
    
    编写简单文档
        a,i,o进入编辑模式
    
    配置主机名称:
        在Linux中主机大多保存在/etc/hostname文件中,
        我们把/etc/hostname 文件的内容修改为"linux"
        第一步:
            使用Vim编辑器修改"/etc/hostname"主机名称文件
        第二步:
            把原始主机名称删除后追加"linux".
            使用:wq!强制保存退出
        第三步:
            保存退出,然后使用hostname命令检查是否修改成功了
    
        修改完成之后使用hostname命令查看
        如果没有同步的话,可以进行重启查看
    
    配置网卡信息:
        在RHEL 5、RHEL 6中,网卡配置文件的前缀为eth,
        第一块为eth0,第二块为eth1;一次类推
        而在RHEL 7中,网卡配置文件的前缀则以ifcfg开始
        加上网卡名称共同组成了网卡配置文件的名字,
        例如:ifcfg-eno16777736;
    
        配置一个名称为ifcfg-eno16777736的网卡设备,将其配置为开机启动 
        并且IP地址、子网、网关等信息有人工指定:
        第一步:
            首先切换到/etc/sysconfig/network-scripts目录中
            这个目录存放着网卡的配置文件
        第二步:
            室友vim配置修改网卡文件ifcfg-eno16777736,保存退出
            设备类型:TYPE=Ethernet
            地址分配模式:BOOTPROTO=static
            网卡名称:NAME=eno16777736
            是否启动:ONBOOT=yes
            IP地址:IPADDR=192.168.10.10
            子网掩码:NETMASK:255.255.255.0
            网关地址:GATEWAY=192.168.10.1
            DNS地址:DNS1=192.168.10.1
        第三步:
            重启网络服务并测试网络是否联通。
    
        操作:
            cd /etc/sysconfig/network-scripts
            vim ifcfg-eno16777736
            设备类型:TYPE=Ethernet
            地址分配模式:BOOTPROTO=static
            网卡名称:NAME=eno16777736
            是否启动:ONBOOT=yes
            IP地址:IPADDR=192.168.10.10
            子网掩码:NETMASK:255.255.255.0
            网关地址:GATEWAY=192.168.10.1
            DNS地址:DNS1=192.168.10.1
    
            重新启动网卡设备的命令:
            systemctl restart network
            ping命令检查网络是否联通:
            ping 192.168.10.10
    
    配置Yum软件仓库:
        它是为了进一步简化RPM管理软件的难度以及自动分析所需软件包及其
        依赖关系的技术。
        搭建Yum软件仓库并配置:
        第一步:
            进入到/etc/yum.repos.d/目录中
            (该目录存放着Yum软件仓库的配置文件)
        第二步:
            使用vim编辑器创建一个名为rhel7.repo的新配置文件,
            写入下面参数
    
    
            [rhel-media]:yum软件仓库唯一表示符,避免和其他软件仓              库冲突
    
            name=linuxYum:yum软件仓库的名称描述
    
            baseusrl=file:///media/cdrom
            提供的方式包括FTP(ftp://..)、HTTP(http://..)、
            本地(file://..)
    
            enabled=1:设置此源是否可用;1可用0不可用
    
            gpgcheck=1:设置此源是否检验文件:1检验0不检验
    
            gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-                  relaase:若上面参数开启校验,那么请指定公钥文件地址
    
    
        第三步:
            按配置参数的路径挂载光盘,并把光盘挂载信息写入到
            /etc/fstab中.
    
    
        第四步:
            使用"yum install httped -y"
            命令检查Yum软件仓库是否已经可用
    
        操作如下:
            cd /etc/yum.repos.d/
            vim rhe17.repo
                [rhe17]
                name=rhe17
                baseusrl=file:///media/cdrom
                enabled=1
                gpgcheck=0
    
    
            创建挂载点后进行挂载操作,设置为开机自动挂载
            尝试使用Yum软件仓库来安装Web服务,出现Complete!
            则正确:
    
            mkdir -p /media/cdrom
            mount /dev/cdrom /media/cdrom
            vim /etc/fstab
            #写入下面内容
            /dev/cdrom /media/cdrom is09660 defaults 0 0
            :wq!
            yum install httped
    

    编写Shell脚本

    编写简单的脚本:
        vim example.sh
        #!/bin/bash//这是脚本声明,告诉系统使用哪种Shell解释器执行该         脚本
        #For Example by linux
        pwd
        ls -al
    
        执行脚本bash example.sh(也可以是用 sh example.sh)
        还有一种放式输入完整路径来执行:./example.sh
        可能会遇到权限不足:chmod u+x example.sh(修改权限)
    
    接受用户的参数:
        vim example.sh
        #!/bin/bash
        echo "当前脚本名称为$0"
        echo "总共有$#个参数,分别是$*"
        echo "第一个参数为$1,第五个参数为$5"
    
        执行方法:
        sh example.sh one two three four five six
    
    判断用户的参数:
        文件测试语句
        逻辑测试语句
        整数值比较语句
        字符串比较语句
    
        文件测试语句:
            -d 测试文件是否为目录类型
            -e 测试文件是否存在 
            -f 测试文件是否为一般文件
            -r 测试文件是否有读取权限
            -w 测试文件是否有写入权限
            -x 测试文件是否有执行权限
    
        例如:
        下面判断/etc/fstab是否为一个目录类型文件
        然后通过Shell解释器的内设$?变量显示上一条命令执行
        后的返回值,为0则存在,非零值,不存在
        [ -d /etc/fstab ]
        echo $?
    
    
        [ -f /etc/fstab ]
        echo $?
    
        逻辑测试语句
            &&表示是前面一个表达式是否执行成功了
            [ -e /dev/cdrom ] && echo "Exist"
    
            ||前面一个表达式执行失败了才执行它
            [ -e /dev/IloveLinux ] || echo "No Exist"
    
    
            !逻辑非,在条件判断中取反值
            还是给个例子:
            [ ! $USER = root ] && echo "user" || echo "root"
    
        整数值比较语句:
            -eq 是否等于(equal)
            -ne 是否不等于(no equal)
            -gt 是否大于(greater than)
            -lt 是否小于(less than)
            -le 是否小于或者等于(less or equal)
            -ge 是否大于或者等于(freater or equal)
    
            例子:
            [ 10 -gt 10 ]
            echo $?
    
            [ 10 -eq 10]
            echo $?
    
    
            free -m 查看内存使用量情况(MB)
            grep Mem(memory)过滤剩余内存量的行
            awk '{print $4}' 保留第四行,
            FreeMem='语句'把语句执行的结果给变量
            free -m
            free -m | grep Mem
            free -m | grep Mem: | awk '{print $4}'
            FreeMem=`free -m | grep Mem: | awk '{print $4}'`
            echo $FreeMem
            [ $FreeMem -lt 1024 ] && echo "Insufficient"
            //绕了一个圈子,主要是使用-lt(less than)
    
    
        比较字符串:
            = 比较字符串的内容是否相同
            != 比较字符串的内容是否不同
            -z 比较字符串的内容是否为空
            为真返回的是1,为假返回的是0
            例如:
            [ -z $string ]
            echo $?
    
            echo $LANG
            [ $LANG != "en.US" ] && echo "Not en.US"
    

    流程控制语句:
    if条件测试语句:
    格式if、then、fi
    例如:
    vim mkcdrom.sh
    #!bin/bash
    DIR=”/media/cdrom”
    if [ ! -e DIR]thenmkdirpDIR
    fi
    执行命令:
    bash mkcdrom.sh
    ls -d /media/cdrom

        //测试某台主机是否在线
        Vim Chkhost.sh
        #!/bin/bash
        ping -c 3 -i 0.2 -w 3 $1 &> /dev/null
        if [ $? -eq 0]
        then
        echo "Host $1 is On-line."
        else
        echo "Host $1 is off-line."
        fi
    read -p 显示提示信息(输入信息的命令)
        vim chkscore.sh
        #!/bin/bash
        read -p "please enter your score (0-100):" GRADE
        if [ $GRADE -ge 100 ] || [ $GRADE -le 0 ];then
        echo "你输入的信息有误!"
        fi
        if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]; then
        echo "$GRADE is Excellent"
        elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]; then
        echo "$GRADE is Pass"
        else
        echo "$GRADE is Fail"
        fi
    
    for条件循环语句
        vim user.txt
            andy
            barry
            carl
            duke
            eric
            george
    
        //批量创建用户
        id 用户名 查看该用户的信息
        vim Example.sh
            #!/bin/bash
            read -p "Enter The Users Password:" PASSWD
            for UNAME in `cat users.txt`
            do
                id $UNAME $> /dev/null
                if [ $? -eq 0 ]
                then 
                echo "Already exists"
                else
                useradd $UNAME &> /dev/null
                echo "$PASSWD" | passwd --stdin &>                                 /dev/null
                if [ $? -eq 0 ]
                then
                echo "$UNAME,Create success!"
                else
                echo "$UNAME,Create failure."
                fi
                fi
            done
        判断是否成功,可以去/etc/passwd查看
    
        判断主机是否在线
        vim ipadds.txt
            192.168.10.10
            192.168.10.11
            192.168.10.12
    
        vim checkhosts.sh   
            #!/bin/bash
            HLIST=$(cat ~/ippadds.txt)
            for IP in $HLIST
            do
                ping -c 3 -i 0.2 -w 3 $IP &> /dev/null
                if [ $? -eq 0 ]; then
                echo "Host $IP is On-Line."
                else
                echo "Host $IP is off-Line."
                fi
            done
        //执行命令,完全路径
        ./CheckHosts.sh     
    
    
    while条件循环语句
        vim Guess.sh
        #!/bin/bash
        PRICE=$(expr $RANDOM % 1000)//expr命令取得结果
        TIMES=0
        echo "商品实际价格为0~999之间,猜猜看是多少?"
        while true
        do
            read -p "请输入你猜测的价格:" INT
            let TIMES++
            if [ $INT -eq $PRICE ]; then
            echo "答对了"
            echo "你共猜测了 $TIMES 次"
            exit 0
            elif [ $INT -gt $PRICE ]; then
            echo "太高了"
            else
            echo "太低了"
            fi
        done
    
    case 条件测试语句
        vim checkkeys.sh
        #!/bin/bash
        read -p "请输入一个字符,并按enter键确认:" KEY
        case "$KEY" in
        [a-z] | [A-Z])
        echo "输入的是字母."
        ;;
        [0-9])
        echo "数你的是数字."
        ;;
        *)
        echo "你输入的其他字符."
        esac
    

    计划任务服务程序:
    ”at 时间“ 的形式
    查看已设置好的但还没有执行的一次性计划任务,可以使用”at -l命令”
    想要将其删除,可以使用”atrm 任务序号”
    例如:
    使用命令将系统设置为今晚23:30分自动重启网站服务
    at 23:30
    at > systemctl restart httpd
    at >此处按下Ctrl+D组合键结束编写计划任务

    //更高简捷性
    echo "systemctl restart htppd" | at 23:30
    at -l
    atrm 3
    
    crond服务:
        crondab -e 创建、编辑计划任务
        crondab -l 查看当前计划任务
        crondab -r 删除计划任务
        crondab -u 编辑他人的计划任务(管理员)
        口诀”分、时、日、月、星期 命令“
        分 0~59
        时 0~23
        日 1~31
        月 1~12
        星期 0~7
        命令 要执行的命令或是程序脚本
    
        //每周一、三、五凌晨3点25分,党报某个网站的数据
        //每周一到周五的凌晨1点清空/tmp目录
        crontab -e
        crontab -l
        在所有的计划任务参数中,所有的命令一定要用绝对路径来写
        当你不知道命令的绝对路径时:使用whereis进行查询
        whereis rm
        crontab -e
        crontab -l
        25 3 * * 1,3,5  usr/bin/tar -czvf backup.tar.gz         /home/wwwroot 0 1 * * 1-5 usr/bin/rm -rf /tmp/*
    
    技术不分国界
  • 相关阅读:
    安装触摸板驱动导致系统无法开机
    TensorBoard的使用
    TensorFlow 编程基础
    在Anaconda3下安装(CPU版)TensorFlow(清华镜像源)
    C 程序
    CodeBlocks 断点调试
    数字图像处理之复原处理
    数字图像处理之频域图像增强
    数字图像处理之傅里叶变换
    算法导论中的四种基本排序
  • 原文地址:https://www.cnblogs.com/angels-yaoyao/p/12443588.html
Copyright © 2011-2022 走看看