• shell脚本基础教程,快速上手


    第一个Shell脚本:helloworld

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

    接下来创建一个Shell脚本,输出helloworld

    1. touch hello.sh

    2. 写入 命令

      #!/bin/bash

      echo “helloworld”

    3. 保存后执行,图中分为绝对路径和相对路径执行,sh bash一样功能,只不过sh指向bash,是个软连接,最后也是调用bash;直接在根目录下执行需要赋予脚本权限

    在这里插入图片描述

    第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

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

    在shell目录下创建一个demo.txt,在demo.txt文件中增加“I like drinking Coke”。

    #!/bin/bash
    touch demo.txt
    echo "I like drinking Coke" >> demo.txt
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    Shell中的变量

    系统以及自定义变量

    常用系统变量: H O M E 、 HOME、 HOMEPWD、 S H E L L 、 SHELL、 SHELLUSER等,方便在文件写入操作。

    在这里插入图片描述

    1.基本语法

    ​ (1)定义变量:变量=值

    ​ (2)撤销变量:unset 变量

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

    2.变量定义规则

    ​ (1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。

    ​ (2)等号两侧不能有空格

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

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

    ​ (5)可把变量提升为全局环境变量,可供其他Shell程序使用:export 变量名

    sxh@learn-basis:shell$ A=4				//定义变量A
    sxh@learn-basis:shell$ echo $A
    4
    sxh@learn-basis:shell$ A=9				//给变量A重新赋值
    sxh@learn-basis:shell$ echo $A
    9
    sxh@learn-basis:shell$ unset A				//撤销变量A
    sxh@learn-basis:shell$ echo $A
    
    sxh@learn-basis:shell$ readonly B=2				//声明静态的变量B=2,不能unset
    sxh@learn-basis:shell$ echo $B
    2
    sxh@learn-basis:shell$ unset B
    bash: unset: B:无法取消设定: 只读 variable
    sxh@learn-basis:shell$ C=1+2				//在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
    sxh@learn-basis:shell$ echo $C
    1+2
    sxh@learn-basis:shell$ D=I love you			//变量的值如果有空格,需要使用双引号或单引号括起来
    /*error
    Command 'love' not found, but can be installed with:
    sudo snap install love  # version 11.2+pkg-d332, or
    sudo apt  install love  # version 11.3-1
    See 'snap info love' for additional versions.
    */
    sxh@learn-basis:shell$ D="I love you"
    sxh@learn-basis:shell$ echo $D
    I love you
    sxh@learn-basis:shell$ vi hello.sh
    	写入#!/bin/bash
    	echo "hello sxh"
    	echo $C
    sxh@learn-basis:shell$ ./hello.sh 
    hello sxh
    									//发现并没有打印输出变量C的值。
    sxh@learn-basis:shell$ export C		//把变量提升为全局环境变量,可供其他Shell程序使用
    sxh@learn-basis:shell$ ./hello.sh 
    hello sxh
    1+2				//success
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    特殊变量

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

    新建文件写入

    #!/bin/bash

    echo “$0 $1 $2”

    在这里插入图片描述

    输出该脚本文件名称、输入参数1和输入参数2 的值,参数3已经不再输出了

    1. ​ $# (功能描述:获取所有输入参数个数,常用于循环)

    编辑文件写入 echo $#

    获取输入参数的个数

    在这里插入图片描述

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

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

      两个都是打印输入的所有参数

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

    sxh@learn-basis:shell$ ./para.sh a b c 
    ./para.sh a b
    3
    a b c
    a b c
    sxh@learn-basis:shell$ echo $?
    0    //返回0表示正确
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    运算符

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

    (2)expr + , - , *, /, % 加,减,乘,除,取余

    注意:expr运算符间要有空格

    在这里插入图片描述

    `expr 3 + 2` 先运算加法   \*再运算乘法
    
    • 1

    条件判断

    1. 基本语法

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

    注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。

    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)

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

    在这里插入图片描述

    流程控制

    if 判断

    语法:

    if [ 条件判断式 ];then

    程序

    fi

    或者

    if [ 条件判断式 ]

    then

    ​ 程序

    fi

    ​ 注意事项:

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

    (2)if后要有空格

    demo:输入一个数字,如果是1,则输出I like drinking Coke,如果是2,则输出I like to drink Sprite,如果是其它,什么也不输出。

    #!/bin/bash
    
    if [ $1 -eq "1" ];then
        echo "I like drinking Coke"
    elif [ $1 -eq "2" ]
    then 
        echo "I like to drink Sprite"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

    case 语句

    语法:

    case $变量名 in

    “值1”)

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

    ​ ;;

    “值2”)

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

    ​ ;;

    …省略其他分支…

    *)

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

    ​ ;;

    esac

    注意事项:

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

    demo:输入一个数字,如果是1,则输出I like drinking Coke,如果是2,则输出I like to drink Sprite,如果是其它,输出nothing。

    #!/bin/bash
    
    case $1 in 
    1)
        echo "I like drinking Coke"
    ;;
    2)
        echo "I like to drink Sprite"
    ;;
    *)
        echo "nothing"
    ;;
    esac
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    for 循环

    基本语法1:

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

    do

    ​ 程序

    done

    demo:从1加到100

    #!/bin/bash
    
    S=0
    for((i=0;i<=100;i++))
    do
        S=$[$S+$i]
    done
    echo $S
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    基本语法2:

    for 变量 in 值1 值2 值3…

    do

    ​ 程序

    done

    demo:打印所有输入参数

    sxh@learn-basis:shell$ touch for2.sh
    sxh@learn-basis:shell$ vi for2.sh 
    #!/bin/bash
    
    for i in $*
    do
        echo "this is a char $i"
    done
    
    
    sxh@learn-basis:shell$ sh for2.sh a
    this is a char a
    sxh@learn-basis:shell$ sh for2.sh a b
    this is a char a
    this is a char b
    sxh@learn-basis:shell$ sh for2.sh a b c
    this is a char a
    this is a char b
    this is a char c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    比较 ∗ 和 *和 @区别

    (a) ∗ 和 *和 @都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 2 … 2 … 2n的形式输出所有参数。

    sxh@learn-basis:shell$ vi for2.sh 
    #!/bin/bash
    
    for i in $*
    do
        echo "this is a char $i"
    done
    
    for j in $@
    do 
        echo "this is a char $j"
    done 
    
    sxh@learn-basis:shell$ sh for2.sh a
    this is a char a
    this is a char a
    sxh@learn-basis:shell$ sh for2.sh a b
    this is a char a
    this is a char b
    this is a char a
    this is a char b
    sxh@learn-basis:shell$ sh for2.sh a b c
    this is a char a
    this is a char b
    this is a char c
    this is a char a
    this is a char b
    this is a char c
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    (b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 2 … 2 … 2n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “ 2 ” … ” 2”…” 2”n”的形式输出所有参数。

    #!/bin/bash
    
    for i in "$*"
    do
        echo "this is a char $i"
    done
    
    for j in "$@"
    do 
        echo "this is a char $j"
    done 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    while 循环

    基本语法:

    while [ 条件判断式 ]

    do

    ​ 程序

    done

    sxh@learn-basis:shell$ touch while.sh
    sxh@learn-basis:shell$ vi while.sh 
    sxh@learn-basis:shell$ cat while.sh 
    #!/bin/bash
    s=0
    i=1
    while [ $i -le 100 ]
    do
            s=$[$s+$i]
            i=$[$i+1]
    done
    echo $s
    sxh@learn-basis:shell$ sh while.sh 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    read读取控制台输入

    基本语法:

    ​ read(选项)(参数)

    ​ 选项:

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

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

    参数

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

    demo:提示5秒内,读取控制台输入的名称

    sxh@learn-basis:shell$ touch read.sh
    sxh@learn-basis:shell$ vi read.sh 
    sxh@learn-basis:shell$ cat read.sh 
    #!/bin/bash
    
    read -t 5 -p "Enter your name in 5 seconds" NAME
    
    echo $NAME
    
    sxh@learn-basis:shell$ sh read.sh 
    read.sh: 3: read: Illegal option -t
    
    sxh@learn-basis:shell$ bash read.sh 
    Enter your name in 5 secondsaaaa
    aaaa
    sxh@learn-basis:shell$ 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    对于出现的错误:

    unbuntu上运行对于 -s -t参数

    bash read.sh和 ./read.sh可以正确执行,对于sh read.sh不能正确执行,报错

    read.sh: 4: read: Illegal option -t

    对于参数选项 -n 也是一样的

    函数

    系统函数

    basename基本语法:

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

    选项:

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

    dirname基本语法:

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

    在这里插入图片描述

    自定义函数

    1.基本语法

    [ function ] funname[()]

    {

    ​ Action;

    ​ [return int;]

    }

    funname

    2.经验技巧

    ​ (1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

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

    demo:计算两个输入参数的和

    在这里插入图片描述

    Shell工具

    cut

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

    1.基本用法

    cut [选项参数] filename

    说明:默认分隔符是制表符

    2.选项参数说明

    选项参数功能
    -f列号,提取第几列
    -d分隔符,按照指定分隔符分割列
    sxh@learn-basis:shell$ touch cut.txt
    sxh@learn-basis:shell$ vi cut.txt 
    sxh@learn-basis:shell$ cat cut.txt 
    dong shen
    guan zhen
    wo  wo
    lai  lai
    le  le
    sxh@learn-basis:shell$ cut -d " " -f 1 cut.txt 
    dong
    guan
    wo
    lai
    le
    sxh@learn-basis:shell$ cut -d " " -f 2,3 cut.txt 
    shen
    zhen
     wo
     lai
     le
    sxh@learn-basis:shell$ cat cut.txt | grep "guan" | cut -d " " -f 1
    guan
    //这里是过滤文件找到guan那一行,然后对这一行进行cut
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    接下来看看cut系统变量
    在这里插入图片描述

    sed

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

    1. 基本用法

    sed [选项参数] ‘command’ filename

    1. 选项参数说明
    选项参数功能
    -e直接在指令列模式上进行sed的动作编辑。
    1. 命令功能描述
    命令功能描述
    a新增,a的后面可以接字串,在下一行出现
    d删除
    s查找并替换
    sxh@learn-basis:shell$ touch sed.txt
    sxh@learn-basis:shell$ vi sed.txt 
    sxh@learn-basis:shell$ cat sed.txt //数据准备
    dong shen
    guan zhen
    wo  wo
    lai  lai
    
    le  le
    sxh@learn-basis:shell$ sed '2a hi hao' sed.txt 
    dong shen			//将“hi hao”这个单词插入到sed.txt第二行下,打印。
    guan zhen
    hi hao
    wo  wo
    lai  lai
    
    le  le
    sxh@learn-basis:shell$ cat sed.txt  //文件不会有变化,只是输出有变化
    dong shen
    guan zhen
    wo  wo
    lai  lai
    
    le  le
    sxh@learn-basis:shell$ sed '/wo/d' sed.txt //删除sed.txt文件所有包含wo的行
    dong shen
    guan zhen
    lai  lai
    
    le  le
    sxh@learn-basis:shell$ sed 's/wo/ni/g' sed.txt   //将sed.txt文件中wo替换为ni
    dong shen
    guan zhen
    ni  ni
    lai  lai
    
    le  le
    sxh@learn-basis:shell$ sed -e '2d' -e 's/wo/ni/g' sed.txt 
    dong shen    //将sed.txt文件中的第二行删除并将wo替换为ni
    ni  ni
    lai  lai
    
    le  le
    sxh@learn-basis:shell$ 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    awk

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

    1. 基本用法

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

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

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

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

    sort

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

    1. ​ 基本语法

    sort(选项)(参数)

    选项说明
    -n依照数值的大小排序
    -r以相反的顺序来排序
    -t设置排序时所用的分隔字符
    -k指定需要排序的列
  • 相关阅读:
    Hexo安装配置
    HtmlJavaScript的 getElementBYId和querySelector速度性能对比测试 2210011540
    Monaco Editor教程(十四):monaco中的位置区间Range类型的详细解释
    自然语言处理 Paddle NLP - 预训练语言模型及应用
    【并发编程】ReentrantLock的lockInterruptibly()方法源码分析
    C++代码 让CPU使用率变成波形
    第三十六章 在 UNIX®、Linux 和 macOS 上使用 IRIS(一)
    Servlet学习笔记
    C++ Qt开发:PushButton按钮组件
    【Python 技能树共建】Beautiful Soup
  • 原文地址:https://blog.csdn.net/qq_44333320/article/details/126602266