首页 > 系统相关 >Shell脚本

Shell脚本

时间:2022-11-01 18:33:06浏览次数:42  
标签:脚本 输出 shell 变量 用户 Shell 执行

导图

1.程序编程风格

面向过程语言

  • 做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如果出现了情况B,做什么处理

  • 问题规模小,可以步骤化,按部就班处理

  • 以指令为中心,数据服务于指令

  • C,shell

面向对象语言

  • 将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能。

  • 一种认识世界、分析世界的方法论。将万事万物抽象为各种对象

  • 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合

  • 对象是类的具象,是一个实体

  • 问题规模大,复杂系统

  • 以数据为中心,指令服务于数据

  • java,python,golang等

2.shell脚本

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。

查看当前系统支持的shell

linux中常见的shell:

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

  • csh:类似c语言的shell

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

  • sh:已经被bash替换

  • nologin:让用户无法登录

bash (/bin/bash)是目前大多数Linux 版本采用的默认shell

2.1 shell脚本规范

脚本构成:

  • #!,脚本声明
  • #,注释行
  • 可执行语句

2.2 shell执行脚本的方式

脚本执行逻辑

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

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

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

2.2.1 方式一:指定路径去执行文件(需要有执行权限)

相对路径执行脚本:

 

 

 绝对路径执行脚本:

 

2.2.2 方式二:指定解释器去执行(不需要权限)

2.2.3 方式三:source  脚本(会影响当前终端)

source执行脚本会在当前环境运行

指定路径或指定解释器取执行脚本会在子终端执行,不影响当前环境

2.3 shell脚本错误调试

2.3.1 语法错误:会影响接下来的命令继续,使用bash -n检查

2.3.2 命令错误:不会影响接下来的命令继续,不能使用bash -n检查,可以使用bash -x进行观察

2.3.3 逻辑错误:只能使用 bash -x 进行观察

3.重定向和管道符

3.1 重定向概念

由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。

将管道符号“|”左侧的命令输出的结果,作为右侧命令的输入(处理对象),同行命令中可以使用多个管道。

重定向:不通过标准输出到屏幕上,输出到你指定的位置

3.2交互式硬件设备

标准输入:从该设备接收用户输入的数据

标准输出:通过该设备向用户输出数据

标准错误:通过该设备报告执行出错信息

类型设备文件文件描述编号默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器

 

3.3重定向操作

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

3.1.1多行重定向

命令支持

3.2 管道符

管道符 | :将左侧的输出结果,作为为右侧命令的输入(处理对象)可以叠加使用

 

 

 

4.变量

变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。

保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。

4.1变量的作用

用来存放系统和用户需要使用的特定参数(值)

  • 变量名:使用固定的名称,由系统预设或用户定义

  • 变量值:能够根据用户设置、系统环境的变化而变化

4.2变量的类型

  • 自定义变量:由用户自己定义、修改和使用

  • 特殊变量:环境变量,只读变量,位置变量,预定义变量

自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改 

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

4.3变量符号

{ }  定义变量的范围,确定一个变量的长度

' '   单引号不识别变量,当做普通符号

" "  双引号能识别变量,并保留一定格式

· ·  调用命令执行结果(tab键上面)

 

4.4变量的作用范围 

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用

方法:

  1. 格式1:export 变量名

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

4.5变量的命名规则

  • 区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=

  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

4.6运算

4.6.1运算符号

 

运算 预算符
加法 +
减法 -
乘法 \*
除法  /
取余 (取模) %

 

4.6.2整数运算

expr只能进行整数的运算

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

 

 

 

 

4.7 read -p

从键盘输入的内容变成变量

4.8环境变量

环境变量:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量

  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程

  • 一般只在系统配置文件中使用,在脚本中较少使用

4.8.1由系统提前创建,用来设置用户的工作环境

4.8.2可以使用env查看环境变量

 

 

 4.8.3.常用环境变量

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

$PWD 表示当前所在工作目录

$PATH 表示可执行用户程序的默认路径

 

 

 

4.8.4环境变量的全局配置文件

位置:/etc/profile

如果修改此文件会作用于所有用户

 

~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户

可以用来长期变更或设置环境变量

 

4.9只读变量

readonly命令用于定义只读shell变量和shell函数。

readonly命令的选项

-p 可以输出显示系统中所有定义的只读变量

格式:

readonly 【选项】【参数】
name=xkq
readonly name        #设置为只读变量
echo $name name=wy #只读变量不可以被重新赋值 unset name #只读变量不可以被删除,unset命令用于删除变量

 

 

4.10位置变量

  • 当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
  • $n: n为数字,$0代表命令本身,$1- $9代表带一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为${10}

4.11预定义变量

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

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

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

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

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

  • $$:当前进程id

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

 

标签:脚本,输出,shell,变量,用户,Shell,执行
From: https://www.cnblogs.com/suoluo212/p/16805574.html

相关文章

  • 【域渗透】登录脚本下发
    0x1、利用场景当获取到域控权限或domainadmin等高权限时,想横向到域内PC主机上对方开启了防火墙,无法通过445、135进行横向利用,可以通过登录脚本绑定的方式获取目标主机权......
  • 监控进程脚本(达梦)
    2行为项目名称12行为应用启动命令1#!/bin/bash2name=dmserver3echo------------------------4echo"ps-ef|grepdmserver|grep-v"grep"|wc-l"......
  • shell中的文本处理命令和正则表达式
    一、文本处理命令1.1、sort命令 使用格式:sort [选项] 参数常见选项:选项作用-f忽略大小写,将小写字母转换成大写字母来比较-b忽略每行前面的空格-n......
  • 最新实用油猴脚本推荐
    Tampermonkey,中文名油猴,应该不用我们多做介绍了。如果一个浏览器没有安装油猴,那可以说是没有灵魂的。油猴脚本与扩展的功能大致相同,都是赋予浏览器更多实用功能,但相比之下更......
  • groovy 脚本实例 创建和升级脚本
    groovy脚本实例创建和升级脚本packageplatform.jfrog_artifact.snapshot.mysql.empty2_docker_dbnode('ecs_wuhan_docker'){println"${BUILD_URL}console"......
  • 使用shell进行简单分析增量更新时间的方法
    使用shell进行简单分析增量更新时间的方法思路产品里面更新增量时耗时较久,想着能够简单分析下哪些补丁更新时间久哪些相同前缀的补丁更新的时间累积较久.本来想通......
  • shell免交互与交互
    一,HereDocument免交互1.概述使用I/O重定向的方式将命令列表提供给交互式程序或命令,如cat,read或ftp命令;是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来......
  • PowerShell 获取虎扑步行街热榜json数据
    代码(curl"https://bbs.hupu.com/all-gambia").ParsedHtml.getElementsByClassName('t-info')|%{$texts=$_.getElementsByTagName('span')@{url=......
  • crontab执行shell脚本
     #!/bin/bashsource/etc/profile#需要导入环境变量,否则非原生命令执行不成功Sendmail(){smtp='mail.yx.com'account='[email protected]'password='123'to='[email protected]'subject=$......
  • shell数组
    一,数组方法一数组名=(value0value1value2…)array1=(1020304050)方法二数组名=([0]=value[1]=value[2]=value…)array2=([0]=10[1]=20[2]=30[3]=40[......