Shell 脚本入门

目录

一、Shell是什么

1.1 我们为什么要学习Shell和使用Shell?

1.2 Shell的分类有哪些?

二、Shell脚本入门知识

2.1 Shell文件命名规范

2.2 Shell解析器

2.3 用Shell 编写hello World

三、Shell的四种变量类型

3.1 系统预定义变量

3.2 自定义变量

3.3 只读变量和撤销变量

3.4 特殊变量


一、Shell是什么

1.1 我们为什么要学习Shell和使用Shell?

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

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

1.2 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

那么如何查看系统使用的Shell呢,使用以下指令即可:

echo $SHELL 

可以看到我们系统使用的shell是/bin/bash类型的 

二、Shell脚本入门知识

2.1 Shell文件命名规范

bash shell的默认后缀为 .sh

2.2 Shell解析器

#!/bin/bash

上面一行指定当前系统这个脚本要使用的shell解释器是/bin/bash 

2.3 用Shell 编写hello World

首先来创建一个目录scripts来存放shell脚本

mkdir scripts

然后创建Shell文件

touch hello.sh

hello.sh文件的内容

#!/bin/bash
echo "Hello World!"

执行文件有三种方式

bash ./hello.sh        #不需要加权限

sh ./hello.sh            #不需要加权限

./hello.sh                 #需要加权限

如果是第三种方式运行需要加权限,使用以下命令即可 

 chmod +x hello.sh

三、Shell的四种变量类型

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

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

  • 全局变量:层层嵌套的子bash依然可以访问
  • 局部变量:只在当前的bash中可以访问,子bash和父bash都不能访问呢

3.1 系统预定义变量

常用系统变量

$HOME,$PWD,$SHELL,$USER

env命令查看当前所有的全局变量 

set查看当前所有变量 

明显比env命令后得到的变量要多! 

3.2 自定义变量

基本语法
定义变量:变量名=变量值
规则

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

温馨提示
查看定义的变量是全局还是局部

  • 全局: env | grep 变量名
  • 局部: set | grep 变量名

当然,你可以进入子bash中去尝试输出变量,无法输出则是局部变量,可以输出则是全局变量
全局变量
如何定义一个全局变量呢?需要先声明一个局部变量,然后再通过export 导出为一个全局变量
在子bash中修改全局变量,只会再当前环境中生效,不会影响父bash环境,哪怕是你增加 export 也依然不会影响到父bash环境
Shell脚本中使用变量
我们可以在 hello.sh 的脚本中去调用全局和局部变量
export 变量名

txt=10

export txt
#!/bin/bash
echo $txt
在shell脚本中使用变量,同样遵循全局和局部变量的规则

3.3 只读变量和撤销变量

只读变量

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

定义规则

readonly 变量名=值

撤销变量

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

3.4 特殊变量

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

$n

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

如下面这个例子n_test.sh:

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

注意:$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(具体是哪个数字,由命令自己决定),则证明上面命令不正确了 

例如下面这个例子:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年java面试--redis(1)

系列文章目录 2024年java面试(一)–spring篇2024年java面试(二)–spring篇2024年java面试(三)–spring篇2024年java面试(四)–spring篇 文章目录 系列文章目录前言Redis数据类型Red…

vue 小黑记事本

vue 小黑记事本 下面这个界面用html和css 如何搞出来?

软考:中级软件设计师:大数据

软考:中级软件设计师:大数据 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 &#x…

Java 复习笔记 - 方法篇

文章目录 一,方法的定义二,最简单的方法定义和调用三,带参数的方法定义和调用四,带返回值方法的定义和调用五,小结六,方法的重载七,方法简单练习1,数组遍历2,数组最大值3…

无涯教程-Android Intent Standard Extra Data函数

下表列出了各种重要的Android Intent Standard Extra Data。您可以查看Android官方文档以获取额外数据的完整列表- Sr.NoExtra Data & Description1 EXTRA_ALARM_COUNT 用作AlarmManager intents(意图)中的int Extra字段,以告诉正在调用的应用程序intents(意图)释放了多少…

java Spring Boot将不同配置拆分入不同文件管理

关于java多环境开发 最后还有一个小点 我们一般会将不同的配置 放在不同的配置文件中 好处肯定就在于 想换的时候非常方便 那么 我们直接看代码 我们将项目中的 application.yml 更改代码如下 spring:profiles:active: dev这里 意思是 我们选择了dev 环境 然后创建一个文件 …

【网络设备】交换机的概念、工作原理、功能以及以太网帧格式

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、认识交换机 二、交换机的主要功能 1、数…

ARP欺骗(大白话)

前提条件: 有三台主机,PC1,PC2,PC3,现要实现PC1与PC2的关联(如图) 不存在ARP欺骗时 步骤: 首先查看arp表(有ip和mac的关系) 如果表中有PC2的信息&#xf…

【Python数据分析】数据分析之numpy基础

实验环境:建立在Python3的基础之上 numpy提供了一种数据类型,提供了数据分析的运算基础,安装方式 pip install numpy导入numpy到python项目 import numpy as np本文以案例的方式展示numpy的基本语法,没有介绍语法的细枝末节&am…

打破对ChatGPT的依赖以及如何应对ChatGPT的错误和幻觉

​ OpenAI的ChatGPT是第一个真正流行的生成式AI工具,但它可能不是最好的。现在是时候扩大你的AI视野了。 ChatGPT成为了基于大语言模型(LLM)的聊天机器人的同义词。但是现在是时候停止对ChatGPT的痴迷,开始发现这个新世界中强大的替代品了。 首先&a…

保姆级教程之SABO-VMD-SVM的西储大学轴承诊断

之前写过一篇优化核极限学习机的轴承诊断,今天再出一期基于SVM的轴承诊断。 依旧是包含了从数据处理,到减法优化器SABO算法优化VMD参数,再到支持向量机的故障诊断,实现故障诊断的全流程,其他类型的故障诊断均可参考此流…

聚观早报|OpenAI宣布推出企业版ChatGPT;苹果公司开设8家新店

【聚观365】8月30日消息 OpenAI宣布推出企业版ChatGPT 比亚迪上半年净利润109.5亿元 歌尔股份上半年净利润4.22亿元 一起教育科技Q2营收6925万元 苹果公司今年开设8家新店 OpenAI宣布推出企业版ChatGPT 据外媒报道,当地时间周一,美国人工智能研究…

XGBoost,NVIDIA是什么

目录 XGBoost 算法层面 什么是 XGBoost GBDT是什么 GBDT中的GB 为何选择 XGBoost? XGBoost 的优势和属性 XGBoost 和数据科学家 为何 XGBoost 在 GPU 上表现更出色 XGBoost RAPIDS GPU 加速的 XGBoost NVIDIA是什么 使用 Spark XGBoost 的 GPU 加速端…

04、添加 com.fasterxml.jackson.dataformat -- jackson-dataformat-xml 依赖报错

Correct the classpath of your application so that it contains a single, compatible version of com.fasterxml.jackson.dataformat.xml.XmlMapper 解决: 改用其他版本,我没写版本号,springboot自己默认的是 2.11.4 版本 成功启动项目…

忘记密码-小米机型 其他安卓机型账号锁 设备锁的分析与刷写某第三方解锁包输入“注册码”

重要提示: 博文的主要目的是分析安卓机型账号锁的安全性和解决方法。操作仅限于自己的机型忘记密码 手机号不用过了保修期导致无法通过官方解锁的操作,请勿用于非法途径 在开始前。对于锁的认知可以参考这篇博文 安卓搞机玩机-什么是“锁 ” BL锁 屏幕锁…

Android Gradle 同步优化

作者:究极逮虾户 很多人听到方法论三个字,就觉得我要开始pua,说我阿里味,但是我觉得这个查问题的方式可能会对大家有点帮助。 很多人都会有这样的困扰,给你的一个工作内容是一个你完全陌生的东西,第一选择…

迁移学习:实现快速训练和泛化的新方法

文章目录 迁移学习的原理迁移学习的应用快速训练泛化能力提升 迁移学习的代码示例拓展应用与挑战结论 🎉欢迎来到AIGC人工智能专栏~迁移学习:实现快速训练和泛化的新方法 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博…

debug调试时,通过[[FunctionLocation]]找到函数在源代码中的位置

[[FunctionLocation]] 是 JavaScript 引擎内部的一个属性,用于记录函数在代码中的位置。它不是 JavaScript 语法的一部分,而是在调试和开发过程中用于追踪函数定义位置的一个辅助属性。 当我们在浏览器的开发者工具或其他调试工具中查看函数的属性时&am…

微信短链跳转到小程序指定页面调试

首先说下背景:后端给了短链地址,但是无法跳转到指定页面。总是在小程序首页。指定的页面我们是h5页面。排查步骤如下: 1、通过快速URL Scheme 编译。上部普通编译 下拉找到此选项。 、 2、按照小程序的要求的URL Scheme输入。另外后端给的…

SQL-DQL

-----分组查询----- 1.语法: SELECT 字段列表 FROM 表名 [WHERE 条件 ] GROUP BY 分组字段名 [HAVING 分组后过滤条件]; 2.where与having区别 》执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组&…