Shell脚本的基础和变量

1.shell脚本基础

1.1 shell的作用

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当

了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执

行的操作传递给内核执行,并输出执行结果。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符

等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。

查看本机的shell信息

查看当前的系统支持的shell

1.2linux中常见的shell

  • bash:基于gun的框架下发展的shell
  • csh:类似c语言的shell
  • tcsh:整合了csh提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

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

1.3shell脚本的本质

shell脚本的本质:命令的集合,命令的本质是程序,那么shell脚本的本质是程序;人类写了一个命令的集合,用bash这个软件,将命令交给硬件去执行;

shell脚本的特点:虽然linux一切皆文件,但是习惯还是将脚本以".sh"结尾,vim编辑器会给脚本中的命令

1.4shell脚本用途

  • 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
  • 减少手工命令的重复输入,一定程度上避免人为错误
  • 将软件或应用的安装及配置实现标准化
  • 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等

1.5脚本执行逻辑及执行方式

1.51脚本执行逻辑

  • 顺序执行:程序按从上到下顺序执行
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
  • 循环执行:程序执行过程中需要重复执行多次某段语句

1.5.2脚本执行方式

使用指定的shell解释器:(不需要脚本有执行权限)

会重新加载一个子bash环境去执行,不会影响当前bash环境变量值,常使用。

  • 使用路径执行,需要权限

绝对路径。如:/data/test.sh

相对路径。如:./test.sh

③使用 “source 脚本名” 或 “ . 脚本名”执行脚本,不需要权限

①和②执行方式不会影响当前环境中bash设置,会开启一个全新的bash环境执行脚本

③不推荐使用,不会启动子shell环境,会影响当前bash环境中的配置

1.6脚本错误调试

1.命令错误

命令出错不会影响接下来的命令继续

hostname

echo 'finsh'

​2.语法错误

会影响接下来的命令继续

echo "hello world"

hstname

​cat > /data/kgc.tx <<EOF

123

123

EOF

echo "ni hao"

 3.逻辑错误

只能自己去筛查

查代码的正确

bash-n 脚本名称 (不在当前目录下加绝对路径)    

检查语法错误

bash-x脚本名称 (不在当前目录下加绝对路径)     逻辑错误

#将脚本的所有语句执行一遍,

总结:脚本错误常见的有三种区别

  • 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
  • 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
  • 逻辑错误:只能使用 bash -x 进行

命令错误调试:

在脚本的前面输入 `set -e` ,一旦出错立即停止 

bash -n 脚本名称     //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。 

bash -x 脚本名称     //显示每个命令的执行过程,方便发现逻辑错误

 

1.7重定向与管道符

1.71重定向

类型

设备文件

文件描述编号

默认设备

标准输入

/dev/stdin

0

键盘

标准输出

/dev/stdout

1

显示器

标准错误输出

/dev/stderr

2

显示器

交互式硬件设备

  • 标准输入:从该设备接收用户输入的数据(echo “123” |passwd  --stdin xueyin
  • 标准输出:通过该设备向用户输出数据    ls  /opt
  • 标准错误:通过该设备报告执行出错信息 (ls xxxxxx)

重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)

类型

操作符

用途

重定向输入

<

从指定的文件读取数据,而不是从键盘输入

重定向输出

1>

将输出结果保存到指定的文件(覆盖原有内容)

 

>>

将输出结果追加到指定的文件尾部

标准错误输出

2>

将错误信息保存到指定的文件(覆盖原有内容)

2>>

标准错误输出结果追加到指定的文件尾部

混合输出

&>无论对错都可以重定向

将标准输出、标准错误的内容保存到同一个文件中

重定向输入

重定向输出覆盖和追加

第一种,/dev/pts改变输出的终端显示器

第二种:>覆盖

第三种:>>追加

1.72管道符

管道符       |  

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

格式:cmd1 | cmd2

2.变量

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

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

变量基础以及常见的shell变量的类型

变量有5种类型:①自定义变量(自己定义的)、②环境变量(这是系统维护的,如PATH等)、③只读变量、④位置变量、⑤预定义变量

关于自定义变量的命名要求:需要区分大小写、不能使用程序中的保留变量名称,只能使用数字、字母、下划线,且不能以数字开头,注意不支持短横线“-”

命名要求

区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname   命令  a=  
  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反   
  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH             
  • 大驼峰 StudentFirstName
  • 小驼峰 studentFirstName
  • 下划线 student_name

name='value'

变量名=变量值

直接字串:name='root'

变量引用:name="$USER"

命令引用:name=`COMMAND` 或者 name=$(COMMAND)

注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除

特殊符号

大括号{ }

{ }确定的变量起始结束的范围 ,只要有变量就加

" "弱引用可以识别变量

' '强引用不识别 变量

` `反撇 调用命令的执行结果 效果与 $()相同

整数运算

expr只能进行整数的运算

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

运算符:

加法 +

减法 -

乘法 \ *

除法 /

取余 (取模)%

let var=算术表达式

((var=算术表达式)) 和上面等价

变量1=`expr 变量2  运算符  变量3`(注意空格

使用反撇号调用expr的运算结果,给变量赋值

变量1=$(expr 变量2  运算符  变量3)(注意空格)

使用$()调用expr的运算结果,给变量赋值

环境变量

常用的环境变量,这些都是由系统定义的

$USER 表示用户名称

$HOME 表示用户的宿主目录

$LANG 表示语言和字符集

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

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

环境变量:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
  • 一般只在系统配置文件中使用,在脚本中较少使用

每开一个窗口就会新加载一个bash,在当前bash下输入bash,就会生成一个子bash,关于环境变量,子bash不会继承父bash的变量值,除非父bash加上export进行变量申明

环境变量的全局配置文件

配置文件位置在

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

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

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

[root@host1:~# ]vim  /etc/profile

.....................省略到行末添加

export PATH=$PATH:/root

[root@host1:~# ]source  /etc/profile

source立即生效或 .

预定义变量

bash   帮你定义好了  拿来用就可以了,你不需要知道为什么,记住

  • $*:表示所有位置参数的内容看成一个整体返回      返回所有         
  • $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回   返回所有 
  • $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
  • $#:表示命令行中位置参数的总个数
  • $0:表示当前执行的脚本或程序的名称     当前脚本的名字
  • $$:当前bash的进程id   
  • $!:  后台
  • 任务最后一个id

$? 返回上一次的执行结算,0是正确,非0是错误

$$ 输出当前bash的pid

$0 表示脚本的名称

$# 表示位置参数的总个数

位置变量

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

只读变量

变量值不允许修改(重新赋值)的情况

无法使用 unset删除

最快方法重启

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/696219.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人脸识别技术在访客管理中的应用

访客办理体系&#xff0c;能够使用于政府、戎行、企业、医院、写字楼等众多场所。在办理时&#xff0c;需求对来访人员身份进行精确认证&#xff0c;才能保证来访人员的进入对被访单位不被外来风险入侵。在核实身份时&#xff0c;比较好的方法就是选用人脸辨认技能&#xff0c;…

高性能计算基础

高性能计算基础 CUDA的线程组织结构 CUDA的存储体系结构&#xff0c;每一种存储的优缺点&#xff0c;该如何合理使用。GPU每一代的新特性有了解过吗&#xff1f;应该从哪里去了解详细信息&#xff1f;CUDA stream的概念&#xff0c;为什么要使用多个stream&#xff1f;GPU和…

【原理代码详解】DeepSORT算法:多目标跟踪的深度学习解决方案

一、引言 在视频监控和智能交通系统中&#xff0c;多目标跟踪是一项关键技术&#xff0c;它涉及检测视频中的多个目标&#xff0c;并在视频帧之间维持每个目标的身份。DeepSORT算法作为SORT算法的扩展&#xff0c;通过结合深度学习和传统的跟踪技术&#xff0c;提高了目标跟踪…

用户需求甄别和筛选的6大标准

产品经理日常经常接收到大量的需求&#xff0c;并不是所有的需求都需要开发&#xff0c;需要进行甄别和筛选&#xff0c;这样有利于确保项目的成功、优化资源利用以及提高产品质量。 那么针对这些用户需求进行甄别或筛选的评判标准是什么&#xff1f;需求筛选可以说是初步的需求…

C语言/数据结构——每日一题(环形链表)

一.前言 今天在力扣上刷到一道链表题——环形链表https://leetcode.cn/problems/linked-list-cycle 想着和大家们分享一下。让我们直接开始今天的分享吧。、 二.正文 1.1题目描述 1.2题目分析 这道题是想让我们做出分析&#xff0c;该链表是不是带环链表&#xff0c;如果是…

计算机网络 3.3OSI参考模型

第三节 OSI参考模型 一、认识OSI/RM 1.描述&#xff1a;定义了一个连接异种计算机的标准主体结构&#xff0c;给网络设计者提供了一个参考规范。 2.组织&#xff1a;国际标准化组织. 3.发展&#xff1a;1979年研究并提出了该国际标准。 4.分层原则&#xff1a; ①层次的划…

基于SSM SpringBoot vue学校办公自动化系统

基于SSM SpringBoot vue学校办公自动化系统 系统功能 登录注册 个人中心 用户信息管理 部门信息管理 公共通知管理 个人邮箱管理 日常安排管理 管理员管理 签到记录管理 会议管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或Spr…

资料如何打印更省钱

在日常工作和学习中&#xff0c;我们经常需要打印各种资料。然而&#xff0c;随着打印成本的不断提高&#xff0c;如何更省钱地打印资料成为了大家关注的焦点。今天&#xff0c;就为大家分享一些资料打印的省钱技巧&#xff0c;并推荐一个省钱又省心的打印平台。 首先&#xff…

(动画详解)LeetCode232.用栈实现队列

&#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到动画详解LeetCode算法系列 用通俗易懂的动画让算法题不再神秘 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成…

windows安装DrawDB

下载 新建一个目录drawdb,使用git下载&#xff0c;如果没有安装git的话&#xff0c;进入git官网进行下载windows版本 https://git-scm.com/downloads。 空白地方鼠标右键&#xff0c;打开git终端 执行命令&#xff1a; git clone https://github.com/drawdb-io/drawdb 安装依…

苹果cms:开启高速缓存加快访问速度

由于苹果cms采集的影片数据过多,如果不设置缓存,可能会造成网站访问缓慢,或者CPU消耗过高。随着用户访问量的上升&#xff0c;添加缓存设置是有这个必要的。目前cms提供了四种缓存方式 1&#xff09;file&#xff1a;以文件形式&#xff0c;通俗说直接访问Mysql&#xff0c;要达…

【Arduino】数字I/O的使用

目录 1、引脚工作模式 2、写入引脚digitaWrite&#xff08;&#xff09; 3、读取引脚digitalRead(pin); 4、示例 跑马灯 1、引脚工作模式 Arduino通过pinMode()设置引脚的io工作模式&#xff0c;一共有4种模式 工作模式 Mode 说明 输出模式 OUTPUT 引脚为低阻抗状态&…