• Shell入门


    Shell概述

    在这里插入图片描述
    linux系统常见的命令行解释器有许多,常用的是sh和bash,其实sh是bash的一个软链接,还是调用的bash。
    在这里插入图片描述

    Shell脚本入门

    脚本以#!/bin/bash开头,指定命令行解释器为bash。

    输出hello world

    创建一个helloworld.sh,内容如下:

    #!/bin/bash
    echo 'hello world'
    
    • 1
    • 2

    执行脚本

    bash helloworld.sh
    
    • 1

    Shell中的变量

    系统变量

    常用的系统变量:

    $HOME: 当前系统用户目录
    $PWD: 当前工作目录的绝对路径
    $SHELL: 当前使用的Shell解释器
    $USER: 当前用户名
    
    • 1
    • 2
    • 3
    • 4
    自定义变量
    NAME=John # 变量定义:变量=值, 注意等号前后不能有空格
    echo $NAME # 输出变量值
    unset NAME # 撤销变量
    
    • 1
    • 2
    • 3
    变量定义规则
    • 变量名可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
    • 等号两侧不能有空格
    • 在bash中,变量默认类型都是字符串类型,无法进行数值运算
    • 变量的值如果有空格,需要使用双引号或者单引号括起来
    • 使用可将局部变量提升为全局变量,供其他Shell程序使用。
    特殊变量
    $n: n为数字,$0为脚本名,$1为脚本第一个参数,$2为脚本第二个参数...,第10及以上个参数访问需加大括号${10}
    $#: 获得脚本参数的个数,常用于循环
    $*: 获取所有参数,将所有参数看成一个整体 ??
    $@: 获取所有参数,将参数区分开来
    $?: 返回最后一次执行的命令的状态,如果为0表示上条命令执行成功
    
    • 1
    • 2
    • 3
    • 4
    • 5

    运算符

    $((运算式)) 或 $[运算式]
    expr +,-,*,/,% 加减乘除取余
    expr运算符间要有空格

    s=$[(2+3)*4]
    echo $s # 输出20
    
    expr 2 + 3 # 此种形式运算符前后必须要有空格
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    条件判断

    语法
    [ condition ]:condition前后要有空格,condition非空即返回true,[]返回false
    
    • 1
    常用的判断条件

    两个整数之间比较
    符号 描述
    -lt (less than)小于
    -le (less equal) 小于等于
    -eq (equal)等于
    -gt (greater than) 大于
    -ge (greater equal) 大于等于
    -ne (not equal) 不等于

    文件权限判断
    -r 有读的权限
    -w 有写的权限
    -x 有执行的权限
    文件类型判断
    -f 文件存在并且是一个常规文件
    -e 文件存在
    -d 文件存在并是一个目录

    判断23是否大于2

    [linux@localhost datas]$ [ 23 -gt 2 ]
    [linux@localhost datas]$ echo $?
    0

    判断helloworld.sh是否有写入权限

    [linux@localhost datas]$ [ -w helloworld.sh ]
    [linux@localhost datas]$ echo $?
    1

    判断目录中文件是否存在

    [linux@localhost datas]$ [ -e /home/linux/datas ]
    [linux@localhost datas]$ echo $?
    0

    多条件判断

    [ condition1 ] && [ condition2 ]: condition1执行成功才执行condition2
    [ condition1 ] || [ condition2 ]: condition1执行失败才执行condition2

    流程控制

    基本语法
    if [ 条件判断式1 ];then
    	程序
    elif [ 条件判断式2 ];then
    	程序
    fiif [ 条件判断式1 ]
    	then
    		程序
    elif [ 条件判断式2 ]
    	then
    		程序
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注:

    • if后要有空格
    case语句
    case $变量名 in
    "值1") # 实际代码中不要加“”,shell中变量类型默认是字符串
    	程序1
    ;;
    "值2")
    	程序2
    ;;
    *)
    	其它
    ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    for循环
    for((初始值; 循环控制条件; 变量变化))
    do
    	程序
    donefor 变量名 in 参数1 参数2 参数3
    do
    	程序
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    举例
    #求和
    s=0
    for((i=0; i<=100; i++))
    do
    	s=$[$s+$i]
    done
    echo $s
    
    #打印所有的输入参数
    for i in $*
    do
    	echo $i
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    while循环
    while [ condition ]
    do
    	程序
    done
    
    • 1
    • 2
    • 3
    • 4

    注:

    • while后要有空格
    read读取控制台输入
    语法
    read(选项)(参数)
    选项:
    -p: 指定读取值时的提示符
    -t: 指定读取值时的等待时间
    参数:
    变量: 指定读取值时的变量名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    举例
    # 提示7s内读取控制台输入的名称
    read -p "input your name" -t 7 NAME
    echo $NAME
    
    • 1
    • 2
    • 3

    函数

    系统函数
    basename

    basename [文件路径/文件名] [后缀]
    提取文件名,如果指定后缀,会将文件名的后缀去掉

    basename /home/gh/test.txt .txt # 返回test
    basename /home/gh/test.txt # 返回test.txt
    
    • 1
    • 2
    dirname

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

    dirname /hone/gh/test.txt # 返回/home/gh
    
    • 1
    自定义函数
    function sum()
    {
    	s=0
    	s=$[$1+$2] # $1表示函数sum接收的第一个参数
    	echo $s
    }
    read -p "请输入第一个参数:" P1
    read -p "请输入第二个参数:" P2
    sum $P1 $P2 # 由于shell脚本是逐行运行,函数必须先定义再调用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Shell 工具

    cut

    cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出
    cut [选项参数] filename

    -f 列号,提取第几列
    -d 分隔符,按照指定分隔符分隔列

    举例
    [linux@localhost datas]$ cat cut.txt
    dong shen
    guan zhen
    wo wo
    lai lai
    le le
    [linux@localhost datas]$ cut -d " " -f 1 cut.txt
    dong
    guan
    wo
    lai
    le
    
    # 获取第三行第一个单词
    [linux@localhost datas]$ cat cut.txt | grep guan | cut -d " " -f 1
    guan
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    sed

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

    基本用法

    sed [选项参数] ‘command’ filename
    选项参数说明:

    • -e: 直接在指令列模式上进行sed的动作编辑,一般sed后面跟多条命令的时候需要在每条命令前加-e,如果只有一条命令则可以省略。
    • -i: 直接编辑原始文件

    命令功能描述
    a 新增
    d 删除
    s 查找并替换

    举例
    # 将test插入test.txt的第二行
    sed -i "2a test" test.txt
    
    # 删除test.txt中所有包含wo的行
    sed "/wo/d" test.txt # 增加在前删除在后
    
    # 将test.txt文件中的wo替换成ni
    sed "s/wo/ni/g" # g表示全局替换,如果不加g则只替换第一个
    
    # 将test.txt文件中的第二行删除并将wo替换成ni
    sed -e "2d" -e "s/wo/ni/g" test.txt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    awk

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

    基本用法

    awk [选项参数] ‘pattern1 {action1} pattern2{action2}…’ filename
    选项参数:
    -F 指定输入文件分隔符
    -v 赋值一个用户定义变量

    shell中的括号

    (1)${a} 变量a的值, 在不引起歧义的情况下可以省略大括号。
    (2)$(cmd) 命令替换,和`cmd`效果相同,结果为shell命令cmd的输,过某些Shell版本不支持$()形式的命令替换, 如tcsh。
    (3)$((expression))`exprexpression`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算。
    
    • 1
    • 2
    • 3
  • 相关阅读:
    OPENCV图像和视频处理
    unity3d客户端框架 基于类对象池的可回收变量 代码实现
    ISIS双栈原理
    ElasticSearch8.4.3 Springboot 复杂查询
    JS 这次真的可以禁止常量修改了!
    iOS创建苹果证书、制作p12证书流程
    ios逆向,tweak简洁使用教程
    dreamweaver作业静态HTML网页设计模板——迪士尼影视电影(6页)带音乐
    .NET Core WebAPI中使用Swagger(完整教程)
    本地demo服务器搭建计划——(二)服务中心consul安装&防火墙配置
  • 原文地址:https://blog.csdn.net/g1027785756/article/details/127661101