shell脚本1----编程规范与变量

news/2024/9/16 4:57:50/ 标签: linux, 运维, 服务器, 云计算, 学习

shell脚本

shell的功能

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

shell的种类

查看/etc/shells这个文件,里面就是当前Linux所包含的Shell。

[root@sunny1 gw]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

最常用的shell有:bash、tcsh、csh、sh、nologin等。

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

当用户登录的时候,系统就会给用户一个shell让用户使用,而这个登录获得的Shell的类型就记录在/etc/passwd这个文件内。

[root@sunny1 gw]# tail -5f /etc/passwd
tcpdump:x:72:72::/:/sbin/nologin
sl01:x:1000:1000:sl01:/home/sl01:/bin/bash
sl02:x:1001:1001::/home/sl02:/bin/bash
sl03:x:1002:1002::/home/sl03:/bin/bash
sl04:x:1003:1003::/home/sl04:/bin/bash

shell脚本的作用

shell脚本可以实现自动化运维,减轻管理员工作量,提高处理文本文件的速度,避免配置出错。用shell可以编写脚本结合计划任务自动周期运行,避免重复操作,。

shell脚本的构成

脚本通常由脚本申明和可执行语句组成,也可添加注释语句。

第一行为脚本申明。

若第一行为“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。

#!:申明此脚本使用哪个解释器环境/解释器类型。

/bin/bash:解释器类型。

以“#”开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执。

shell脚本的执行

方法一:指定路径的命令(被执行文件必须有 x 权限,没有x 权限可使用chmod +x为文件添加x 权限)

指定绝对路径

[root@sunny1 /]# ./opt/99.sh
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

指定相对路径

[root@sunny1 opt]# ./99.sh
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

方法二:指定Shell来解释脚本,不要求文件必须有 x 权限。

sh 脚本路径:sh 文件名

[root@sunny1 opt]# sh sum.sh
5050

source 脚本路径:. 文件名 或者 source 文件名

[root@sunny1 opt]# source sum.sh
5050
[root@sunny1 opt]# sum=0
[root@sunny1 opt]# . sum.sh
5050

source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令。

source命令通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。因为linux所有的操作都会变成文件的格式存在。

不同命令执行脚本的区别

文件有执行权限是 sh 文件名 和 ./路径 是没有区别的。

他们是重新建立一个子shell,在子shell中执行脚本里面的语句。

该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell。

除非使用export。

[root@sunny1 opt]# cat sum.sh
#!/bin/bashfor ((i=1;i<=100;i++))
do
let sum=i+sum
done
echo "$sum"
[root@sunny1 opt]# sum=0
[root@sunny1 opt]# echo $sum
0
[root@sunny1 opt]# sh sum.sh
5050
[root@sunny1 opt]# echo $sum
0

source命令会在当前shell执行脚本,改变当前shell的环境。

[root@sunny1 opt]# source sum.sh
5050
[root@sunny1 opt]# echo $sum
5050
[root@sunny1 opt]# su
[root@sunny1 opt]# echo $sum[root@sunny1 opt]#

shell脚本检查

bash

bash -n 脚本名称 (不在当前目录下加绝对路径)检查语法错误

[root@sunny1 opt]# bash -n js.sh
[root@sunny1 opt]# bash -n zj_ping.sh
[root@sunny1 opt]# vi zj_ping.sh
[root@sunny1 opt]# bash -n zj_ping.sh
zj_ping.sh:行9: 未预期的符号 `done' 附近有语法错误
zj_ping.sh:行9: `done'
[root@sunny1 opt]# cat zj_ping.sh
#!/bin/bash
for ((i=1;i>=0;i++))
do
ping -w 2 -c 2 $$i &> /dev/nullif [ $? -eq 0 ]thenecho "$$i" >> ip.txt
#  fi
done

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

[root@sunny1 opt]# bash -x zj_ping.sh
+ (( i=1 ))
+ (( i>=0 ))
+ ping -w 2 -c 2 192.168.110.2
+ '[' 0 -eq 0 ']'
+ echo 10208i
+ break

变量

变量是用来存储数据或字符串的占位符。

变量的作用:用来存放系统和用户需要使用的特定参数(值)。使用变量可以避免在脚本中重复输入相同的值或字符串,提高了代码的复用性和效率。

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

设置变量名的注意事项:

1、不要使用系统的命令作为变量名
2、不要使用中文
3、不能特殊符号开头 可以用_来开头
4、在指定变量名的时候有一个默认的规则:计算机:computer 学生:student a= b=
5、要有注释,还要注意前后一致
6、只能包含字母、数字、下划线
7、严格区分大小写

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

整数变量的运算

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

常用运算符:+ 加法、- 减法、\* 乘法、/ 除法、% 取余

举例:

i=$(expr 12 \* 5)

root@sl02 ~]# i=$(expr 12 \* 5)
[root@sl02 ~]# echo $i
60

i=$((12*5))

[root@sl02 ~]# i=$((12*5))
[root@sl02 ~]# echo $i
60

let i=12*5

[root@sl02 ~]# let i=12*5
[root@sl02 ~]# echo $i
60

bc是一个简单易用的计算器程序,可以用于执行基本的数学运算,如加、减、乘、除和取余等操作。

在Shell编程中,可以使用bc命令将数学表达式的计算结果输出到标准输出或保存到文件中,以满足不同的需求。

[root@sl02 ~]# echo 4*7|bc
28

非整数运算也运用到bc。

[root@sl02 ~]# i=$(echo "4.2+5.5"|bc)
[root@sl02 ~]# echo $i
9.7

环境变量

环境变量由系统提前创建,用来设置用户的工作环境,使用 env 命令可以查看到当前工作环境下的环境变量。

变量USER表示用户名称,HOME表示用户的宿主目录,LANG表示语言和字符集,PWD表示当前所在的工作目录,变量PATH表示可执行程序的默认搜索路径。

[root@sl02 ~]# echo $USER
root
[root@sl02 ~]# echo $HOME
/root
[root@sl02 ~]# echo $LANG
zh_CN.UTF-8
[root@sl02 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@sl02 ~]# echo $PWD
/root

环境变量的类型

系统级环境变量: 这些变量对整个操作系统及其所有用户都是可见的。例如,PATH变量存储了操作系统查找可执行文件的路径列表。

用户级环境变量: 这些变量只对当前用户可见。每个用户可以定义自己的环境变量,用于满足个人需求。例如,HOME变量指定了当前用户的主目录路径。

预定义环境变量: 操作系统或应用程序预先定义了一些常用的环境变量,用于提供特定的信息和功能。例如,USER变量保存当前用户名,LANG变量指定了当前系统的默认语言。

自定义环境变量: 用户和应用程序可以定义自己的环境变量,用于存储特定的信息或配置。

位置变量,有名命令行参数,是在运行脚本或程序时传递给它们的值。

当执行命令行操作时,第一个字段表示命令名或脚本程序名,为$0;其余的字符串参数按照从左到右的顺序依次赋值给位置变量。($1,$2,$3...)

[root@sl02 ~]# ./test1.sh 1 2 3
1 2 3
3
1 2 3
1 2 3
[root@sl02 ~]# $?
bash: 0: 未找到命令...
[root@sl02 ~]# cat test1.sh
#!/bin/bash
echo "$1 $2 $3 "
echo "$#"
echo "$*"
echo "$@"

$*、$@都表示命令或脚本要处理的参数。但$*把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 "。而$@把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表"$1" "$2" "$3"。

$#:表示命令或脚本要处理的参数的个数。

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

双引号 (" ")与单引号 (' ')

双引号 (" "):Shell脚本或命令行中,双引号用于定义字符串。当字符串被双引号包围时,其中的大多数特殊字符(如$, `, \, 和")会被特殊处理,而其他字符则按其原义处理。

单引号 (' '):与双引号类似,单引号也用于定义字符串。但是,被单引号包围的字符串中的所有字符都会按其原义处理,不会发生任何扩展或替换。

[root@sl02 ~]# ./test1.sh 1 2 3
1 2 3
$1 $2 $3
[root@sl02 ~]# cat test1.sh
#!/bin/bash
echo "$1 $2 $3 "
echo '$1 $2 $3'


http://www.ppmy.cn/news/1521848.html

相关文章

1台图形工作站如何给10人共享使用

在当今的创意设计与数字内容生产领域&#xff0c;图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能&#xff0c;成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 对于中小企业或初创团队而言&#xff0c;高昂的硬件成本往往成为限制其发展的…

四、材料与制造工艺 笔记

目录 四、材料与制造工艺 4.1 常见聚合物类材料&#xff08;塑料&#xff09; 4.1.1 聚丙烯塑料发泡材料&#xff08;EPP&#xff09; 4.1.2 尼龙 &#xff08;1&#xff09;PA66 4.1.3光固化树脂 4.1.4 KT板 4.1.5 术板 4.1.6 EDA 3D打印 &#xff08;1&#xf…

[MOCO v3] An Empirical Study of Training Self-Supervised Vision Transformers

1、目的 探索基于contrastive/Siamese范式&#xff08;而非masked auto-encoding范式&#xff09;和ViT结构&#xff08;而非卷积网络&#xff09;的自监督学习 2、方法 MoCo v3 ​​​​​​​ 1&#xff09;random data augmentation 2&#xff09;query encoder &a…

【原创】java+springboot+mysql企业产品销售管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

使用Python本地搭建http.server文件共享服务并实现公网环境远程访问——“cpolar内网穿透”

前言 本文主要介绍如何在Windows系统电脑上使用python这样的简单程序语言&#xff0c;在自己的电脑上搭建一个共享文件服务器&#xff0c;并通过cpolar创建的公网地址&#xff0c;打造一个可以随时随地远程访问的私人云盘。 数据共享作为和连接作为互联网的基础应用&#xff…

Linux下Docker基础命令(使用腾讯云镜像源)

Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux 或 Windows 操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&…

UI 自动化技能:20个实战技巧!测试工程师必看!

大家周五 好啊&#xff01;忙碌了一周&#xff0c;又可以懒洋洋躺在沙发上了~~~ 又到了每年的金九银十了&#xff0c;今天聊聊如何提升UI自动化话题... 你是否在求职过程中感受到UI自动化的技能不足&#xff1f; 随着测试行业的发展&#xff0c;UI自动化测试已成为每位测试工程…

PostgreSQL技术内幕7:PostgreSQL查询编译

文章目录 0.简介1.整体过程2.查询分析2.1 Lex2.2 Yacc2.3 PG词法分析和语法分析介绍2.4 PG语义分析 4.查询优化4.1 预处理4.1.1 提升子链接和子查询4.1.2 预处理表达式4.1.3 处理HAVING子句 4.2 改进查询树4.2.1 路径生成4.2.2 代价估计 4.3 计划生成 0.简介 一次完整的SQL执行…

薄膜制造革新-平扫式自动风环测厚仪

在现代工业的舞台上&#xff0c;薄膜制造如同一位灵动的舞者&#xff0c;不断追求着更高的品质与更卓越的性能。而在这场持续的革新之舞中&#xff0c;平扫式自动风环测厚仪正以其独特的魅力&#xff0c;成为引领薄膜制造迈向新高度的璀璨之星。 曾经&#xff0c;薄膜厚度的测…

2024数学建模国赛选题建议+团队助攻资料

目录 一、题目特点和选题建议 二、模型选择 1、评价模型 2、预测模型 3、分类模型 4、优化模型 5、统计分析模型 三、white学长团队助攻资料 1、助攻代码 2、成品论文PDF版 3、成品论文word版 9月5日晚18&#xff1a;00就要公布题目了&#xff0c;根据历年竞赛题目…

【网络安全】XSS+OTP绕过+账户接管

未经许可,不得转载。 文章目录 正文XSSOTP绕过账户接管正文 目标:www.example.com XSS 不断寻找可能存在XSS的点位。 终于,在个人资料页面:www.example.com/profile_details.php?userid= ,使用Payload<script>alert(1)</script>,实现XSS: 因此,能够实…

Opencv中的直方图(1)计算反向投影直方图函数calcBackProject()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算直方图的反向投影。 cv::calcBackProject 函数计算直方图的反向投影。也就是说&#xff0c;类似于 calcHist&#xff0c;在每个位置 (x, y)…

Android Camera系列(二):TextureView+Camera

两岸猿声啼不住&#xff0c;轻舟已过万重山—李白 Android Camera系列&#xff08;一&#xff09;&#xff1a;SurfaceViewCamera Android Camera系列&#xff08;二&#xff09;&#xff1a;TextureViewCamera Android Camera系列&#xff08;三&#xff09;&#xff1a;GLS…

有趣的手机端见缝插针游戏源码

有趣的手机端见缝插针游戏源码下载&#xff0c;注&#xff1a;本地预览请用火狐浏览器模拟移动端&#xff0c;chrome本地预览存在跨域问题。 微信扫码获取源码

【springboot】使用缓存

目录 1. 添加依赖 2. 配置缓存 3. 使用EnableCaching注解开启缓存 4. 使用注解 1. 配置缓存名称 2. 配置缓存的键 3. 移除缓存 5. 运行结果 1. 添加依赖 <!-- springboot缓存--><dependency><groupId>org.springframework.boot</groupId>…

Java 入门指南:Java 并发编程 —— Fork/Join 框架 实现任务的拆分与合并

Fork/Join Fork/Join 是Java并发编程中的一个框架&#xff0c;用于解决大型任务的并行执行问题。它于 Java 7中引入&#xff0c;旨在简化对多核处理器上可并行执行任务的开发。 Fork/Join 框架基于分治&#xff08;divide and conquer&#xff09;的设计思想。它将大型任务划…

Unet改进13:添加RepVGG||减少冗余计算和同时存储访问

本文内容:在不同位置添加RepVGG注意力机制 目录 论文简介 1.步骤一 2.步骤二 3.步骤三 4.步骤四 论文简介 我们提出了一种简单但功能强大的卷积神经网络结构,该结构具有类似vgg的推理时间主体,仅由3 3卷积和ReLU堆栈组成,而训练时间模型具有多分支拓扑结构。通过结构…

无人机之飞行速度篇

无人机的飞行速度是一个复杂且多变的参数&#xff0c;它受到多种因素的影响。以下是对无人机飞行速度及其影响因素的详细分析&#xff1a; 一、无人机飞行速度概述 无人机的飞行速度通常以其在不同飞行模式下的水平飞行速度来衡量&#xff0c;如平稳挡&#xff08;Cine&#x…

【微服务】接口的幂等性怎么设计?

一、什么是幂等&#xff1f; 幂等性&#xff1a;短时间内&#xff0c;对于相同输入的请求&#xff0c;无论进行多少次重复操作&#xff0c;都应该和单次调用的结果一致。 二、幂等问题产生的原因是什么&#xff1f;(或者说为什么需要实现幂等性?) 1、前端重复提交 在用户注…

算法day16|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

算法day16|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树 654.最大二叉树617.合并二叉树1.额外申请空间&#xff08;失败&#xff09;2.不额外申请空间 700.二叉搜索树中的搜索98.验证二叉搜索树1.遍历后排序2.边遍历遍排序3.指针记录法 654.最大…