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

例如下面这个例子:

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

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

相关文章

JavaWeb 速通Ajax

目录 一、Ajax快速入门 1.基本介绍 : 2.使用原理 : 二、Ajax经典入门案例 1.需求 : 2.前端页面实现 : 3. 处理HTTP请求的servlet实现 4.引入jar包及druid配置文件、工具类 : 5.Domain层实现 : 6.DAO层实现 : 7.Service层实现 : 8.运行测试 : 三、JQuery操作Ajax 1 …

kvm虚拟机开启VNC功能

停止kvm虚拟机 virsh shutdown 虚拟机名称 在kvm虚拟机配置文件里面添加如下内容 <graphics typevnc port-1 autoportyes listen0.0.0.0 keymapen-us passwd123456> 启动kvm虚拟机 virsh start 虚拟机名称 得到虚拟机进程id ps -ef|grep 虚拟机名称 得到虚拟机vnc…

kubernetes deploy standalone mysql demo

kubernetes 集群内部署 单节点 mysql ansible all -m shell -a "mkdir -p /mnt/mysql/data"cat mysql-pv-pvc.yaml apiVersion: v1 kind: PersistentVolume metadata:name: mysql-pv-volumelabels:type: local spec:storageClassName: manualcapacity:storage: 5Gi…

使用Rust开发命令行工具

生成二进制文件&#xff0c;将其扔到环境变量的path下即可~ 用rust打造实时天气命令行工具[1] 找到合适的API 使用该api[2] 如请求 api.openweathermap.org/data/2.5/weather?qBeijing&appidyour_key: { "coord": { "lon": 116.3972, "lat&quo…

【爬虫小知识】如何利用爬虫爬网页——python爬虫

前言 网络时代的到来&#xff0c;给我们提供了海量的信息资源&#xff0c;但是&#xff0c;想要获取这些信息&#xff0c;手动一个一个网页进行查找&#xff0c;无疑是一项繁琐且效率低下的工作。这时&#xff0c;爬虫技术的出现&#xff0c;为我们提供了一种高效的方式去获取…

无涯教程-分类算法 - 随机森林

随机森林是一种监督学习算法&#xff0c;可用于分类和回归&#xff0c;但是&#xff0c;它主要用于分类问题&#xff0c;众所周知&#xff0c;森林由树木组成&#xff0c;更多树木意味着更坚固的森林。同样&#xff0c;随机森林算法在数据样本上创建决策树&#xff0c;然后从每…

利用PDF.js在微信小程序里预览PDF文件

在微信小程序可以通过wx.downloadFile 和 wx.openDocument 两个api下载并打开pdf文件。这种方式主要有不少的缺点&#xff1a; 1、需要下载才可以查看&#xff0c;且每次打开都需要下载生成一个临时文件&#xff0c;如果PDF文件比较多的话&#xff0c;临时文件会越来越多&…

【问题】jdk20执行虚拟线程报错解决方案

java: ofPlatform() 是预览 API&#xff0c;默认情况下处于禁用状态。 &#xff08;请使用 --enable-preview 以启用预览 API&#xff09; 在idea增加配置 编辑配置 增加jvm参数 然后去执行 public static void main(String[] args) {int 次数 100000;System.out.println(&q…

centos升级python3.10,中间遇到问题,终于解决了

升级为python3.10 yum updateyum install openssl-devel bzip2-devel libffi-develyum groupinstall "Development Tools"wget https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgztar -xzf Python-3.10.2.tgzcd Python-3.10.2./configure --enable-optimi…

硬件知识积累 USB 接口 type - A type - B type - C 的介绍与功能说明 (简单介绍)

1. USB 的介绍 1.1 USB 的定义 USB : 通用串行总线(英语: Universal Serial Bus&#xff0c;缩写:USB)是一种串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通讯产品&#xff0c;并扩展至摄影器材、数字电视&a…

电商项目part05 分布式ID服务实战

背景 日常开发中&#xff0c;需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应 一个订单。现实生活中也有各种 ID&#xff0c;比如身份证 ID 对应且仅对应一个人…

C#,《小白学程序》第七课:列表(List)应用之一“编制高铁车次信息表”

1 文本格式 /// <summary> /// 车站信息类 class /// </summary> public class Station { /// <summary> /// 编号 /// </summary> public int Id { get; set; } 0; /// <summary> /// 车站名 /// </summary>…

【无法联网】电脑wifi列表为空的解决方案

打开电脑, 发现wifi列表为空, 点击设置显示未连接 首先检查是不是网卡驱动有问题, cmd, devmgmt.msc 找到网络适配器, 看看网卡前面是否有感叹号, 如果没有则说明网卡没问题, 有问题则重装驱动 看看网络协议是否设置正确 找到"控制面板\所有控制面板项\网络和共享中心&…

AP5192 DC-DC降压恒流LED汽车灯 LED长条灯 汽车雾灯驱动IC

AP5192是一款PWM工作模式,高效率、外围简单、 内置功率MOS管&#xff0c;适用于4.5-100V输入的高精度 降压LED恒流驱动芯片。最大电流1.5A。 AP5192可实现线性调光和PWM调光&#xff0c;线性调光 脚有效电压范围0.55-2.6V. AP5192 工作频率可以通过RT 外部电阻编程 来设定&…

力扣:73. 矩阵置零(Python3)

题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚…

【LeetCode-中等题】105. 从前序与中序遍历序列构造二叉树

文章目录 题目方法一&#xff1a;递归 题目 方法一&#xff1a;递归 preorder [3,9,20,15,7] inorder [9,3,15,20,7] 首先根据 preorder 找到根节点是 3然后根据根节点将 inorder 分成左子树和右子树 左子树 inorder [9]右子树 inorder [15,20,7]这时候3是根节点 3的左子树…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 高校汉服租赁网站的 设计与实现

一.项目介绍 高校汉服租赁网站分为普通用户以及管理员两类 普通用户&#xff1a; 注册、登录系统、查看汉服首页发帖公告信息、 交流论坛&#xff08;发帖、查看帖子、评论&#xff09;、 公告咨询&#xff08;查看公告以及评论&#xff09;、 汉服信息&#xff08;查…

k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令

1. 使用kuberadm 安装成功后&#xff0c;clear清除了屏幕数据&#xff0c;加入命令无法查看&#xff0c;使用如下&#xff0c;重新查看node如何加入主节点命令&#xff1a; kubeadm token create --print-join-command --ttl 0 2.画圈的全部是&#xff0c;都复制&#xff0c;在…

【中危】Spring Kafka 反序列化漏洞 (CVE-2023-34040)

zhi.oscs1024.com​​​​​ 漏洞类型反序列化发现时间2023-08-24漏洞等级中危MPS编号MPS-fed8-ocuvCVE编号CVE-2023-34040漏洞影响广度小 漏洞危害 OSCS 描述Spring Kafka 是 Spring Framework 生态系统中的一个模块&#xff0c;用于简化在 Spring 应用程序中集成 Apache Kaf…

数据结构1 -- leetcode练习

三. 练习 3.1 时间复杂度 用函数 f ( n ) f(n) f(n) 表示算法效率与数据规模的关系&#xff0c;假设每次解决问题需要 1 微秒&#xff08; 1 0 − 6 10^{-6} 10−6 秒&#xff09;&#xff0c;进行估算&#xff1a; 如果 f ( n ) n 2 f(n) n^2 f(n)n2 那么 1 秒能解决多…