bash脚本编程基础知识

vim命令:模式化的编辑器
基本模式:编辑模式,输入模式,末行模式;
模式转换:
编辑模式(默认模式) --> 输入模式;
i:insert,在光标所在处输入;
a:append,在光标所在处后方输入;
o:在光标所在处的下方打开一个新行并在行首;
I:在当前光标所在行的行首输入;
A:在光标所在行的行尾输入;
O:在光标所在处的上方打开一个新行;

        输入模式 --> 编辑模式
            ESC
            输入模式无法直接切换到末行模式;输入模式-->编辑模式-->末行模式

        编辑模式 --> 末行模式 
            :
                set n:显示行号;
                set nonu:取消行号;
                10,100d:删除从第10行到第100行;

        末行模式 --> 编辑模式
            ESC
    关闭文件:
        编辑模式:ZZ:保存并退出;

        末行模式:
            :q 退出(仅打开文件后关闭使用)
            :q!强制退出,不保存此前的编辑操作;
            :wq 保存并退出;
                先w再q分步输入也可;
            :x 保存并退出;
            :w /PATH/TO/SOMEFILE 另存为至指定文件中;
            
    光标跳转(编辑模式):
        字符间跳转
            h:向左跳转一个字符;
            l:向右跳转一个字符;
            j:向下跳转一行;
            k:向上跳转一行;

        单词间跳转
            w:跳转至当前至后一个单词词首;
            e:跳转至当前至后一个单词词尾;
            b:跳转至当前至前一个单词词首;
            
        行首行尾跳转
            ^:移动到行首的第一个非空白字符;
            0:移动到绝对行首;
            $:移动到行尾(最后一个字符前);

        行间跳转
            #G:跳转至由#指定的行;
            1G,gg:跳转至第一行;跳转到全文行首的第一个非空白字符;
            G:跳转至最后一行;跳转到全文最后一行行首的第一个非空白字符;
            ctrl+g:页面最底部出现一个状态信息行,显示的内容是当前编辑的文件名和文件中光标位置;

        句间跳转
            ):跳转至下一句;
            (:跳转至前一句;

        段间跳转 
            }:跳转至下一段;
            {:跳转至前一段;
        
    翻屏:
            ctrl+b:向文件首部翻一屏;
            ctrl+f:向文件尾部翻一屏;
            ctrl+u:向文件首部翻半屏;
            ctrl+d:向文件尾部翻半屏;
            Enter:向下一行后翻;

vim的编辑命令(编辑模式):

    字符编辑:
        x:删除光标所在处的一个字符;
        #x:删除光标所在处后的#个字符;
        xp:交换光标所在处的字符与其后面字符的位置;
        
    删除命令:
        d:删除命令,可结合光标跳转字符,实现范围删除;其实是剪切;
            dd:删除光标所在处一整行;
            #dd:删除光标所在处的行下面的共#行;
            dw:删除光标当前至下一个单词词首;
            de:删除光标当前至后一个单词词尾;
            db:删除光标当前至前一个单词词首;
            d$:删除光标所在处至行尾;
            d0:删除光标之前至绝对行首;
            d^:删除光标之前至行首第一个非空白字符;
            dG:删除光标所在处至全文尾;
            D:删除光标所在处至行尾;

    粘贴命令:
        P(大写):缓存区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至光标所在处的前方;
        p(小写):缓存区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至光标所在处的后方;

    复制命令:
        y:复制,工作行为相似于d命令;
            Y^:复制光标当前所在处至行首;
            y$:复制光标当前所在处至行尾;
            y0:复制光标当前所在处至行首
            yy:复制光标当前所在处的一整行;
            #yy:复制光标当前所在处起始及以下共#行;
            ye:复制光标当前至后一个单词词尾;
            #ye:复制光标当前或后#个单词词尾;
            yw:复制光标当前至下一个单词词首;
            #yw:复制光标当前或下#个单词词首;
            yb:复制光标当前或前一个单词词首;
            #yb:复制光标当前或前#个单词词首;

    改变命令:可与删除中同样的动作配合使用;
            编辑模式 --> 输入模式,按Back键实现删除操作;
            c$:删除光标当前所在处至行尾并切换到输入模式;
            c^:删除光标当前所在处至行首并切换到输入模式;
            c0:删除光标前至行首并切换到输入模式;
            cb:删除光标当前或前一个单词词首并切换到输入模式;
            #cb:删除光标当前或前#个单词词首并切换到输入模式;
            ce:删除光标当前或后一个单词词尾并切换到输入模式;
            #ce:删除光标当前或后#个单词词尾并切换到输入模式;
            cw:删除光标当前或下一个单词词首并切换到输入模式;
            #cw:删除光标当前或下#个单词词首并切换到输入模式;
            cc:删除光标所在的行,并转换为输入模式;
            #cc:删除光标所在处的起始及以下共#行,并转换为输入模式;
            #C:删除光标所在处的起始及以下共#行,并转换为输入模式;

    可视化模式:类似用鼠标拖选;
            v(小写):按字符选定;
            V(大写):按行选定;
            结合编辑命令使用:d(删除),c(删除并修改),y(复制)

    替换命令:替换字符
            r:启动替换字符,输入一个字符,替换为光标处的字符;
            R:连续替换当前至后面多个字符;

    撤销操作:
            u:撤销一次操作;一般可撤销为50步操作;
            #u:撤销#次操作;
            欲撤消在一行中所做的改动,请输入:U (大写的U)

    取消撤销操作:
            Ctrl+r:恢复此前的撤销操作;
            .:重复执行前一个编辑操作;
末行模式:可用vim内置接口,执行很多命令;
    内建的命令行接口
    末行模式切换到编辑模式:2次Esc键;

    地址定界:
            :# 直接跳转至第#行;
            :. 当前行;
            :$ 全文最后一行行首;
            :% 全文;
            :1,$ 全文;
            :#,## 指定从第#行到第##行;
            :#,+# 指定行范围,左侧为起始行绝对编号,右侧为相对左侧行号的偏移量;
            :.,+# 当前行至下#行;
            :#,$-1 第#行到倒数第二行;
            :$-# 倒数第#行;

            /pattern/:从光标所在处起始向文件尾部,第一次被模式所匹配到的行;
            /pat1/,pat2/:从光标所在处起始,第一次由pat1匹配到的行开始,至第一次由pat2匹配到的行结束之间的所有行;
            :搜索范围 w /PATH/TO/SOMEFILE:将范围内的文本保存至指定文件中;即另存为;
            :搜索范围 r /PATH/FROM/SOMEFILE:将指定的文件中的文本读取并插入至指定位置;即文件合并;
            例如:
                :5r /root/test.txt表示将test.txt文件插入到当前文件第5行下方;
            :r !COMMAND 读取外部的命令结果,到当前光标处;
            例如 
                :r !ls:使用外部ls
            :!:执行外部命令
            例如    
                :!dir

    查找
            /PATTERN:从当前光标所在处向文件尾部查找能够被当前模式匹配到的字符串;
            ?PATTERN:从当前光标所在处向文件首部查找能够被当前模式匹配到的字符串;
                 n:下一个,与命令方向相同;
                 N:上一个,与命令方向相反;

    查找并替换:根据查找条件,将其结果执行处理;
        s:末行模式的命令;使用格式:
            :搜索范围 s/要查找的内容/替换为的内容/修饰符
                要查找的内容:可使用正则表达式;
                替换为的内容:不能使用正则表达式,但可引用;

            /:为命令分隔符,可随意指定特殊符号,只要不与命令冲突即可,如@、#等,否则使用/路径分隔符同命令分隔符时需要转义;

            修饰符:
                    i:忽略大小写;
                    g:全局替换,意味着一行中如果匹配到多次,则均替换;如果不加全局标识,仅从光标处之后执行一次;
                    c:提示是否进行替换;
练习:
    1、全文查找this替换成This(只替换每一行第一次匹配到的)
        :%s/this/This/
    2、从第1行到20行把所有this,替换成THIS;
        :1,20s/this/THIS/g
    3、查找时不区分大小写;
        :1,20s/this/THIS/i
    4、查找全文/cgroup/systemd全部替换为/etc/sysconfig;
        :%s/\/cgroup\/systemd/\/etc\/sysconfig/g:/需要转义
        :%s@/cgroup/systemd@/etc/sysconfig@g:@不需要转义
    5、查找全文,以t开头单词,替换为T;
        :%s#\<t\([[:alpha:]]\+\)\>#T\1#g
    6、查找所有以t开头的单词,后面加上er;
        :%s#\<t[[:alpha:]]\+\>#&er#g
    7、删除开头为#的行;
        :%s@^#@@

bash脚本编程之算术运算:

算术运算符:
    +,-
    *,/
    %:取余;
    **:次方;
算术运算格式:

    (1)let VAR=算术表达式;放在VAR变量中以便引用;
        例如:let a=$num1+$num2;

    (2)VAR=$[算术表达式];可单独使用,不用赋值变量;
        例如:c=$[$num1+$num2]
        或:echo $[$num1+$num2]

    (3)VAR=$((算术表达式))
        例如:echo $(($num1+$num2))
 用法:
    num1=3
    num2=67
    let a=$num1+$num2
    echo $a
    结果是70

    c=$[$num1+$num2]
    echo $[$num1+$num2]
    echo $(($num1+$num2))
    expr $num1 + $num2:是个命令;
    d=$(expr $num1 + $num2):要通过命令引用赋值给变量后才能赋值给变量;
    $d
    d=$(expr $num1 \* $num2)

bash脚本编程之逻辑运算:主要操作的是命令的运行状态结果即退出码;
可认为有一种判断的机制在里面;判断取决于是与运算还是或运算还取决于第一个操作的结果;

    运算数:true(1),false(0)
        COMMAND运行状态结果:
            0:TRUE,成功;
            1-255:FALSE,错误;

    与:见false(0)为false(0);相当于乘法;
        true && true = true
        true && false = false
            第一个操作数为true,其结果取决于第二个操作数;
        false && true = false
        false && false = false
            第一个操作数为false,其结果至此可判定为false;

        用法:
        ~]# ls /var && cat /etc/fstab
        ~]# lls /var && cat /etc/fstab:不执行第二个操作

    或:见true(1)为true(1);相当于加法;
        true || true = true
        true || false = true
            第一个操作数为true,其结果至此可判定为ture;
        false || true = true
        false || false = false
            第一个操作数为false,其结果取决于第二个操作数;

        用法:
        ~]# id hive || useradd hive:如果用户不存在,则添加用户;

    非:取反
        ! true = false
        ! fase = true

        用法:
        ~]# ! id hive && useradd hive:如果用户不存在,则添加用户;

    优先级:非 (高)<--与 <--或(低)

脚本练习:

1、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到 /root/etcYYYY-mm-dd中

[root@centos7 ~]#vim /bin/backup.sh

!/bin/bash

description: backup etc dir

today=date +%F-%T
echo "starting backup"

cp -av /etc/ /root/etc$today
echo "backup is finished"

unset today

[root@centos7 bin]#cd /bin
[root@centos7 bin]#chmod +x backup.sh
[root@centos7 bin]#bash -x backup.sh
[root@centos7 bin]#cd
[root@centos7 ~]#ls
aaa Documents f2 linux-4.18.13 Public
anaconda-ks.cfg Downloads filenJv linux-4.18.13.tar.xz teasong1.wav
backup_etc.sh dpt hello.c linux.txt Templates
cat etc2019-05-30-15:31:46 //成功

2、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统

nologin.sh:
[root@centos7 bin]#vim nologin.sh

!/bin/bash

[ -f /etc/nologin ] && echo "already can not access"||(touch /etc/nologin && echo "create /etc/nologin success")

login.sh:
[root@centos7 bin]#vim login.sh

!/bin/bash

[ -f /etc/nologin ] && (rm -f /etc/nologin;echo " delete /etc/nologin success") || echo "already can access"

[root@centos7 bin]#chmod +x nologin.sh
[root@centos7 bin]#bash -n nologin.sh //检查语法有无错误
[root@centos7 bin]#bash -x nologin.sh //执行脚本

  • '[' -f /etc/nologin ']'
  • touch /etc/nologin
  • echo 'create /etc/nologin success'
    create /etc/nologin success
    [root@centos7 bin]#./nologin.sh
    already can not access
    [root@centos7 bin]#chmod +x login.sh
    [root@centos7 bin]#bash -n login.sh
    [root@centos7 bin]#./login.sh
    delete /etc/nologin success
    [root@centos7 bin]#./login.sh
    already can access
    [root@centos7 bin]#

3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
[root@centos7 bin]#vim disk.sh

!/bin/bash

echo MAX=df | sed -nr '/^\/dev\/sd/s/.* ([0-9]+%).*/\1/p'|sort -nr |head -n1
~
~
"disk.sh" [New] 12L, 423C written
[root@centos7 bin]#chmod +x disk.sh
[root@centos7 bin]#bash -n disk.sh
[root@centos7 bin]#disk.sh
MAX=18%
[root@centos7 bin]#

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容