• 5月29日-shell复习


    一.Shell概述

    1Linux提供的Shell解析器有:sudo cat /etc/shells

    1. /bin/sh
    2. /bin/bash
    3. /usr/bin/sh
    4. /usr/bin/bash
    5. /bin/tcsh
    6. /bin/csh

    2bash和sh的关系

    1. cd /bin
    2. ll | grep bash 或者使用:ls -l /bin/ | grep bash

    3Centos默认的解析bash

    echo $SHELL

    二.Shell脚本入门

    1)脚本格式

    脚本以#!/bin/bash开头(指定解析器)。

    案例一:第一个Shell脚本:helloworld

    需求:创建一个Shell脚本,输出helloworld

    创建文件夹:mkdir scripts

    创建脚本:touch hello.sh

    vim hello.sh

    在helloworld.sh中输入如下内容

    #!/bin/bash

    echo "helloworld"

    打印输入:bash /scripts/hello.sh 对应的绝对路径

    第二章方式打印:sh /scripts/hello.sh 一样效果

    给脚本增加执行命令:chmod +x /scripts/hello.sh

    直接绝对路径:./hello.sh

    第三种:脚本的常用执行方式(source 是 shell 内嵌)

    source  /scripts/hello.sh

    source hello.sh

    . hello.sh

    第二个Shell脚本:多命令处理

    直接输入hello.sh

    bash: hello.sh: 未找到命令...

    cp hello.sh /bin/

    sudo cp hello.sh /bin/(一般不要使用)

    (方法:不改变bin目录,正常执行)

    1.脚本参数用法:

    三.变量

    1.$n

    ./hello.sh 参数(xiaoming)

    ' ===$n============'原封不动的输出

    #!/bin/bash
    echo '================$n===================='
    echo script name:0
    echo 1st parameter:$1
    echo 2nd parameter:$2
     

    输出:./parameter.sh abc def

    1. ================$n====================
    2. script name:0
    3. 1st parameter:abc
    4. 2nd parameter:def

    2.$#

    用于循环中,次数

    1. #!/bin/bash
    2. echo '================$n===================='
    3. echo script name:0
    4. echo 1st parameter:$1
    5. echo 2nd parameter:$2
    6. echo '================$n===================='
    7. echo parameter numbers:$#

     ./parameter.sh abc def

    1. ================$n====================
    2. script name:0
    3. 1st parameter:abc
    4. 2nd parameter:def
    5. ================$n====================
    6. parameter numbers:2

    3.$*和$@用法

     $*:代表命令行中所有的参数,$*把所有的参数看做一个整体

    $@:代表命令行中所有的参数,$@把这个参数区分对待

    1. 1st parameter:abc
    2. 2nd parameter:def
    3. ================$n====================
    4. parameter numbers:2
    5. ================$*====================
    6. abc def
    7. ================$@====================
    8. abc def

    4.$?

    功能描述:最后一次执行的命令的返回状态。变量为0,上个命令正确执行;

    变量的值为非0(具体数值,由自己命令决定)证明上个命令执行不正确;

     四、运算符

    基本语法:“$((运算式))”或“$[运算式]”

     expr:表达式

    expr 1 + 2

    expr 5 - 2

    直接写乘报错:

    应写:echo $[5 * 2]或者使用echo $((5*2))

    1. [atguigu@hadoop102 scripts]$ expr 1 + 2
    2. 3
    1. [atguigu@hadoop102 scripts]$ expr 5 - 2
    2. 3

    命令替换:

    赋值给a=$[8*2]

    echo $a

    另外写法:

    [atguigu@hadoop102 scripts]$ a=$(expr 5 \* 2)  (一般不用)
    [atguigu@hadoop102 scripts]$ echo $a
    10

    使用expr写法:乘法

    1. [atguigu@hadoop102 scripts]$ a=`expr 5 \* 2`
    2. [atguigu@hadoop102 scripts]$ echo $a
    3. 10

    五.条件判断

         语法:[ condition ]

    1.常用判断条件

    (1)两个整数之间比较

    = 字符串比较

    -lt 小于(less than) -le 小于等于(less equal)

    -eq 等于(equal) -gt 大于(greater than)

    -ge 大于等于(greater equal) -ne 不等于(Not equal)

    (2)按照文件权限进行判断

    -r 有读的权限(read) -w 有写的权限(write)

    -x 有执行的权限(execute)

    (3)按照文件类型进行判断

    -f 文件存在并且是一个常规的文件(file)

    -e 文件存在(existence) -d 文件存在并是一个目录(directory)

    1. [atguigu@hadoop102 scripts]$ a=15
    2. [atguigu@hadoop102 scripts]$ [ $a -lt 20 ] && echo "$a < 20" || echo "$a >=20"
    3. 15 < 20
    4. [atguigu@hadoop102 scripts]$ a=27
    5. [atguigu@hadoop102 scripts]$ [ $a -lt 20 ] && echo "$a < 20" || echo "$a >=20"
    6. 27 >=20

    六、流程控制(重点) 

    1 if 判断

    1.基本语法

    if [ 条件判断式 ];then

      程序

    fi

    或者

    if [ 条件判断式 ]

      then

        程序

    fi

    注意事项:

    (1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

    (2)if后要有空格

    举个例子:

    1. a=25
    2. if [ $a -gt 18 ]; then echo OK;fi
    1. [atguigu@hadoop102 scripts]$ if [ $a -gt 18 ] && [ $a -lt 35 ];then echo OK;fi
    2. OK

    2 case 语句

    基本语法

    case $变量名 in

      "值1")

        如果变量的值等于值1,则执行程序1

        ;;

      "值2")

        如果变量的值等于值2,则执行程序2

        ;;

      …省略其他分支…

      *)

        如果变量的值都不是以上的值,则执行此程序

        ;;

    esac

    注意事项:

    1. case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
    2. 双分号“;;”表示命令序列结束,相当于java中的break。
    3. 最后的“*)”表示默认模式,相当于java中的default。

    3.for 循环

    1.基本语法1

    for (( 初始值;循环控制条件;变量变化 ))

      do

        程序

      done

    例如:创建脚本:parameter_for_test.sh

    给予权限:chmod 777 parameter_for_test.sh执行

    1. echo '===================$*===================='
    2. for para in "$*"
    3. do
    4. echo $para
    5. done
    6. echo '==================$@====================='
    7. for para in "$@"
    8. do
    9. echo $para
    10. done

    执行:./parameter_for_test.sh a b c d e

    结果输出:
    ===================$*====================
    a b c d e
    ==================$@=====================
    a
    b
    c
    d
    e

    备注:“$*”把所有元素当成整体输出

    “$@”把数据当成独立数据输出,依次打印

    4.while 循环

    1.基本语法

    while [ 条件判断式 ]

      do

        程序

      done

    七、read读取控制台的输入

    1.基本语法

    read(选项)(参数)

    选项:

    -p:指定读取值时的提示符;

    -t:指定读取值时等待的时间(秒)。

    参数

    变量:指定读取值的变量名

    八、函数(一段代码的集合)

    1.系统函数(也叫:命令替换)

    basename:

    创建脚本:cmd_test.sh

    1. #!/bin/bash
    2. filename="$1"_log_$( date +%s)
    3. echo $filename

     执行权限:chmod +x cmd_test.sh

    备注:$( date +%s)

    1).basename基本语法

    basename [string / pathname] [suffix]   (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。

    选项:

    suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

    例如:

    1. [atguigu@hadoop102 scripts]$ basename /home/atguigu/scripts/parameter.sh
    2. parameter.sh

    本质上路径可以随便写(不需要确定是否存在具体路径):找最后一个目录/ 相当于做字符串剪切

    1. [atguigu@hadoop102 scripts]$ basename /home/atguigu/helo/parameter.sh
    2. parameter.sh

    剪切最后一个/后缀

    1. [atguigu@hadoop102 scripts]$ basename /home/atguigu/scripts/parameter.sh .sh
    2. parameter

    2).dirname基本语法

    dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

    截取最后一个斜杠 /之前的路径:

    1. [atguigu@hadoop102 scripts]$ dirname /home/atguigu/scripts/parameter.sh
    2. /home/atguigu/scripts

    截取最后一个斜杠前的相对路径:

    1. [atguigu@hadoop102 scripts]$ dirname ../atguigu/scripts/parameter.sh
    2. ../atguigu/scripts

     截取路径:仅值切割 最后一个斜杠前路径 /

    2.自定义函数

    九、综合案例

    1.归档文件

    归档命令:tar

    自动归档:crontab -l

    十、正则表达式

    正则表达式用来检索,替换,符合某个模式的文本。

    1.常规匹配

    不含特殊字符的表达式匹配它自己。(存文本匹配)如筛选

    cat /etc/passwd | grep xx

    2.特殊匹配

    1)使用^号配置开头

    atguigu@hadoop102 ~]$ cat /etc/passwd | grep ^a
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    2)$匹配一行的结束

    例如:匹配出所有以t结尾的行。

    [atguigu@hadoop102 ~]$ cat /etc/passwd | grep t$
    halt:x:7:0:halt:/sbin:/sbin/halt

    匹配出空格:cat /etc/passwd | grep ^$

    1. [atguigu@hadoop102 scripts]$ cat daily_achive.sh |grep -n ^$
    2. 2:
    3. 9:
    4. 22:
    5. 25:
    6. 29:
    7. 33:
    8. 35:
    9. 38:
    10. 49:


    3. .匹配一个任意的字符

    1. [atguigu@hadoop102 scripts]$ cat daily_achive.sh |grep r..t
    2. DEST=/home/atguigu/scripts/archive/$FILE

    4. *不单独使用

    他和上一个字符连用,表示匹配上一个字符0次或多次。

    [atguigu@hadoop102 scripts]$ cat daily_achive.sh |grep r..t
    DEST=/home/atguigu/scripts/archive/$FILE
    5. .* 

    [atguigu@hadoop102 scripts]$ cat /etc/passwd | grep ^a.*bash$
    atguigu:x:1003:1003::/home/atguigu:/bin/bash


    6.字符区间使用(中括号):[ ]

    1. [atguigu@hadoop102 scripts]$ echo "rbtadfasf" | grep r[a,b]t
    2. rbtadfasf
    3. [atguigu@hadoop102 scripts]$ echo "23ddratadfasf" | grep r[a,b]t
    4. 23ddratadfasf

    7. \ 

    十一、文本处理工具

    1.cut

    1.基本用法

    cut [选项参数]  filename

  • 相关阅读:
    Excel 从网站获取表格
    Squid代理:APT、PyPI和Docker的内网穿透解决方案
    设计模式-迭代器模式
    [SWPU2019]Web1
    Linux文件管理知识:文本处理
    .css和.qss的区别
    大数据讲课笔记3.3 Hadoop集群配置
    字节青训营|安卓基础知识笔记,快速入门!
    Java强弱软虚4种引用
    Python:if判断--综合案例练习:石头剪刀布
  • 原文地址:https://blog.csdn.net/2301_77257988/article/details/139305842