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

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.mzph.cn/bicheng/53203.shtml

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

相关文章

【大数据】kafka与Zookeeper不得不说的关系!

文章目录 一、开场白&#xff1a;大数据时代的“黄金搭档”二、正文1. Kafka与ZooKeeper的那些事儿2. ZooKeeper的选举&#xff1a;一场“王位争夺战”3. Kafka的“备胎”计划&#xff1a;告别ZooKeeper的日子4. 源码揭秘&#xff1a;一探究竟的“八卦之旅” 三、结尾&#xff…

深入了解linux下TCP并发服务器和IO模型的实现

一、整体框架 在网络编程中&#xff0c;服务器的架构可以根据需求不同而有所不同。主要有以下几种框架&#xff1a; 1. 单循环服务器&#xff1a;同一时刻只处理一个客户端的请求&#xff0c;通常使用传统的阻塞式编程模型。这种模型简单易实现&#xff0c;但处理能力有限&am…

.NetCore发布到IIS

一&#xff1a;安装sdk(下载 .NET 8.0 SDK (v8.0.302) - Windows x64 Installer) 与donet Runtime(.NET Downloads (Linux, macOS, and Windows))选择对应的版本下载 二&#xff1a;解决问题&#xff1a;HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面&#x…

【C++11(一)之入门基础)】

文章目录 C简介统一的列表初始化&#xff5b;&#xff5d;初始化 std::initializer_liststd::initializer_list是什么类型&#xff1a;std::initializer_list使用场景&#xff1a; 声明autodecltypenullptr STL中一些变化 C简介 在2003年C标准委员会曾经提交了一份技术勘误表(…

大数据新视界--大数据大厂之MySQL 数据库课程设计:数据安全深度剖析与未来展望

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

一种误差较小的轮廓面积计算算法

1.背景 基于微分思想的轮廓面积计算方法之一是将多边形轮廓边与X轴会Y轴进行围合&#xff0c;形成一个个梯形&#xff0c;每个梯形的面积有符号&#xff0c;累计求和即得到多边形轮廓的面积。详见博主之前的文章&#xff0c; 记录导致计算轮廓面积出错的一个坑点-CSDN博客文章…

C++ Qt进程间通信机制之QRO、QRemoteObjectHost

文章目录 QRO_serverQRO_client深入浅出C++ Qt开发技术专栏:https://blog.csdn.net/yao_hou/category_9276099.html Qt高级开发视频教程 https://edu.csdn.net/course/detail/37447?spm=1001.2014.3001.5507 C++零基础入门视频教程 https://edu.csdn.net/course/detail/379…

Rust 学习笔记 3:一般性编程概念

上一篇&#xff1a;Rust 学习笔记 2&#xff1a;猜数字游戏 文章目录 1. 前言2. 背景3. Rust 中的一般性编程概念3.1 变量及其可变性(Mutability)3.1.1 变量定义3.1.2 常量3.1.3 变量隐藏(Shadowing) 3.2 基本类型3.2.1 标量(scalar)类型3.2.1.1 整型(Integer Types)3.2.1.2 浮…

项目拆解:短视频冷门赛道—ai绘画+温馨小屋,引流变现全攻略

在这个快节奏的时代&#xff0c;工作、学习、家庭的重担仿佛三座大山&#xff0c;让人喘不过气&#xff0c;心情时常跌入谷底。就像蜗牛遇到威胁会缩进壳里&#xff0c;我们也会在疲惫和忧虑时&#xff0c;渴望一个属于自己的温暖小窝&#xff0c;来安放疲惫的心灵。而自媒体平…

Flink 1.14.* Flink窗口创建和窗口计算源码

解析Flink如何创建的窗口&#xff0c;和以聚合函数为例&#xff0c;窗口如何计算聚合函数 一、构建不同窗口的build类1、全局窗口2、创建按键分流后的窗口 二、在使用窗口处理数据流时&#xff0c;不同窗口创建的都是窗口算子WindowOperator1、聚合函数实现2、创建全局窗口(入参…

SpringFrameWork学习笔记

本笔记基于【尚硅谷新版SSM框架全套视频教程&#xff0c;Spring6SpringBoot3最新SSM企业级开发】https://www.bilibili.com/video/BV1AP411s7D7?vd_sourcea91dafe0f846ad7bd19625e392cf76d8 总结 资料获取网址&#xff1a;https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWF 技术…

Java项目: 基于SpringBoot+mysql房产销售系统 (含源码+数据库+开题报告+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql房产销售系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐…

数学基础 -- 线性代数之LU分解

LU分解 LU分解&#xff08;LU Decomposition&#xff09;是线性代数中非常重要的一种矩阵分解方法。它将一个方阵分解为一个下三角矩阵&#xff08;L矩阵&#xff09;和一个上三角矩阵&#xff08;U矩阵&#xff09;的乘积。在数值线性代数中&#xff0c;LU分解广泛用于求解线…

Halcon基于灰度值的模板匹配

Halcon基于灰度值的模板匹配 基于灰度值的模板匹配是最经典的模板匹配算法&#xff0c;也是最早提出来的模板匹配算法。这种算法的根本思想是&#xff0c;计算模板图像与检测图像之间的像素灰度差值的绝对值总和&#xff08;SAD方法&#xff09;或者平方差总和&#xff08;SSD…

Spring解析

目录 容器与 bean 1) 容器接口 演示1 - BeanFactory 与 ApplicationContext 的区别 代码参考 收获&#x1f4a1; 演示2 - 国际化 2) 容器实现 演示1 - DefaultListableBeanFactory 代码参考 收获&#x1f4a1; 演示2 - 常见 ApplicationContext 实现 代码参考 收获…

ico格式怎么转换?5个软件让你轻松转换文件格式

ico格式怎么转换&#xff1f;5个软件让你轻松转换文件格式 ICO格式是常用于网站图标和应用程序图标的文件格式&#xff0c;虽然它很常见&#xff0c;但并非所有图像编辑软件都支持直接保存为ICO格式。如果你需要将其他格式的图片&#xff08;如PNG、JPG等&#xff09;转换为IC…

读书学习笔记入门 # Datawhale X 李宏毅苹果书 AI夏令营

文章目录 学习目标&#xff1a;学习内容&#xff1a;Task 1 通过案例了解机器学习机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;和深度学习&#xff08;Deep Learning&#xff0c;DL&#xff09;的基本概念什么是回归&#xff08;regression&#xff09;什么…

深入解析Linux轻量级进程:线程的概念、原理、优缺点及其与进程的关系与区别

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f4da;Linux线程&#x1f4d5;什么是线程*可以使用多进程去并发的执行一个进程的代码&#xff0c;那为什么要由线程呢&#x…

基于CloudflareSpeedTest项目实现git clone加速

1.网络测速 「自选优选 IP」测试 Cloudflare CDN 延迟和速度&#xff0c;获取最快 IP 更多内容参考项目&#xff1a;https://github.com/XIU2/CloudflareSpeedTest 国外很多网站都在使用 Cloudflare CDN&#xff0c;但分配给中国内地访客的 IP 并不友好&#xff08;延迟高、丢…

Pixelmator Pro for Mac 专业图像处理软件【媲美PS的修图软件】

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…