• [Linux] shell脚本


    一、shell脚本基础

    1.1 shell脚本的作用

    shell将人类使用的高级语言翻译成二进制,再将二进制翻译成高级语言。换句话就是人类写了一个命令集合,然后用bash去翻译给硬件执行。

    linux中常见的shell:

            bash:基于gun的框架下发展的shell

            csh:类似c语言的shell

            tcsh:整合了csh提供了更多功能

            sh:已经被bash替换

            nologin:让用户无法登录

    shell的用途:

    1. 简化操作,提高工作效率

    2.避免重复劳动导致的出错

    3.实现标准化

    1.2 shell脚本是什么以及构成

    把命令集合在一起然后一一执行

    组成:

    1.声明解释器(#!/bin/bash)

    2.注释信息

    3.可执行命令

    1.3 脚本执行

    执行逻辑:

    脚本执行逻辑

    1. 顺序执行:程序按从上到下顺序执行

    2. 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行

    3. 循环执行:程序执行过程中需要重复执行多次某段语句

    执行方式:

    1.指定路径执行(需要执行权限)

    2.指定shell解释器执行(不需要权限)

    1.4脚本错误如何解决

    第一种:命令错误,不会影响接下来命令执行可用bash -n检查错误

    第二种:语法错误,直接影响脚本,无法正常运行可用bash -x执行检查

    第三种:逻辑错误,没有适合的的方法解决

    补充:set -e 放在脚本前面,一旦出错立即停止执行

               set -u 变量不存在不让执行

    二、重定向和管道符

    2.1 重定向

    重定向:改变电脑数据的输出方向,默认电脑数据的输出方向是屏幕

    类型设备文件文件描述编号默认设备
    标准输入/dev/stdin0键盘
    标准输出/dev/stdout1显示器
    错误输出/dev/stderr2显示器

    标准输出:你发了一条指令给电脑,电脑回复给你,结果一定会显示在屏幕上

    标准输入:我们通过键盘、鼠标等设备输入给电脑的指令

    错误输出:电脑没有给出正确答复

    类型操作符用途
    重定向输入<从指定的文件读取数据,而不是从键盘输入
    重定向输出1>将输出结果保存到指定的文件(覆盖原有内容)
    >>将输出结果追加到指定的文件尾部
    标准错误输出2>将错误信息保存到指定的文件(覆盖原有内容)
    2>>标准错误输出结果追加到指定的文件尾部
    混合输出&>无论对错都可以重定向将标准输出、标准错误的内容保存到同一个文件中

     正确输出

    错误输出 

     2.2 多行重定向

    1. #####将内容写入文件
    2. [root CXK /opt]#cat >test.txt <
    3. > 123
    4. > 345
    5. > 567
    6. > error

    2.3 管道符

    |

    作用:将第一个命令的结果当作后一个命令的处理对象

    三、变量

    含义:变量源于数学,是计算机语言中的一个抽象概念,可以存储计算结果或表示一个值。 变量可以通过变量名访问。在命令式语言中,变量通常是可变的。

    只能不能修改是常量   

    3.1 变量类型

    1.自定义变量:由用户自己定义修改和使用

    2.预定义变量:bash中内置的一类变量,不能修改规定

    3.环境变量:env看到所有环境标量

    4.只读变量只可以读取不能修改的变量,相当于常量,用处较少

    5.位置变量:通过命令行给脚本传递参数

    4.只读变量:只可以读取不可以更改 
    5.位置变量:通过命令行给脚本传递参数

    系统内置变量:PATH,UID,HOSTNAME,USER

    3.2 命名要求

    1. 区分大小写

    2. 不能使用内置变量

    3. 只能使用数字字母下划线,不能以数字开头,不支持“-”

    4. 大驼峰 StudentFirstName

    5. 小驼峰 studentFirstName

     

     

    1.赋值时使用双引号(" ")可以直接调用变量

    2.赋值时使用单引号(' ')变量$只会被认为是字符$ 不会调用变量

    3.赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果 和$( ) 用法相同

    4.{}可以分隔变量值

    单引号不识别 变量

    双引号可以识别变量

    {} 可以确定变量的范围

    `` $() 调用命令执行的结果

      变量追加值

    格式:

    title=cto

    title+=ylc

    变量名+=追加名

    1. 修改变量环境
    2. [root CXK /opt] PATH+=:/opt

    3.3 从键盘输入的内容变成变量(read -p)

    3.4 变量作用范围

     默认情况下,新定义的变量被称为局部变量,因为它们只在当前 shell 环境中有效。一旦进入子程序或新的 shell 环境,局部变量就不再起作用了。

    可以使用内部命令 export 将用户定义的变量变为全局变量,这样用户定义的变量就可以在所有子 shell 环境中继续使用。

    解决办法:格式1:export 变量名

                      格式2:export 变量名=变量值

    定义全局变量 

     3.5 整数运算

    expr只能进行整数的运算

    格式: expr 变量1 运算符 变量2 [运算符 变量3]

    运算符:

    加法 +

    减法 -

    乘法 \ *

    除法 /

    取余 (取模)%

    1. (1) let var=算术表达式
    2. let sum=2*3

    1. (2) $((var=算术表达式)) 和上面等价
    2. ((sum=1+9))
    3. echo $sum

    (3) var= $[算术表达式]

    (4) var=$(expr arg1 arg2 arg3 ...)

    (5) var= `expr arg1 arg2 arg3 ...`

    (6) echo '算术表达式' | bc

     3.6 环境变量

    env可以看到所有变量

    1. $USER 表示用户名称
    2. $HOME 表示用户的宿主目录
    3. $LANG 表示语言和字符集
    4. $PWD 表示当前所在工作目录
    5. $PATH 表示可执行用户程序的默认路径

    环境变量的全局配置文件:/etc/profile

    只用于单个用户:~/.bash_profile

    1. vim /etc/profile
    2. source /etc/profile
    3. //使用source立即生效

    3.7 位置变量

     位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示

    1. vim 1.sh
    2. bash 1.sh

    echo "$0"代表本身 

     

     3.8 预定义变量

            $*:表示所有位置参数的内容看成一个整体返回 返回所有

            $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有

            $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常

            $#:表示命令行中位置参数的总个数

            $0:表示当前执行的脚本或程序的名称 当前脚本的名字

            $$:当前bash的进程id

            $!: 后台任务最后一个id

    vim 1.sh

    vim 2.sh

     

    vim 3.sh

     

     

     总结:

    Shell 脚本描述规范:

    (1) 脚本声明:#!/bin/bash。

    (2) 注释信息:第一行以 # 号开头,定义了注释信息;注释行的内容不执行;

    (3) 执行语句:描述要执行的脚本代码;

    执行 Shell 脚本:

    (1) 使用绝对路径/相对路径指定要执行的脚本文件。 脚本在子外壳环境中执行;

    (2) 使用 bash/sh 程序指定要执行的脚本文件。 这不需要执行权限,脚本会在子壳环境中执行; (3) source/。 指定要运行的脚本文件,脚本将在当前 shell 环境中执行(影响当前目录、变量值等);

  • 相关阅读:
    ASP.NET CORE在docker中的健康检查(healthcheck)
    数据科学中的Python:NumPy和Pandas入门指南【第121篇—NumPy和Pandas】
    微信发送图片就卡死,发送文件就死机的解决方案
    第十二章 文件的上传和下载
    Springboot初步开发网站(不接数据库,简单增删改查实现)
    5 个冷门但非常实用的 Kubectl 使用技巧,99% 的人都不知道
    学习css动画-animation
    elasticsearch-head离线安装
    Web前端开发之HTML_3
    120、第一时间,处理线上问题,避免更多烦恼
  • 原文地址:https://blog.csdn.net/Cnm_147258/article/details/134509572