Linux进阶之路———Shell 编程入门

引言

通过 Shell 编程的学习,铺平架构师道路上的一块大砖。

Shell 在Linux 系统中的定位如下所示:

一、第一个 Shell 脚本

我们通过一个简单的 Shell 脚本来感受一下。

在 Shell 中不需要加 “;” 结尾,通过 vim 可以进行 shell 的编程工作,并且一般建议为 shell 文件添加可执行权限。

更改权限之后,执行脚本:

另外如果没有可执行权限,还可以通过 sh 来执行:

一般在企业中,都是需要加上可执行权限的。

注意,本片文章后面的内容全部忽略 chmod 操作。

二、Shell 变量

Shell 变量分为系统变量和用户变量。

2.1 系统变量

系统变量指的是预先在 Linux 系统中定义好的变量(常量),如PATH 等。

另外,可以通过 set 命令来查看所有系统变量:

2.2 自定义变量

在 Shell 编程中,多数情况下会使用自定义变量。

基本语法:

1、赋值:变量名=值。注意,等号两边不能有空格,这是与其他编程语言有所区别的。

2、撤销变量:unset  变量名

3、声明静态变量:readonly  变量名=值 。 注意:静态变量不能 unset。

4、引用已定义的变量:$变量名     或     ${变量名}    。后者可以在连续的字符串中帮助 Shell 解释器区分变量名的边界。

5、变量名可以是字母、数字、下划线 的组合,且不能以数字开头。这与Java 的变量命名规则相同。

6、变量名一般习惯大写。

7、将命令返回值赋给变量:第一种:反引号:A=`ls -l`  ; 第二种 :$(ls -l) 。两种方式等价。

案例:定义一个 变量 A ,输出,然后 unset ,再输出:

案例:定义一个静态变量 B,查看 unset 的效果:

可以看到,readonly 类型的变量是不能 unset 的。

2.3 环境变量

可以自定义环境变量,供其他程序使用。

第一步:vim   /etc/profile

第二步:export  变量名=值          功能:将 Shell 变量输出为环境变量(或先定义变量,再 export $变量名)

第三步:source  /etc/profile         功能:让修改后的配置信息立即生效

第四步:echo  $变量名                功能:查询环境变量的值。

vim 打开 profile 文件,在文件最末尾(输入G),添加我们需要定义的环境变量 SAY_HELLO,保存并退出: 

然后刷新配置文件:source /etc/profile :

可以看到,变量可以被直接使用了,我们可以在其他的 Shell 文件中尝试使用刚刚定义的环境变量:

可以看到,可以使用。

2.4 多行注释

在 Shell 文件中使用     :<<!  xxxx  !     进行多行注释。

2.5 位置参数变量

当我们执行一个Shell 脚本的时候,如果希望获得命令行参数信息,可以通过位置参数变量。比如,我们执行 ./app.sh  100  200 ,这就是一个 Shell 的执行命令行,可以在 app.sh  中动态获得参数信息,即100 和 200。

常用的位置参数获取方式有:

$n   : n 为大于等0 的自然数,其中 $0 表示 shell 文件本身,$1 - $9  表示第一到第九个参数, 10 以上的参数需要写作 ${10}。

$*   :  表示命令行中的所有参数,注意,$* 把所有参数看做是一个整体。

$@ : 表示命令行中的所有参数,注意,$@ 把所有参数都区分对待。$* 和 $@ 这两者主要在循环语句的时候可以看出区别。

$#   : 表示命令行中所有参数的个数。

演示:在 HelloWorld.sh 中输出这些位置变量参数,然后观察结果:

2.6 预定义变量

预定义变量指的是 Shell 设计者事先已经定义好的变量,可以直接在 Shell 脚本中使用:

$$    表示当前进程的进程号(PID)

$!     表示后台运行的最后一个进程的进程号(PID)

$?    表示最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令执行正确;如果这个变量的值非 0 (具体是哪个数,由命令自己决定),则证明上一个命令执行不正确。

演示:首先,我们定义一个新的 Shell 脚本:myShell.sh,然后通过其他的 Shell 来执行它,并输出响应的预定义变量: 

myShell.sh:

HelloWorld.sh:

执行结果:

其中,在HelloWorld.sh  中的 &  符号,代表将Shell 脚本以后台的方式运行。

三、运算符

第一种:$((运算式))

第二种:$[运算式]

第三种:expr 运算式(注意,expr 运算符之间要有空格,因为乘号需要转义)

另外,还有一些常见的比较运算符:

=  字符串比较

-lt  小于

-le   小于等于

-eq  等于

-gt   大于

-ge  大于等于

-ne   不等于

四、Shell 条件判断

4.1 基本的 if 判断

基本语法:

if [ condition ]

注意,条件语句要与中括号之间有空格。

按照文件权限进行判断:

-r   有读的权限

-w   有写的权限

-x    有执行的权限

按照文件类型判断:

-f  文件存在 并且是一个常规文件

-e  文件存在

-d   文件存在,并且是一个目录

案例:实现一个Shell 程序,判断输入的参数,大于 60 ,则输出 “及格了”,如果小于 60,则输出“不及格”。

4.2 case 语句

基本语法:

case $变量 in
"值1")执行语句1;;
"值2")执行语句2;;
"值3")执行语句3;;
......
*)没有匹配项的执行语句;;
esac

case 语句的功能和所有其他开发语言一致,不过语法有些不同。

案例:当命令行参数是 1 时,输出 Mon,是 2 时,输出 Tues,其他数字,则输出 Other。

五、Shell 流程控制

5.1 for 循环

基本语法1:

for 变量 in 值1 值2 值3...
do执行语句
done

案例:打印命令行中的参数(使用 $*  和 $@并观察区别):

基本语法2:

for((初始值; 循环控制条件; 变量变化))
do执行语句
done

案例:从1 加到 100 ,然后输出显示:

5.2 while循环

基本语法:

while [ 条件判断 ]
do执行语句
done

案例:从命令行输入一个数字 n ,统计 从1 加到 n  的值是多少:

六、Shell 读取控制台输入

基本语法:

read  [选项]  变量名

选项及参数:

-p    指定读取值时的提示符

-t     指定读取值时等待的时间(秒),如果没有在指定时间内输入,则不再等待。

变量名:指定读取值的变量名

七、Shell 函数

Shell 编程和其他编程一样,同样存在系统函数,和自定义函数。其中有两个比较重要的系统函数:

7.1 系统函数

1、basename 函数

功能: 返回完整的路径最后 / 的部分,即获取文件的文件名。

基本语法:

basename [pathname] [suffix]

suffix 是后缀,可以用于除去文件名的后缀名。

2、dirname 函数

功能:返回完整路径最后 /  的前面的部分,常用于返回路径部分。

基本语法和 basename 完全一致。

7.2 自定义函数

基本语法:

[function]  函数名[()]
{执行语句[return int]
}

说明:Shell 函数不需要写任何参数, return 返回,如果不加,将以最后一条命令运行结果作为返回值。return 后面跟0 ~ 255 的数值。调用函数直接书写函数名称即可,函数的返回值在调用函数后,通过 $? 来获得。

另外,虽然 Shell 函数定义不需要定义参数,但是也是可以传入参数的,不过语法比较奇怪,在调用的时候,我们可以这样写:

同样也是可以的,但是注意,变量名要保持一致。也就是说,在 Shell 脚本文件中,不论是在哪里定义的变量,只要还在这个脚本文件中,就可以直接访问。上图也看到,我们在 readNum 函数中通过控制台,读入了两个数字 n1 和 n2 ,直接在twoSum 函数体中使用也是可以的。另外, readNum 没有返回语句,默认也是最后一行语句执行的结果。

 

综上,就是关于Shell 编程的入门知识,后面还会增加相关的文章,欢迎大家文末留言。

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

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

相关文章

Linux 实操———CentOS 6 安装配置 Oracle JDK 1.8

引言 本篇博客也属于Linux进阶系列&#xff0c;主要讲解如何在CentOS 6 下安装并配置 JDK 8。由于通过 yum 搜索的结果都是 openjdk&#xff0c;而目前企业中还是以 Oracle jdk 为主&#xff0c;因此&#xff0c;操作步骤这样的。 在Oracle 官网把 jdk 1.8 下载下来&#xff…

Linux 实操———CentOS 6 安装配置 Tomcat

引言 Linux下安装Tomcat。 一、下载、传输与解压 同《Linux 实操———CentOS 6 安装配置 Oracle JDK 1.8》一样&#xff0c;前期都是先在远程机上下载压缩包&#xff0c;然后通过远程终端&#xff0c;将压缩包放在 Linux 的 opt 目录下&#xff0c;然后解压。 下载地址是T…

Spring Boot 实用开发技巧————Eclipse 远程调试

引言 在之前的开发当中&#xff0c;都会进行本地项目启动&#xff0c;然后向本地服务发起请求来进行 Debug 调试代码&#xff0c;这也是开发人员最常见的调试操作。但是当项目逐渐成型&#xff0c;慢慢的将各个模块部署到服务器后&#xff0c;调试的手段可能就仅仅剩下查看执行…

Linux 实操———— Shell 远程执行命令

引言 目前&#xff0c;开发人员的部署方式是&#xff0c;将项目打包(Maven 打包) 然后将 生成的 jar 包等文件&#xff0c;通过Xshell 等终端工具手动传输到远程服务器上&#xff0c;然后再通过在终端执行远程服务器上的 shell 脚本来启动服务。 本篇博客聚焦这样一种解决方案…

Spring Boot 设置 ASCII banner 艺术字

引言 无意中看到Spring boot 项目的 resources 目录下有一个 banner.txt &#xff0c;打开一看&#xff0c;居然是ASCII 字符画。于是兴起&#xff0c;简单研究了一下。 Spring boot 可以加载 resources 目录下的 banner.txt 文件&#xff0c;将字符画在启动之初输出到日志或…

MySQL 基础 ———— 分组查询

引言 承接上一篇《MySQL 基础 ————高频函数总结》&#xff0c;本篇单独针对分组查询进行简单的总结和归纳&#xff0c;并为后续更为复杂的DQL 语句做好铺垫。 查询语句&#xff1a; SELECT AVG(salary) FROM teacher; 实际上是以全表的 salary 字段来求平均值。但是在实…

MySQL 基础 ———— 连接查询

引言 本篇文章承接《数据库与SQL语句》专栏&#xff0c;进入DQL的重要环节&#xff0c;可以说&#xff0c;这一部分的内容应该占据SQL语言的大部分使用场景。 本篇的连接查询知识&#xff0c;和后面的一些重要的查询知识总结&#xff0c;共同构成了在工作中80%的MySQL应用场景…

MySQL 基础 ———— 子查询

引言 承接《MySQL 基础 ———— 连接查询》&#xff0c;本文介绍和展示SQL中子查询的使用。 子查询是出现在其他语句中的select 语句&#xff0c;也称为内查询。外部的查询语句&#xff0c;称为主查询或外查询。 一、子查询的分类和支持的子句 按照子查询出现的位置&#…

MySQL 基础 ———— SQL语句的执行顺序与 LIMIT 子句

引言 到目前为止&#xff0c;已经总结了常见的SQL子句&#xff0c;包括 SELECT 、FROM、JOIN ... ON、WHERE、GROUP BY、HAVING、ORDER BY。 虽然SQL的书写顺序是固定的&#xff0c;但在MySQL引擎中执行的顺序并不完全和书写顺序一致。除了上述这些子句&#xff0c;下面将会介…

MySQL 基础———— UNION 联合查询

引言 联合查询与连接查询不同&#xff0c;通过UNION 关键字&#xff0c;我们可以将多个查询语句一同执行并将结果集展示出来&#xff0c;不涉及到任何关联关系。 UNION 的含义是“联合&#xff0c;并集&#xff0c;结合”&#xff0c;在MySQL中可以将多个查询语句的结果合并成…

MySQL 基础————常用数据类型

引言 从第一次学习mysql开始&#xff0c;不知道为什么MySQL的数据类型始终没有像Java 一样深入脑海&#xff0c;对某些数据类型的定义和用法&#xff0c;也并不清晰&#xff0c;这篇文章&#xff0c;就好好总结一番&#xff0c;将MySQL中几个常用的数据类型归纳一下。 一、类…

MySQL 基础 ———— SAVEPOINT 的应用

引言 savepoint 关键字用于在数据库事务中设置一个存储点&#xff0c;在一个较长的事务中暂存数据&#xff0c;如果在事务末尾执行回滚&#xff0c;可选择性的回滚到 savepoint 设置的暂存点。 本文承接上一篇博客《MySQL 基础 ————事务与隔离级别总结》&#xff0c;进一…

MySQL 基础 ———— 视图的应用与总结

引言 视图是一种虚拟表&#xff0c;和普通表的使用是一样的&#xff0c;视图的一大特点就是“临时性”&#xff0c;是通过表动态生成的数据&#xff0c;只保存SQL逻辑&#xff0c;不保存查询结果。 视图在实际生产中主要有两种应用场景&#xff1a; 1、多个地方用到同样的查…

MySQL 基础 ———— 变量

一、MySQL系统变量 系统变量是由系统提供&#xff0c;属于服务器层面。 系统变量分为&#xff1a;全局变量和会话变量。 全局变量一般要加 GLOBAL 关键字&#xff0c;例如在《MySQL 基础 ————事务与隔离级别总结》中提到的 GLOBAL TRANSACTION&#xff0c;就属于全局变量…

MySQL 基础 ———— 存储过程与函数

一、存储过程介绍 存储过程是一组预先编译好的SQL语句的集合&#xff0c;可理解成批处理语句。它的优点主要有以下几点&#xff1a; 1、提高代码的重用性&#xff1b; 2、简化操作&#xff1b; 3、减少了编译次数并且减少了和数据库服务器的连接次数&#xff0c;提高了效率…

MySQL 基础 ———— 流程控制结构

引言 MySQL 中的流程控制作为基础知识的最后一块拼图&#xff0c;显得并不是特别重要&#xff0c;而且&#xff0c;在实际生产开发中&#xff0c;也往往不需要通过它来进行程序的控制&#xff0c;那么为什么还要学习它呢&#xff1f;我认为有以下几点&#xff1a; 1、知识的完…

MySQL 高级 ———— MySQL逻辑架构图简介

引言 本篇文章介绍MySQL的逻辑架构图。 MySQL并不完美&#xff0c;但足够灵活&#xff0c;能够适应高要求环境。MySQL不仅可以嵌入到应用程序中&#xff0c;同时也可以支持数据仓库、内容搜索、和部署软件、高可用的冗余系统、在线事务处理系统等各种应用类型。 一、MySQL逻…

Java正则表达式总结

引言 正则表达式&#xff08;英文&#xff1a;regular expression&#xff09;是用于描述字符串规则的工具&#xff0c;是记录文本规则的代码。 它可以用来搜索、编辑、处理文本。现有编程语言都支持正则表达式的处理&#xff0c;但每种语言都有细微的差别。 在Java 中&…

Linux 实操 —— Linux 系统性能分析

引言 最近配合解决压测&#xff08;性能测试&#xff09;方面的问题&#xff0c;了解到了一些可以监控 Linux 系统性能指标&#xff0c;如CPU、IO、内存等的工具。 此篇博客主要讲解 Linux 系统监控的一些重点内容以及 sar 命令的使用。 一、Linux 性能分析聚焦 Linux 性能…

Java 动态代理解析

引言 本博客总结自《Java 编程思想》第十四章 一、实现第一个动态代理程序 代理是软件设计中重要的设计思想&#xff0c;它允许我们在调用实际操作之前或之后解耦式地编写额外的操作&#xff0c;而一旦不需要这些操作了&#xff0c;就可以轻易的移除它们。 浏览了《编程思想…