Shell基础和变量使用

一、Shell概述

1、什么是shell

Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务,在用户和内核之间充当翻译官的角色,是一个命令解释器。

Shell是一种编程语言,只是比较古老。Shell是由 C语言开发出来的,它是用户使用 Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。

Shell是一种弱数据类型的脚本语言,无需声明变量类型,直接定义使用,默认的都是字符串类型。

对于 Linux操作系统内部应用而言,Shell是最好的工具,因为 Linux底层命令都支持 Shell语句,以及结合grep、sed、awk进行的高级用法。

Shell本质上是 Linux命令,一条一条命令组合在一起,实现某一个目的,就变成了 Shell脚本。它从一定程度上减轻了工作量,提高了工作效率。

2、什么是 Shell脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序文件。

计算机执行这个文件,就是计算机读取这个文件中的代码,然后将这些 Linux命令一次执行完毕。

计算机在执行 Shell脚本文件的时候是不需要交互的,就是非交互方式执行的,一旦代码有问题,出现交互,就表示没有一次执行完毕所有的语句,是执行半截卡住了,就得重新修改代码逻辑。

业界所说的 shell 通常都是指 shell 脚本,由于习惯的原因,一般大家所说的 “shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。

Linux系统中常会用到 *.sh 脚本文件,通常使用 vim编辑,由linux命令、bash shell 指令、逻辑控制语句和注释等信息组成。

Shell脚本语言非常适合处理纯文本类型数据,如日志文件、配置文件、文本、网页文件。

3、Shell 环境

Shell 编程跟 JavaScript、Python编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。

Bash,也就是 Bourne Again Shell,由于其易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数 Linux系统默认的 Shell。

4、编写 Shell脚本

新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。

shell脚本格式:

#!/bin/bash  # 脚本以#!开头(指定解析器)
# 编写需要的命令

编写第一个 Shell脚本。

#!/bin/bash

echo "Hello World"
  • #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
  • echo 命令用于向窗口输出文本。

5、运行 Shell脚本

shell脚本常用的执行方式。

5.1 作为可执行程序运行

输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x),一般使用这种方式执行脚本语言。

[root@centos7 tmp]# chmod +x ./test.sh
[root@centos7 tmp]# ./test.sh
Hello World

注意:./表示当前目录,整条命令的意思是执行当前目录下的 test.sh 脚本。如果不写./,Linux 会到系统路径(由 PATH 环境变量指定)下查找 test.sh,而系统路径下显然不存在这个脚本,所以会执行失败。
通过这种方式运行脚本,脚本文件第一行的#!/bin/bash一定要写对,好让系统查找到正确的解释器。

5.2 作为解释器参数运行

采用 bash 或 sh + shell脚本的相对路径或绝对路径(脚本可以不具有可执行权限+x)。

[root@centos7 tmp]# /bin/sh ./test.sh
Hello World
[root@centos7 tmp]# /bin/bash ./test.sh
Hello World
[root@centos7 tmp]# bash ./test.sh
Hello World
[root@centos7 tmp]# sh ./test.sh
Hello World

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

这两种写法在本质上是一样的:

  • 第一种写法给出了Bash的绝对路径,会直接运行 Bash 解释器;
  • 第二种写法通过 bash 命令找到 Bash 解释器所在的目录,然后再运行,只不过多了一个查找的过程而已。

5.3 在当前进程中运行 Shell脚本

source 是 Shell 内置命令的一种,它会读取脚本文件中的代码,并依次执行所有语句。你也可以理解为,
source 命令会强制执行脚本文件中的全部命令,而忽略脚本文件的权限。

source 命令的用法为:

source shell脚本的相对路径或绝对路径
# 也可以简写为:
. shell脚本的相对路径或绝对路径

两种写法的效果相同。对于第二种写法。注意:点号.和文件名中间有一个空格。

[root@centos7 ~]# source /tmp/test.sh
Hello World
[root@centos7 ~]# . /tmp/test.sh
Hello World

不管使用哪一种方式,如果找不到指定的解析器解析就使用默认解析器解析。

6、Shell 注释

(1)单行注释

以 # 开头的行就是注释,会被解释器忽略。

#####  开始 #####
#
#
# 这里可以添加脚本描述信息
#
#
#####  结束  #####

(2)多行注释

  • 1)使用 Here 文档

多行注释格式如下:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

:冒号是一个空命令,用于执行后面的 Here 文档,<<‘EOF’ 表示开启 Here 文档,COMMENT 是 Here 文档的标识符,在这两个标识符之间的内容都会被视为注释,不会被执行。

EOF 也可以换成其他符号:

: <<'COMMENT'
这是注释的部分。
可以有多行内容。
COMMENT

:<<!
注释内容...
注释内容...
注释内容...
!
  • 2)直接使用 : 号

也可以直接使用冒号 : 命令,并用单引号 ’ 将多行内容括起来。由于冒号是一个空命令,这些内容不会被执行。

格式为:: + 空格 + 单引号。

: '
这是注释的部分。
可以有多行内容。
'

二、变量使用

变量是用来存储数据值的名称。

Shell是一种弱数据类型的脚本语言,脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则。

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。

1、定义变量

定义变量时,变量名不加 $美元符号,格式如下:

#!/bin/sh

your_variable_name=value1
your_variable_name='value2'
your_variable_name="value3"

echo $your_variable_name

如果 value 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号;

如果 value 包含了空白符,那么就必须使用引号包围起来。

注意:

  • 赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。
  • 已定义的变量,可以被重新定义,即修改变量的值。

变量名的命名须遵循如下规则:

  • 只包含字母、数字和下划线: 变量名可以包含字母(大小写敏感)、数字和下划线 _,不能包含其他特殊字符。
  • 不能以数字开头: 变量名不能以数字开头,但可以包含数字。
  • 避免使用 Shell 关键字: 不要使用Shell的关键字(例如 if、then、else、fi、for、while 等)作为变量名,以免引起混淆。
  • 使用大写字母表示常量: 习惯上,常量的变量名通常使用大写字母,例如 PI=3.14。
  • 避免使用特殊符号: 尽量避免在变量名中使用特殊符号,因为它们可能与 Shell 的语法产生冲突。
  • 避免使用空格: 变量名中不应该包含空格,因为空格通常用于分隔命令和参数。

2、使用变量

变量引导符$:在变量前加美元符号,即可取该变量的值。

使用一个定义过的变量,只要在变量名前面加美元符号即可。

示例如下:

#!/bin/sh

your_variable_name="value"
echo $your_variable_name
echo ${your_variable_name}

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。推荐给所有变量加上花括号{ },这是个好的编程习惯。

比如下面这种情况:

#!/bin/sh

skill="Java"
echo "I am good at ${skill}Script"

如果不给skill变量加花括号,写成echo "I am good at s k i l l S c r i p t " ,解释器就会把 skillScript",解释器就会把 skillScript",解释器就会把skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

3、只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

示例如下:如果尝试更改只读变量,结果报错:

#!/bin/bash

your_variable_name=value1
readonly your_variable_name
your_variable_name=value2

echo $your_variable_name

在这里插入图片描述

4、删除变量

使用 unset 命令可以删除变量。语法:

unset your_variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

示例如下:

#!/bin/sh

your_variable_name="value1"
unset your_variable_name

echo $your_variable_name

在这里插入图片描述

– 求知若饥,虚心若愚。

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

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

相关文章

【C++游戏开发-03】贪吃蛇

文章目录 前言一、工具准备1.1游戏开发框架1.2visual studio2022下载1.3easyX下载1.4图片素材 二、逻辑分析2.1数据结构2.2蛇的移动2.3吃食物2.4游戏失败 三、DEMO代码实现四、完整源代码总结 &#x1f431;‍&#x1f680;个人博客https://blog.csdn.net/qq_51000584?typeblo…

【hoare基础版】快速排序算法(1)

目录 交换排序 QuickSort快速排序 Hoare整体思路 图解分析 ​ Hoare版本代码 总代码 时间复杂度 交换排序 基本思想&#xff1a;所谓交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0c;交换排序的特点是&#xff1a;将键…

论文阅读:How Do Neural Networks See Depth in Single Images?

是由Technische Universiteit Delft(代尔夫特理工大学)发表于ICCV,2019。这篇文章的研究内容很有趣,没有关注如何提升深度网络的性能&#xff0c;而是关注单目深度估计的工作机理。 What they find&#xff1f; 所有的网络都忽略了物体的实际大小&#xff0c;而关注他们的垂直…

java调摄像头和人脸比对

我需要做一个功能&#xff0c;就是网站页面调用摄像头截图。现在由于要用java&#xff0c;就得研究用java怎么调用摄像头。顺带玩了一下人脸比对&#xff0c;资料有点少。 效果 采用javacv实现&#xff0c;先加Maven引用&#xff0c;后面把下载的包再独立引用不用Maven了 …

UI自动化测试篇 :webdriver+ant+jenkins自动化测试实践

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

OpenCV笔记2:鼠标事件实现绘制直线、矩阵、曲线

OpenCV 鼠标事件 创建窗口设置窗口大小鼠标事件监听 判断事件更新起始点和终点绘制线显示图片 打开背景图 """ 鼠标事件 down up move """ import cv2 import numpy as npWINNAME DRAWBOARD st_point (-1, -1) end_point (-1, -1)def draw…

【Unity】管道流动模拟Shader

【Unity】管道流动模拟Shader 抽象模拟管道介质流动的效果&#xff0c;使用顶点片元着色器。可以调整管线光泽&#xff0c;颜色&#xff0c;流动方向&#xff0c;透明度&#xff0c;流动体粗细&#xff0c;流动速度和横断面。 实现效果 Demo效果 Demo下载地址 管线光泽调整 …

proteus8.15图文安装教程

proteus8.15版本可以用STM32系列单片机来进行仿真设计&#xff0c;比7.8版本方便多了&#xff0c;有需要的朋友们可以在公众号后台回复 proteus8.15 获取软件包。 1、下载好软件包&#xff0c;解压如下&#xff0c;右键proteus8.15.sp1以管理员身份运行。 2、第一次安装&#x…

【蓝桥杯单片机入门记录】独立按键

目录 一、键盘、微动开关概述 二、按键工作原理 &#xff08;1&#xff09;按键构成 &#xff08;2&#xff09;&#xff08;蓝桥杯开发板&#xff09;独立按键电路图&#xff08;非实际&#xff0c;参考理解&#xff09; &#xff08;3&#xff09;独立按键工作原理 三、…

【J1939】一、概述,协议基础

文章目录 1. 背景2. 要点3. J1939帧细节3.1 协议数据单元(Protocol Data Unit,PDU)3.2 参数组编号(PGN)3.3 可疑参数编号(Suspect Parameter Number,SPN)参考1. 背景 J1939是一种用于商用车辆的通信协议,它定义了一套车辆电子控制单元之间进行数据通信的规范。J1939协议…

OpenAI 发布文生视频模型 Sora,普通人应该怎么做才能利益最大化?

原文链接&#xff1a; OpenAI 发布文生视频模型 Sora&#xff0c;普通人应该怎么做才能利益最大化&#xff1f; 自从 2022 年 11 月 30 日 ChatGPT 发布之后&#xff0c;每次 OpenAI 再发布新功能都跟过年一样&#xff0c;那叫一个热闹。 包括 GPT 4.0&#xff0c;GPT Store&…

滚雪球学Java(65):深入理解Java中的Map接口:实现原理剖析

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

2024年单服务器部署Mongodb三节点副本集自动化部署脚本

该脚本是为了方便自己学习和工作中部署服务器从而节省时间进行编写&#xff0c;目前能正常部署&#xff0c;创建集群&#xff0c;管理员用户&#xff0c;以及连接都没问题&#xff0c;但是没有开启验证&#xff0c;后续找时间补充。 完整的教程请参考一下我写的技术文章。 20…

十六进制数

1.做一个收电费程序&#xff0c;要求输入使用的电的度数&#xff08;整数&#xff09;以及电费单价&#xff08;实数&#xff09;&#xff0c;输出总的用电费用。 2.提示并输入一个小写字母数据&#xff0c;输出其对应的ASCII值&#xff0c;以及该小写字母对应的大写字母。 3.提…

软件测试工程师linux学习之系统层面相关命令总结

1 linux系统重启和关机的命令 重启命令&#xff1a;reboot 关机命令&#xff1a;shutdown 这两个命令一般很少用到&#xff0c;我们了解即可。 2 查看日志信息命令 什么是日志&#xff0c;日志就是一个一个普通的文本文件&#xff0c;文件里面记录的是软件运行过程中的信息…

市场复盘总结 20240221

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 33% 最常用…

搜维尔科技:用于运动科学的 OptiTrack,范围标记、步态捕捉!

OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程&#xff0c;为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。 对所有主要数字测力台、EMG 和模拟设备的本机即插即用支持为研究人员提供了在 Visual3D、MotionMonitor、MATLAB 和其他第三方生物力学软件包中进…

MySQL数据库基础(十二):子查询(三步走)

文章目录 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 二、子查询的使用 三、总结 子查询&#xff08;三步走&#xff09; 一、子查询&#xff08;嵌套查询&#xff09;的介绍 在一个 select 语句中,嵌入了另外一个 select …

如何使用Coded UI Test对Webpage进行自动化测试

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

2024 年了,如何 0 基础开始学习 Vue ?

最近 5 个月&#xff0c;我都在忙着构建我的第一开源项目 HexoPress&#xff0c;这个项目是使用 Electron Vue 3 TypeScript 等技术实现的&#xff0c;一方面&#xff0c;我真的很需要一款合自己心意的博客编辑器&#xff0c;另一方面&#xff0c;我也是真心想学习 Electron …