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

news2024/9/19 10:37:52

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/bash

for ((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/null
  if [ $? -eq 0 ]
    then
      echo "$$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.coloradmin.cn/o/2102482.html

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

相关文章

(前端)面试300问之(3)this的指向判断

一、this的相关理解与解读 1、各角度看this。 1&#xff09;ECMAScript规范&#xff1a; this 关键字执行为当前执行环境的 ThisBinding。 2&#xff09;MDN&#xff1a; In most cases, the value of this is determined by how a function is called. 在绝大多数情况下&…

图片损坏,如何修复?

在数字化时代&#xff0c;图片已成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;有时我们可能会遇到图片损坏的情况&#xff0c;无论是珍贵的家庭照片、工作文档中的关键图像&#xff0c;还是社交媒体上的分享内容&#xff0c;图片损坏都可能带来不小的困扰。那么…

网络传输加密及openssl使用样例(客户端服务器)

文章目录 背景常用加密方式SSLOpenSSL主要功能 库结构 交互流程证书生成生成 RSA 私钥私钥的主要组成部分私钥的格式 创建自签名证书: 签发证书服务器端代码客户端代码常见错误版本问题证书问题证书格式 背景 网络传输中为保证数据安全&#xff0c;通常需要加密 常用加密方式…

Open3D 基于曲率大小的特征点提取

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 三、实现效果 3.1原始点云 3.2提取特征点 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#xff08;长期更新&#xff09;-CSDN博客 一、概述 基于曲率…

STM32 外部中断(EXTI)

STM32 外部中断(EXTI) 实验&#xff1a;配置一个引脚的下降沿作为外部中断。 参考&#xff1a;江协科技 相关缩写 RCC(Reset and Clock Control) 复位和时钟控制 GPIO(General Purpose Input/Output) 通用输入/输出 AFIO(Alternate Function Input Output) 复用功能输入输…

6.Lab five —— Lazy Page Allocation

首先先切换到lazy分支 git checkout lazy make clean Xv6应用程序使用sbrk()系统调用向内核请求堆内存。sbrk()分配物理内存并将其映射到进程的虚拟地址空间。内核为一个大请求分配和映射内存可能需要很长时间。为了提高效率&#xff0c;故采用懒分配的策略 Eliminate alloc…

Scratch在线玩:3D地铁跑酷

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 作品介绍&#xff1a; 欢迎体验在 Scratch 上重新制作的 3D 地铁跑酷游戏&#xff01;这款游戏完全采用 3D 技术打造&#xff0c;带来流畅的视觉效果和出色的游戏体验。游戏的目标是避免列车和障碍物&#xff0c;同…

力扣 1419. 数青蛙

力扣 1419. 数青蛙 1. 题目 2. 思路 本题就是一道 字符串模拟题&#xff1b; 题目说到了&#xff0c; 会混杂着青蛙的叫声&#xff0c; 如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成&#xff0c;请返回 -1, 那就是说如果有多余的 c, r, o等等, 比如 &quo…

【机器学习】机器学习引领未来:赋能精准高效的图像识别技术革新

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f50d;1. 引言&#x1f4d2;2. 机器学习基础与图像识别原理&#x1f341;机器学习概述&#xff1a;监督学习、无监督学习与强化学…

「深入理解」HTML Meta标签:网页元信息的配置

「深入理解」HTML Meta标签&#xff1a;网页元信息的配置 HTML的<meta>元素用于提供关于HTML文档的元数据&#xff08;metadata&#xff09;&#xff0c;这些信息对于浏览器和其他处理HTML文档的应用程序来说是非常有用的&#xff0c;如&#xff1a;<base>、<li…

虚幻引擎VR游戏开发02 | 性能优化设置

常识&#xff1a;VR需要保持至少90 FPS的刷新率&#xff0c;以避免用户体验到延迟或晕眩感。以下是优化性能的一系列设置&#xff08;make sure the frame rate does not drop below a certain threshold&#xff09; In project setting-> &#xff08;以下十个设置都在pr…

用于全栈自动化测试的最佳Python工具

我知道大多数测试人员会说Java是他们创建自动化测试的首选语言。 但是我最喜欢的是Python。为什么?为什么是Python ? Al Sweigart&#xff0c;《自动化那些无聊的东西》的作者&#xff0c;Python一直是他的首选语言&#xff0c;因为:它有一个温和的学习曲线。它适用于Windows…

42.哀家要长脑子了!

1.965. 单值二叉树 - 力扣&#xff08;LeetCode&#xff09; 深度优先搜索&#xff0c;看边两端的结点是不是一样的值 class Solution { public:bool isUnivalTree(TreeNode* root) {if(!root) return true;if(root->right) {if(root->val ! root->right->val || …

数字图像处理基础:图像处理概念、步骤、方式介绍

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

5.2.数据结构-c/c++二叉树详解(下篇)(算法面试题)

本章所有代码请见&#xff1a;5.3.数据结构-c/c二叉树代码-CSDN博客 上篇:5.数据结构-c/c二叉树详解(上篇)&#xff08;遍历方法&#xff0c;完全二叉树&#xff09;-CSDN博客 目录 1 求二叉树 第k层的节点 2 查找一个节点是否在二叉树中 3 求二叉树节点的个数 4 求二叉树…

c#笔记5 详解事件的内置类型EventHandler、windows事件在winform中的运用

为什么要研究这一问题&#xff1f; 事件和委托可以说是息息相关。 前面先解释了什么是委托&#xff0c;怎么定义一个委托以及怎么使用匿名方法来内联地新建委托。 事实上事件这一机制在c#的程序开发中展很重要的地位&#xff0c;尤其是接触了winform软件开发的同学们应该都知…

chapter12-异常(Exception)——(注解)——day14

444-异常处理入门 445-异常基本介绍 446-异常体系图 虚线代表 实现接口&#xff0c;实线代表继承 447-五大运行时异常 448-异常课堂练习 449-异常处理机制 450-tryCatch异常处理 1&#xff09;如果异常发送&#xff0c;则异常发生后面的代码不会执行&#xff0c;直接进入到Catc…

接口报错403 Forbidden 【已解决】

接口报错403 Forbidden 【已解决】 在Web开发中&#xff0c;接口请求错误是开发者经常遇到的问题之一。其中&#xff0c;403 Forbidden错误尤为常见&#xff0c;它表明服务器理解了客户端的请求&#xff0c;但是拒绝执行此请求。本文将深入探讨接口请求403 Forbidden错误&#…

iMazing 3官方中文版软件新功能全面解析,最好用的ios设备管理软件

iMazing 3是一款专为iOS设备设计的全面管理软件&#xff0c;想要更换设备的用户&#xff0c;iMazing 3的数据迁移功能能确保无缝切换。iMazing 3不仅提供了强大的备份和恢复功能&#xff0c;确保用户数据安全无虞&#xff0c;还实现了设备与电脑间的高效文件传输。无论是照片、…

浅析SVG无功补偿器在新能源发电中的应用

引言 随着新能源技术的不断进步&#xff0c;光伏发电已经崛起为未来能源发展的一个关键领域&#xff0c;各地纷纷建立起越来越多的光伏电站。然而&#xff0c;光伏发电领域仍面临诸多挑战&#xff0c;包括电网电压不稳定、发电过剩以及电压波动等问题。在这样的背景下&#xf…