shell精华概述

    科技2022-07-16  124

    shell精华概述


    前言

    shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。


    一、脚本入门

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

    2)第一个shell脚本:helloworld

    vim helloworld.sh 在helloworld.sh中输入如下内容 #!/bin/bash echo "helloworld"

    二、变量

    1.系统变量

    1)常用系统变量

    $HOME、$PWD、$SHELL、$USER等

    2)案例实操 查看系统变量的值

    echo $HOME /home/yilei

    显示当前shell中的所有变量

    set BASH=/bin/bash BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=()

    2.自定义变量

    1)基本语法 (1)定义变量:变量=值 (2)撤销变量:unset 变量 (3)声明静态变量:readonly变量,注意:不能unset

    2)变量定义规则 (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。 (2)等号两侧不能有空格 (3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。 (4)变量的值如果有空格,需要使用双引号或单引号括起来。

    3)案例实操 (1)定义变量A

    A=5 echo $A 5

    (2)给变量A重新赋值

    A=8 echo $A 8

    3.特殊变量

    1)$n 基本语法

    功能描述:n为数字,$0代表该脚本名称, $1-$9代表第一到第九个参数,十以上的参数参数需要用大括号包含,如${10}

    2)$# 基本语法

    功能描述:获取所有输入参数个数,常用于循环

    3)$* 基本语法

    功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体

    4)$@ 基本语法

    功能描述:这个变量也代表命令行中所有的参数, 不过$@把每个参数区分对待

    5) $?基本语法

    功能描述:最后一次执行的命令的返回状态。 如果这个变量的值为0,证明上一个命令正确执行; 如果这个变量的值为非0(具体是哪个数,由命令自己来决定), 则证明上一个命令执行不正确了。

    三、运算符

    1.基本语法

    $((运算式)) 或 $[ 运算式 ]

    2.案例实操

    计算(4+6)*4

    S=$[ (4+6)*4 ] echo $S

    四、条件判断

    1.基本语法

    test condition [ condition ](注意condition前后要有空格) 注意:条件非空即为true,[ yilei ]返回true,[]返回false

    2.常用判断条件

    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)

    3.案例实操

    1)23是否大于等于22

    [ 23 -ge 22] echo $? 0

    2)helloworld.sh是否具有写权限

    [ -w helloworld.sh ] echo $? 0

    3)/home/yilei/cls.txt目录中的文件是否存在

    [ -e /home/yilei/xsync.sh ] echo $? 1

    4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)

    [ condition ] && echo OK || echo notOK OK [ condition ] && [ ] || echo notOK notOK

    五、流程控制

    1.if判断

    通过案例了解它的语法

    #!bin/bash if [ $1 -eq "1" ] then echo "yilei" elif [ $1 -eq "2" ] then echo "leiyi" fi

    2.case语句

    通过案例了解它的语法

    #!bin/bash case $1 in "1") echo "this is one" ;; "2") echo "this is two" ;; *) echo "this is others" ;; easc

    3.for循环

    通过案例了解它的语法 案例一:

    #!bin/bash for (( i=0;i<=100;i++ )) do s=$[ $s+$i ] done echo $s

    案例二:

    #!bin/bash for i in $* do echo "yilei love l" done

    4.while循环

    通过案例了解它的语法 案例一:

    #!bin/bash s=0 i=1 while [ $i -le 100 ] do s=$[ $s+$i ] i=$[ $i+1 ] done echo $s

    六、系统函数

    1.basename

    1)案例实操

    ~ basename /home/yilei/helloworld.txt helloworld.txt ~ base /home/yilei/helloworld.txt .txt helloworld

    2.dirname

    1)案例实操

    ~ dirname /home/yilei/helloworld.txt /home/yilei

    七、shell工具

    1.cut

    选项参数说明

    -f 列号,提取第几列 -d 分隔符,按照指定分隔符分隔列 -c 指定具体的字符

    (1)数据准备

    ~ vim cut.txt dong shen guan zhen wo wo lai lai le le

    (2)切割cut.txt第一列

    ~ cut -d " " -f 1 cut.txt dong guan wo lai le

    (3)在cut.txt文件中切割出guan

    ~ cat cut.txt | grep "guan" | cut -d " " -f 1 guan

    2.awk

    选项参数说明

    -F 指定输入文件拆分隔符 -v 赋值一个用户定义变量

    (1)案例实操 切割IP

    ifconfig ens33 | grep netmask | awk -F " " '{print $2}' 192.168.1.111

    八、正则表达式入门

    1.常规匹配

    1)案例实操

    cat /etc/passwd | grep yilei 就会匹配所有包含yilei的行

    2.常用特殊字符

    1)特殊字符:^

    cat /etc/passwd | grep ^a 就会匹配所有以a开头的行

    2)特殊字符:$

    cat /etc/passwd | grep t$ 就会匹配所有以t结尾的行

    3)特殊字符:.

    cat /etc/passwd | grep r..t 就会匹配包含rabt,rbbt,root等所有行

    4)特殊字符:*

    cat /etc/passwd | grep ro*t 就会匹配包含rt,rot,root等所有行

    5)特殊字符:[ ]

    cat /etc/passwd | grep r[a,b,c]t 就会匹配包含rat,rabt,rbact等所有行

    6)特殊字符:\

    cat /etc/passwd | grep a\$b 就会匹配包含a$b等所有行

    练一手

    练习一:集群数据同步脚本

    #1、判断是否有目录/文件传入 if [ $# -lt 1 ] then echo "必须传入一个参数..." exit fi #2、遍历输入的目录/文件,一个一个传输 for f in $@ do #2.1、判断文件/目录是否存在 if [ -e $f ] then #2.2、获取父目录以及文件名/最后一级目录名 pdirname=$(cd $[ dirname $f ];pwd) fname=$(basename $f) 3、遍历主机 for host in Hadoop01 Hadoop02 Hadoop03 do echo "======$host======" #4、创建父目录 ssh $host "mkdir -p $pdirname" #5、传输文件/目录 rsync -av $pdirname/$fname $host:$pdirname done fi done

    练习二:kafka集群启动脚本

    #1、判断是否传入参数 if [ $1-lt 1 ] then echo "必须传入一个参数..." fi #2、根据传入参数匹配是否启动/停止/查看状态 case $1 in "start") for host in hadoop01 hadoop02 hadoop03 echo "========start $host kafka========" ssh $host "/opt/module/kafka/bin/kafka-server-start.sh -daemon /opt/module/kafka/config/server.properties" done ;; "stop") for host in hadoop01 hadoop02 hadoop03 echo "=======stop $host kafka========" ssh $host "/opt/module/kafka/bin/kafka-server-stop.sh" done ;; "status") for host in hadoop01 hadoop02 hadoop03 echo "=======status $host kafka========" pid=$(ssh $host "ps -ef | grep server.properties | grep -v grep") [ "$pid" ] && echo "kafka进程正常" || echo "kafka进程不存在或异常" done ;; *) echo "参数输入错误,必须为start、stop、status其中的一个..." ;; esac
    Processed: 0.010, SQL: 8