zoukankan      html  css  js  c++  java
  • 【Linux】Shell基础

    一、shell概述  

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

      shell是一个功能强大的编程语言,具有易编写、易调试灵活性强等特点

    二、shell解析器

       Linux提供的shell解析器有:

    1 [root@H__D temp]# cat /etc/shells 
    2 /bin/sh
    3 /bin/bash
    4 /usr/bin/sh
    5 /usr/bin/bash

        bash和sh的关系:

    1 [root@H__D temp]# ll /bin/ | grep bash
    2 -rwxr-xr-x  1 root root      964600 Aug  8  2019 bash
    3 lrwxrwxrwx  1 root root          10 Apr  5  2020 bashbug -> bashbug-64
    4 -rwxr-xr-x  1 root root        6964 Aug  8  2019 bashbug-64
    5 lrwxrwxrwx  1 root root           4 Apr  5  2020 sh -> bash 

       ​ Centos默认的解析器为bash

    1 [root@H__D temp]# echo $SHELL
    2 /bin/bash

    三、shell脚本入门

      格式:​ 开头必须以 #!/bin/bash 开头

      编写简单实例:

    1 [root@hadoop101 tmp]# vim hello.sh
    2 
    3 #!/bin/bash
    4 
    5 echo "Hello World!"

      赋予执行权限:

    1 [root@hadoop101 tmp]# chmod +x hello.sh 

      执行结果为:

    1 [root@hadoop101 tmp]# ./hello.sh 
    2 Hello World!
    3 [root@hadoop101 tmp]# sh hello.sh 
    4 Hello World!

    脚本的常用执行方式为:

      1.采用bash 或 sh+脚本的相对路径或绝对路径 (不用赋予脚本 +x 的权限)

    1 [root@hadoop101 tmp]# bash hello.sh 
    2 Hello World!
    3 [root@hadoop101 tmp]# bash /opt/module/tmp/hello.sh 
    4 Hello World!
    5 [root@hadoop101 tmp]# sh hello.sh 
    6 Hello World!
    7 [root@hadoop101 tmp]# sh /opt/module/tmp/hello.sh 
    8 Hello World!

      ​ 2.采用输入脚本的绝对路径或者相对路径执行脚本(必须赋予可执行权限 +x)

    1 [root@hadoop101 tmp]# chmod +x hello.sh 
    1 [root@hadoop101 tmp]# ./hello.sh 
    2 Hello World!
    3 [root@hadoop101 tmp]# /opt/module/tmp/hello.sh 
    4 Hello World!

      上述两种方式的区别:

      第一种执行方式,其本质是bash解析器帮你执行脚本,所以脚本不需要可执行权限

      第二种方式,本质是自己执行,需要执行权限才可执行

    四、变量  

    系统预设变量

      1、常用的系统变量 ​ $HOME $PWD $SHELL $USER等

      2、显示当前shell中所有变量: set (由于太多就不在展示)

    自定义变量

    1.语法
    ​ 1>. 定义变量: 变量=值

    ​ 2>. 撤销变量: unset 变量

    ​ 3>. 声明静态变量: readonly变量,注意:不能unset

    2.变量定义规则
    ​ 1>.变量名称可以有字母、数字、下划线组成,但是不能以数字开头,环境变量建议使用全大写英文

    ​ 2>.等号两侧不能有空格

    ​ 3>.在bash中,变量默认都是字符串类型 ,无法直接进行数值运算

    ​ 4>.变量的值如果有空格,需要使用双引号或者单引号括起来

     1 # 定义变量A
     2 [root@hadoop101 tmp]# A=5
     3 [root@hadoop101 tmp]# echo $A
     4 5
     5 # 给变量A重新赋值
     6 [root@hadoop101 tmp]# A=8
     7 [root@hadoop101 tmp]# echo $A
     8 8
     9 # 撤销变量A
    10 [root@hadoop101 tmp]# unset A
    11 [root@hadoop101 tmp]# echo $A
    12 # 定义静态变量
    13 [root@hadoop101 tmp]# readonly B=2
    14 [root@hadoop101 tmp]# echo $B
    15 2
    16 # 验证给静态变量改值(readonly变量不能修改)
    17 [root@hadoop101 tmp]# B=33
    18 -bash: B: 只读变量
    19 # 验证直接使用运算符号 (不能直接运算)
    20 [root@hadoop101 tmp]# C=1+2
    21 [root@hadoop101 tmp]# echo $C
    22 1+2
    23 
    24 
    25 # 当命名的变量值有空格时,不能直接写,需要使用单引号或者双引号括起来
    26 [root@hadoop101 tmp]# D=Hello world
    27 -bash: world: 未找到命令
    28 [root@hadoop101 tmp]# D="Hello world"
    29 [root@hadoop101 tmp]# echo $D
    30 Hello world
    31 
    32 #可以使用export将变量提升为全局变量 可供其他Shell程序使用
    33 export D
    34 # 做完上述操作之后,变量D 就成了全局变量,在其他脚本里面也可以执行 

    3.特殊变量

    $n 基本语法:

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

    ​ $#基本语法:

    ​ $# (功能描述: 获取所有参数的个数,常用语循环中)

    ​ $ $@ 基本语法*:

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

    ​ **@ ∗ ∗ ( 功 能 描 述 : 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @** (功能描述:这个变量也代表命令行中所有的参数,不过@∗∗(功能描述:这个变量也代表命令行中所有的参数,不过@把所有参数分开对待)

    $?基本语法

    ​ $? (功能描述:表示最后一次执行的命令的执行结果成功与否,如果变量值为0表示执行正确,如果非0表示上次执行的出现了问题 )

     1 [root@H__D temp]# cat parameter.sh 
     2 #!/bin/bash
     3 
     4 echo "$0 $1 $2 $3"
     5 
     6 echo $#
     7 
     8 echo $*
     9 
    10 echo $@
    11 [root@H__D temp]# sh parameter.sh a b c d 
    12 parameter.sh a b c
    13 4
    14 a b c d
    15 a b c d
    16 [root@H__D temp]# 

    五、运算符

      (1)“$((运算式))”或“$[运算式]” 

      (2)expr + , - , *, /, % 加,减,乘,除,取余 , 注意:expr运算符间要有空格 

    1 [root@H__D temp]# echo $[(2+3)*4]
    2 20
    3 
    4 [root@H__D temp]# expr `expr 2 + 3` * 4
    5 20 

    六、条件判断

    ​ [ condition ] (注意condition前后要有空格)

    常用判断条件:

    ​ 1.两个整数之间的比较

    = 字符串比较

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

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

    -ge 大于等于(greater then) -ne 不等于(Not equals)

    ​ 2.按照文件权限进行判断

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

    -x 有执行权限

    ​ 3.按照文件类型进行判断

    -f 文件存在并且是一个常规文件

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

    ​ 实例操作

     1 # 判断1是否大于2
     2 [root@hadoop101 tmp]# [ 1 -gt 2 ]
     3 [root@hadoop101 tmp]# echo $?
     4 1
     5 # 判断hello.sh是否具有可写权限
     6 [root@hadoop101 tmp]# [ -w hello.sh ]
     7 [root@hadoop101 tmp]# echo $?
     8 0
     9 # 判断制定的文件是否存在
    10 [root@hadoop101 tmp]# [ -e /opt/module/tmp/hello.sh ]
    11 [root@hadoop101 tmp]# echo $?
    12 0

    4.多条件判断

    && 表示前一条命令执行成功时,才执行后一条

    || 表示上一条命令执行失败后,才执行下一条命令

    七、流程控制

    1. if 判断

    1 if [ 条件表达式 ]
    2 
    3 then
    4 
    5 ​    程序
    6 
    7 fi

    或者

     1 if [ 条件表达式 ]
     2 
     3 ​    then
     4 
     5 ​        程序
     6 
     7 ​    elif [ 条件判断式 ]
     8     then
     9 ​        程序
    10     else
    11         程序
    12 
    13 fi

    注意事项:

    ​ 1.if后要有空格

    ​ 2.[ 条件表达式 ] ,中括号和条件表达式之间 必须有空格

    实例操作:

     1 #!/bin/bash
     2 if [ $# -lt 1 ]
     3 then
     4   echo "请输入参数!"
     5   exit
     6 fi
     7 if [ $1 -lt 2 ]
     8 then
     9   echo "$1 小于2"
    10 else
    11   echo "$1 大于2"
    12 fi

    执行结果:

    1 [root@hadoop101 tmp]# ./testif.sh  1
    2 1 小于2
    3 [root@hadoop101 tmp]# ./testif.sh  4
    4 4 大于2

    2.case语句

    格式:

     1 case  $变量名  in
     2"值1" )
     3 ​    如果变量值等于1,则执行程序1
     4 ​;;
     5"值2" )
     6 ​    如果变量值等于2,则执行程序2
     7 ​;;
     8 ​*)
     9 ​    如果变量的值都不是以上的值,则执行此程序
    10 ​;;
    11 esac

    1.case行尾必须为单词 in, 每一个模式匹配必须以有括号“(”结束

    ​ 2.双 ;; 号表示命令序列结束,相当于java中的break

    ​ 3.最后的 “)” 表示默认模式,相当于java中的default

    案例操作:

     1 #!/bin/bash
     2 if [ $# -lt 1 ]
     3 then
     4   echo "请输入参数!"
     5   exit
     6 fi
     7 case $1 in
     8 "1")
     9   echo  "输入的值等于1"
    10 ;;
    11 "2")
    12   echo  "输入的值等于2"
    13 ;;
    14 "3")
    15   echo  "输入的值等于3"
    16 ;;
    17 *)
    18   echo "输入的值为其他!"
    19 ;;
    20 esac

    执行结果为:

    1 [root@hadoop101 tmp]# ./testcase.sh  3
    2 输入的值等于3
    3 [root@hadoop101 tmp]# ./testcase.sh  1
    4 输入的值等于1
    5 [root@hadoop101 tmp]# ./testcase.sh  2
    6 输入的值等于2
    7 [root@hadoop101 tmp]# ./testcase.sh  5
    8 输入的值为其他!

    3.for循环

    基本语法一:

    1 for((初始值;循环控制条件;变量变化))
    2do
    3 ​    程序
    4 ​done

    案例驱动:1到100的和

    1 #!/bin/bash
    2 sum=0
    3 for ((a=1;a<101;a++))
    4 do
    5  sum=$[ $sum+$a ]
    6 done
    7 echo $sum  

    测试结果

    1 [root@hadoop101 tmp]# ./testForOne.sh 
    2 5050

    基本语法二:

    1 for   变量  in 值1,值2,值3...
    2do
    3 ​    程序
    4 ​done

    案例驱动:打印1到5的值

    1 #!/bin/bash
    2 for i in 1 2 3 4 5
    3 do
    4   echo $i
    5 done

    执行结果:

    1 [root@hadoop101 tmp]# ./testForTwo.sh 
    2 1
    3 2
    4 3
    5 4
    6 5

    $* 和 $@ 的区别:

    都表示传递给函数和脚本的所有参数,不被双引号“”包含时,都是以$1 $2 $3 $4 的形式输出参数

    当被“”包括时,”$*“会将所有参数作为一个整体,当一个整体输出“$1 $2 $3 $4”

    ​ “$@” 会将各个参数分开,是以 “$1” “$2” “$3” “$4” 的形式输出所有参数

    4.while循环

    语法格式:

    1 while [ 条件表达式 ]
    2do
    3 ​    程序
    4 ​done

    案例驱动:(1到100的和)

    1 #!/bin/bash
    2 sum=0
    3 i=1
    4 while [ $i -lt 101 ]
    5 do
    6  sum=$[ $sum+$i ]
    7  i=$[ $i+1 ]
    8 done
    9 echo $sum

    执行结果:

    1 root@hadoop101 tmp]# ./testWhile.sh 
    2 5050

    八、read读取控制台输入

    ​ 1.基本语法

    ​ read(选项)(参数)

    ​ 选项:

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

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

    ​ 参数

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

    案例驱动:

    1 #!/bin/bash
    2 read -t 7 -p "请在七秒内输入你的姓名:" NAME
    3 echo $NAME

    执行结果:

    1 [root@hadoop101 tmp]# ./testRead.sh 
    2 请在七秒内输入你的姓名:VmPerson
    3 VmPerson

    九、函数

    常见系统函数

    basename

    基本语法:

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

    ​ 选项:

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

    1 [root@hadoop101 tmp]# basename /opt/module/tmp/testWhile.sh 
    2 testWhile.sh
    3 [root@hadoop101 tmp]# basename /opt/module/tmp/testWhile.sh  .sh
    4 testWhile

    dirname:

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

    1 [root@hadoop101 tmp]# dirname /opt/module/tmp/testWhile.sh 
    2 /opt/module/tmp

    自定义函数

    语法构造:

    1 [ function ] funname[()]
    2 {
    3      Action;
    4     [return int;]
    5 }
    6 funname

    注意事项:

    ​ 1.必须在调用之前先声明函数,shell脚本是逐行运行,不像其他语言一样先编译

    ​ 2.函数返回值,只能通过$?系统变量获得,可以加显示return返回,不加,则以最后一条运行结果作为返回值,return后跟数值(0-255)

    ​ 案例驱动:(自定义求和函数)

     1 [root@H__D temp2]# cat sum.sh 
     2 #!/bin/bash
     3 
     4 # 声明
     5 function sum()
     6 {
     7         s=0
     8         s=$[ $1 + $2 ]
     9         echo $s
    10         return $s
    11 }
    12 
    13 # 读取输入参数
    14 read -p "input your paratemer1: " P1
    15 read -p "input your paratemer2: " P2
    16 
    17 # 调用执行
    18 sum P1 P2
    19 
    20 [root@H__D temp2]# sh sum.sh 
    21 input your paratemer1: 2
    22 input your paratemer2: 3 
    23 5
    24 [root@H__D temp2]# echo $?
    25 5
    26 [root@H__D temp2]# 

    十shell工具

    cut

     cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出

    ​ 基本语法:

    ​ cut [选项参数] filename

    ​ 默认分隔符为制表符号

    ​ 项参数说明

    选项参数功能
    -f 列号,提取第几列 (如果是多列以,间隔)
    -d 分隔符,按照指定分隔符分割列
    -c 指定具体的字符

    案例驱动:

    1 # 按照空格切割,取第一列
    2 [root@hadoop101 tmp]# cut -d " " -f 1 cut.txt 
    3 dingding
    4 honghong
    5 yanyan
    6 didi
    7 #使用cut切ip
    8 [root@hadoop101 tmp]# ifconfig ens33 | grep "inet" |cut -d:  -f 2 | cut -d" " -f10
    9 192.168.1.101

    sed

    ​ sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出

    基本语法:

    ​ sed [选项参数] ‘command’ filename

    选项参数说明

    选项参数功能
    -e 直接在指令列模式上进行sed的动作编辑。
    -i 直接编辑文件

    3**)命令功能描述**

    命令功能描述
    a 新增,a的后面可以接字串,在下一行出现
    d 删除
    s 查找并替换

    awk

    一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理.

    基本用法

    awk [选项参数] ‘pattern1{action1} pattern2{action2}…’ filename

    pattern:表示AWK在数据中查找的内容,就是匹配模式

    action:在找到匹配内容时所执行的一系列命令

    选项参数说明

    选项参数功能
    -F 指定输入文件折分隔符
    -v 赋值一个用户定义变量

    awk****的内置变量
    变量说明
    FILENAME 文件名
    NR 已读的记录数
    NF 浏览记录的域的个数(切割后,列的个数)

    案例驱动:

     1 #passwd文件 以root开头的打印第七列
     2 [root@hadoop101 tmp]# awk -F: '/^root/{print $7}' passwd 
     3 /bin/bash
     4 # 统计passwd文件名,每行的行号,每行的列数
     5 [root@hadoop101 tmp]# awk -F: '{print "filename:"  FILENAME ", linenumber:" NR  ",columns:" NF}' passwd
     6 filename:passwd, linenumber:1,columns:7
     7 filename:passwd, linenumber:2,columns:7
     8 filename:passwd, linenumber:3,columns:7
     9 filename:passwd, linenumber:4,columns:7
    10 filename:passwd, linenumber:5,columns:7
    11 filename:passwd, linenumber:6,columns:7
    12 filename:passwd, linenumber:7,columns:7
    13 filename:passwd, linenumber:8,columns:7
    14 filename:passwd, linenumber:9,columns:7
    15 filename:passwd, linenumber:10,columns:7
    16 filename:passwd, linenumber:11,columns:7
    17 filename:passwd, linenumber:12,columns:7
    18 filename:passwd, linenumber:13,columns:7
    19 filename:passwd, linenumber:14,columns:7
    20 filename:passwd, linenumber:15,columns:7
    21 filename:passwd, linenumber:16,columns:7
    22 filename:passwd, linenumber:17,columns:7
    23 filename:passwd, linenumber:18,columns:7
    24 filename:passwd, linenumber:19,columns:7
    25 filename:passwd, linenumber:20,columns:7
    26 
    27 #切割ip
    28 [root@hadoop101 tmp]# ifconfig ens33| awk -F "[ /]+" '/inet /{print $3}'
    29 192.168.1.101
    30 #打印空行所在行行号
    31 [root@hadoop101 tmp]# awk '/^$/{print NR}' awk.txt 
    32 3

    sort

    sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

    基本语法

    sort(选项)(参数)

    选项说明
    -n 依照数值的大小排序
    -r 以相反的顺序来排序
    -t 设置排序时所用的分隔字符
    -k 指定需要排序的列

    参数:指定待排序的文件列表

    案例驱动:对文件内的数据排序并求和

     1 [root@hadoop101 tmp]# sort -n test.txt|awk '{a+=$0;print $0}END{print "SUM="a}'
     2 1
     3 2
     4 3
     5 4
     6 5
     7 6
     8 7
     9 8
    10 9
    11 10
    12 SUM=55

    原文链接:https://blog.csdn.net/weixin_41159197/article/details/107147466

  • 相关阅读:
    Saltstack module acl 详解
    Saltstack python client
    Saltstack简单使用
    P5488 差分与前缀和 NTT Lucas定理 多项式
    CF613D Kingdom and its Cities 虚树 树形dp 贪心
    7.1 NOI模拟赛 凸包套凸包 floyd 计算几何
    luogu P5633 最小度限制生成树 wqs二分
    7.1 NOI模拟赛 dp floyd
    springboot和springcloud
    springboot集成mybatis
  • 原文地址:https://www.cnblogs.com/h--d/p/14851603.html
Copyright © 2011-2022 走看看