ShellScript脚本编程(一)

什么是Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

image-20230620210335278

为什么要学习和使用shell?

Shell属于内置的脚本,程序开发的效率非常高,依赖于功能强大的命令可以迅速地完成开发任务(批处理)语法简单,代码写起来比较轻松,简单易学(运维人员)

Shell的分类

在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是/bash/shell( 重 点\默认 ),流行的还有/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash/bin/tcsh/bin/csh

查看流行shell

cat /etc/shells 

当前系统使用的Shell

echo $SHELL

Shell脚本入门

文件命名规范

文件名.sh .sh是linux下bash shell 的默认后缀

Shell解析器

指定告知系统当前这个脚本要使用的shell解释器

#!/bin/bash

创建Shell文件

touch hello.sh

编辑Shell文件

#!/bin/bash
echo "Hello World"

执行脚本

bash ./hello.sh
sh ./hello.sh

更简单的执行方式,因为我们知道当前就在bash下面,所以可以直接执行文件

./hello.sh

此时你会发现,报错:-bash: ./hello.sh: Permission denied,这是因为没有权限,我们来查看权限

ll hello.sh # -rw-r--r--. 1 root root 31 Jun 21 05:41 hello.sh

接下来我们给他权限

chmod +x hello.sh

此时你会发现,文件变了颜色,所有可执行文件都会变颜色,变成绿色,执行文件

./hello.sh

扩展执行方案:

  1. source 文件.sh
  2. . 文件.sh

Shell变量_系统预定义变量

运行Shell文件的区别

第一种:bash ./hello.sh 和 sh ./hello.sh

第二种:source hello.sh 和 . hello.sh

两种运行的方式差异性在于,第一种是在子bash环境下运行,而第二种是在当前bash环境下运行,我们通过运行type source可以看到 source is a shell builtin (source 是 shell 内嵌)

我们执行ps -f可以查看当前bash环境,创建一个子bash,继续通过ps -f查看,在当前子bash环境下,你依然可以运行shell文件

从结果上来看,两者好像没有什么区别,但是如果引入更多知识,例如变量:如果子shell中设置的当前变量,父shell是可不见的

变量简介

变量本质上其实是在内存中开辟一个空间用来临时存储数据,例如:age = 20

image-20230621140321383

全局变量和局部变量的区别

image-20230621140656767

全局变量:层层嵌套的子bash依然可以访问

局部变量:只在当前的bash中可以访问,子bash和父bash都不能访问呢

常用系统变量

$HOME 、$PWD 、$SHELL 、$USER

查看当前所有的全局系统变量env

查看当前所有的变量set(包含全局和局部的,系统的,用户的)

Shell变量_用户自定义变量 

基本语法

定义变量:变量名=变量值

规则
  1. 等号前后不能有空格
  2. 在声明变量的时候是不需要添加$符号,但是使用时候需要添加
  3. 如果定义的是一个字符串,需要将值添加双引号或者单引号

温馨提示

查看定义的变量是全局还是局部

全局:env | grep 变量名

局部:set | grep 变量名

当然,你可以进入子bash中去尝试输出变量,无法输出则是局部变量,可以输出则是全局变量

全局变量

如何定义一个全局变量呢?需要先声明一个局部变量,然后再通过export导出为一个全局变量

export 变量名

温馨提示

再子bash中修改全局变量,只会再当前环境中生效,不会影响父bash环境,哪怕是你增加export也依然不会影响到父bash环境

Shell脚本中使用变量

我们可以在hello.sh的脚本中去调用全局和局部变量

#!/bin/bash
echo $txt

温馨提示

在shell脚本中使用变量,同样遵循全局和局部变量的规则

Shell变量_只读变量和撤销变量

自定义变量注意事项:

  1. 变量命名规范:字母、数字和下划线组成,其中数字不能开头
  2. 自定义变量一般都是小写的
  3. 在shell中,变量是没有类型的,或者我们理解为全部都是字符串类型
  4. 如果变量的值需要做数值运算,可以使用$((1+1))或者$[1+1]的形式

只读变量

在shell中,只读变量相当于是常量,定义之后不允许修改。定义规则

readonly 变量名=值

撤销变量

变量定义之后是可以撤销的,使用unset 变量名就可以撤销了

温馨提示

变量是可以撤销的,但是只读变量是不可以撤销的

Shell变量_特殊变量

在Shell中,存在一些特殊变量,他们具有特殊的意义

$n

$n代表接受参数,n是数字,代表在执行脚本时候传递的参数数量,例如$1-$9代表第一个到第九个参数,十以上的数字,可以使用大括号包裹,例如${10}。比较特殊的是$0,代表当前脚本名称

#!/bin/bash
echo '======$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $0

$#

$#获取输入参数的个数,一般用于循环中,判断参数的个数是否正确,加强脚本的健壮性

#!/bin/bash
echo '=====$#====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo $#

$*$@

$*$@非常相似,都代表命令行所有的参数,但是$*把参数看成是一个整体,例如123 456。而$@把每个参数区分对待,例如[123,456] 注意:在没有循环遍历时候,两者效果一致

#!/bin/bash
echo '=====$n====='
echo 1st:$1
echo 2st:$2
echo 3st:$3
echo '=====$*====='
echo $*
echo '=====$@====='
echo $@

$?

$?最后一次执行命令的状态,如果是结果是0,证明上面执行的命令都是正确的,如果结果不是0(具体是哪个数字,有命令自己决定),则证明上面命令不正确了

[root@localhost scripts]# vim hello.sh
[root@localhost scripts]# echo $?
0
[root@localhost scripts]# hello.sh
-bash: hello.sh: command not found
[root@localhost scripts]# echo $?
127
[root@localhost scripts]# 

Shell_运算符

我们将Shell当成一门编程语言来学习,那么就一定需要有运算符

在Shell中,还存在expr表达式,可以用于做运算

在Shell中,运算需要使用$((a+b))或者$[a+b]的形式

表达式 expr

expr 10 + 10
expr 10 - 10
expr 10 \* 10

温馨提示

运算符前后要添加空格

如何要赋值给一个变量,需要命令替换

a=$(expr 10 + 10)
a=`expr 10 + 10`

$((a+b))或者$[a+b]

$((10+10))
$[10+10]

实例操作

计算 (5+4) * 10 的值

s=$[(5+5)*10]

脚本中操作

创建add.sh,在执行的时候,通过传递参数的形式实现加法效果

#!/bin/bash
sum=$[$1 + $2]
echo sum=$sum

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

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

相关文章

基于Spring Boot的校园疫情防控系统设计与实现

基于Spring Boot的校园疫情防控系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 管理员登录首页界面图,管理员进入校园疫…

数据分析:基于DESeq2的转录组功能富集分析

介绍 DESeq2常用于识别差异基因,它主要使用了标准化因子标准化数据,再根据广义线性模型判别组间差异(组间残差是否显著判断)。在获取差异基因结果后,我们可以进行下一步的富集分析,常用方法有基于在线网站…

## CSDN创作活动:缓解工作压力:程序员的健康之道

缓解工作压力:程序员的健康之道 在当今快节奏的社会中,程序员作为一个高度专业化和技术密集的群体,往往需要面对持续的工作压力和创新挑战。在如此高强度的工作环境下,如何有效缓解工作压力,保持工作效率和个人健康成…

Java线程池的七大参数说明

线程池中的七大参数如下: (1)corePoolSize:线程池中的常驻核心线程数。 (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1。 (3)keepAl…

Recruit App

招聘类APP小程序

【Vulhub靶场】Nginx 漏洞复现

Nginx 漏洞复现 一、Nginx 文件名逻辑漏洞(CVE-2013-4547)1、影响版本2、漏洞原理3、漏洞复现 二、Nginx 解析漏洞1、版本信息:2、漏洞详情3、漏洞复现 一、Nginx 文件名逻辑漏洞(CVE-2013-4547) 1、影响版本 Nginx …

HSDB使用教程

HSDB:Hostspot Debugger,JVM内置的工具,用于深入分析JVM运行时的内部状态 启动HSDB java -cp D:/tools/jdk-1.8/lib/sa-jdi.jar sun.jvm.hotspot.HSDB 获取进程id jps 连接到指定进程 查找类 通过查询查找对象 输入查询语句 select d from …

SQL 基础 | AS 的用法介绍

SQL(Structured Query Language)是一种用于管理和操作数据库的标准编程语言。 在SQL中,AS关键字有几种不同的用法,主要用于重命名表、列或者查询结果。 以下是AS的一些常见用法: 重命名列:在SELECT语句中&a…

Python中的Higher库详解

Python的Higher库是一个用于对深度学习模型进行微分和元学习的强大工具。这个库允许用户在不修改底层代码的情况下对任何可微模型进行高阶梯度计算。在本文中,我们将详细介绍Higher库的基本用法,展示一些实际的代码示例,并探讨其在模型训练中…

【RBAC鉴权】node-casbin基础教程

一、RBAC概述 RBAC鉴权,完整的英文描述是:Role-Based Access Control,中文意思是:基于角色(Role)的访问控制。这是一种广泛应用于计算机系统和网络安全领域的访问控制模型。 简单来说,就是通过…

为人处事电影解说,全新升级瀚海跑道一分钟一条视频,全平台可推广,轻轻松松日入1000

自古以来,我国流行的一种现象是,大多数人都会与领导或上司打交道。由于某些话题不宜公开讨论,因此出现了许多含蓄的表达方式。随着年龄的增长,人们的态度也发生了变化,从最初的轻视到现在的重视。 下 载 地 址&#…

38-4 Web应用防火墙 - WAF的使用及规则

准备:38-3 Web应用防火墙 - 安装配置WAF-CSDN博客 WAF的使用 启动 Nginx /usr/local/nginx/sbin/nginx 为了测试未启动 ModSecurity 时的访问效果,我们可以模拟攻击。要查看当前虚拟机的 IP 地址,可以使用命令 ifconfig 浏览器中访问ip,如果要在真实机中访问就需要关闭…

【C++】vector类的增删改查模拟实现(图例超详细解析!!!)

目录 一、前言 二、源码引入 三、vector的模拟实现 ✨实现框架 ✨前情提要 ✨Member functions —— 成员函数 ⚡构造函数 ⭐无参构造 ⭐迭代器区间构造 ⭐n个值构造 ⚡拷贝构造 ⚡运算符赋值重载 ⚡析构函数 ✨Element access —— 元素访问 ⚡operator[ ] …

C语言 | Leetcode C语言题解之第63题不同路径II

题目: 题解: int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize,int* obstacleGridColSize) {int n obstacleGridSize, m obstacleGridColSize[0];int f[m];memset(f, 0, sizeof(f));f[0] (obstacleGrid[0][0] 0);for (int i…

融创共赢,算网领航 | 移动云智能芯片开放实验室正式发布

4月29日上午,中国移动算力网络大会“融创共赢,算网领航-算网原生技术”分论坛在苏州金鸡湖国际会议中心顺利召开,中国移动云能力中心副总经理吴世俊出席论坛并发表致辞。大会举行了智能芯片开放实验室发布仪式,同时发布移动云最新…

服务器IP选择

可以去https://ip.ping0.cc/查看IP的具体情况 1.IP位置--如果是国内用,国外服务器的话建议选择日本,香港这些比较好,因为它们离这里近,一般延时低(在没有绕一圈的情况下)。 不过GPT的话屏蔽了香港IP 2. 企…

2024年税务师报名照片处理工具使用详细教程✅

第1️⃣步:登陆税务师考试报名入口 第2️⃣步:登陆税务师考试报名入口 第3️⃣步:下载税务师报名照片处理工具 第4️⃣步:双击打开照片检测工具 第5️⃣步:点击“打开照片文件”上传合规照片 第6️⃣步:在对…

JAVA面试题---WEB部分

网络通讯 TCP与UDP TCP(Transmission Control Protocol 传输控制协议)是一种面向连接(连接导向)的、 可靠的、 基于 IP 的传输层协议。 UDP 是 User Datagram Protocol 的简称,中文名是用户数据报协议,是 OSI 参考模 型中的传输层协议,它是…

用WebUI生成一个毛茸茸的图标教程

🚀内容概要 好久没有更新webui的教程了,五一期间刷新liblib,发现更新了几个有趣的lora,正好这段时间看到有朋友发了毛绒图标,所以这里做了一个简单的webui 教程,教你如何一步生成毛绒图标,就像…

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术,可以给玩家身临其境的感觉,接下来让我们学习这部分的内容吧! SteamVR Input SteamVR绑定流程,在Windows窗口的点击SteamVR-input,图1,在这里可以选择你需要绑定…