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” [email protected] << 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]thenmkdirp DIR
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/*

猜你喜欢

转载自blog.csdn.net/lv_yong/article/details/79175253