2025年shell编程基本步骤(shell编程技巧)

shell编程基本步骤(shell编程技巧)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> 

讯享网

到新公司之后,发现好多地方需要使用shell来编写一些简单的程序来提升自己的工作效率,因此专门B站上查看视频(尚硅谷的视频),在这里学习总结下shell编程。

shell是一个命令行解释器,它接收应用程序或用户的命令,然后调用操作系统内核。
在这里插入图片描述
讯享网
shell还是一个相当强大的编程语言,易编写,易调试,灵活性强。

1.脚本格式

脚本格式以#!/bin/bash开头(指向解释器)

2.第一个shell脚本,helloworld.sh,输出helloworld!

在这里插入图片描述
在这里插入图片描述

3.执行方式

方式一:sh 或 bash + 相对或绝对的文件路径(不需要 +x)
方式二:直接输入脚本的相对或绝对路径(需授可执行权限 +x)
方式三:在脚本的路径前面,使用一个 . 或一个source (这种方式不同于以上2种,以上两种运行时会嵌套子shell,这个不会嵌套,就在本环境运行,开子shell与不开子shell的区别在于,环境变量的继承关系,如在子shell中设置的当前变量,父shell中是不可见的 )

4.变量

- 4.1系统预定义变量

a.常用的系统变量(这里大多数都是写全局的环境变量)
\(HOME、\)PATH、\(SHELL等、\)PWD

- 4.2 自定义变量

a.基本语法:
(1)定义变量:变量名=变量值, 注意:=前后不能有空格
(2)撤销变量:unset 变量名
(3)申明静态变量:readonly 变量,注意:不能unset
b.变量定义的规则:
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写
(2)等号两侧不能有空格
(3)在bash中,默认变量都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或者单引号给括起来。
c.案例实操:
(1)下图中设置的变量时局部变量(比如,在当前环境设置后,在子bash中就访问不到)
在这里插入图片描述
(2)设置为全局变量
步骤1:先设置局部变量
步骤2:export 变量 注:意思就是把父shell中的变量导出变成一个全局变量
注意:子bash中更改的的全局变量,只在子bash中有效,退出子bash后无效
在这里插入图片描述

- 4.3特殊变量

a.位置参数:\(n&#xff1a;</strong><br /> <strong>&#xff08;1&#xff09;基本语法&#xff1a;</strong><br /> \)n(功能描述:n为数字,\(0代表脚本名称&#xff0c;\)1-\(9代表一到九个参数&#xff0c;十以上的要用大括号包含\){10})
(2)实操案例
在这里插入图片描述
b.参数个数:\(#</strong><br /> <strong>&#xff08;1&#xff09;基本语法&#xff1a;</strong><br /> \)#(获取所有输入参数的个数,常用于循环,判断参数个数是否正确以及加强脚本的健壮性)
(2)实操案例
在这里插入图片描述
c.获取参数:\(* 和 \)@
(1)基本语法
\(* &#xff1a;这个变量代表命令行中所有的参数&#xff0c; \)*把所有的看成一个整体
\(&#64;&#xff1a;这个变量代表命令行中所有的参数&#xff0c;不过\)@把每个参数区分对待
(2)案例实操
在这里插入图片描述
在这里插入图片描述

  • d.返回状态:\(?</strong><br /> <strong>&#xff08;1&#xff09;基本语法</strong><br /> \)?:最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。
    (2)案例实操
    在这里插入图片描述

5.运算符

(1)基本语法
\(((运算式)) 或 \)[运算式]
(2)案例实操
在这里插入图片描述

6.条件判断

(1)基本语法
a.test condition
b.[ condition ] 注意:condition前后要有空格
注意:1.条件非空返回true,否则返回false;2.记得加空格,不然程序会认为是一个值
在这里插入图片描述
c.常用判断条件
(1)两个整数之间比较

  • -eq:等于(equal)
  • -ne:不等于(not equal)
  • -lt:小于(less than)
  • -le:小于等于(less equal)
  • -gt:大于(greater than)
  • -ge:大于等于(greater equal)
    注:如果四字符串之间的比较,用“=“判断相等,用”!=”判断不等
    (2)按照文件权限进行判断
  • -r:有可读权限(read)
  • -w:有可写权限(write)
  • -x:有可执行权限(execute)
    (3)按照文件的类型进行判断
  • -e:文件存在(existence)
  • -f:文件存在且是一个常规的文件(file)
  • -d:文件存在且是一个目录(directory)
    (4)多条件判断
  • &&:表示前一个命令执行成功时,才执行后一条命令
  • ||:表示上一条命令失败后,才执行下一条命令
  • -a:即all同&&,但是&&不能在 [] 中使用,示例:[ \(age -gt 18 -a \)age -lt 35 ]
  • -o:即or同||,但是||不能在 [] 中使用,示例:[ \(age -gt 18 -o \)age -lt 35 ]

[ … ] && … || … 其实就是if…else…语句了

d.案例实操
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7.流程控制(重点)

- 7.1、if判断(双分支的逻辑结构,二叉树)

a.基本语法
(1)单分支

讯享网

(2)多分支

 

b.案例实操
在这里插入图片描述

- 7.2、case语句(多分支的逻辑结构,多叉树)

a.基本语法
case \(变量名 in<br /> “值1”)<br /> 如果这个值等于值1&#xff0c;则执行程序1<br /> ;;<br /> “值2”)<br /> 如果这个值等于值2&#xff0c;则执行程序2<br /> ;;<br /> …省略其它分支…<br /> <em>)<br /> 如果变量的值都不是以上的值&#xff0c;则执行此程序<br /> ;;<br /> esac<br /> <em><strong>注意事项&#xff1a;</strong></em><br /> &#xff08;1&#xff09;case行尾必须为单词&#34;in&#34;&#xff0c;每个模式必须以右括号&#34;)“结束。<br /> &#xff08;2&#xff09;双分号”;;“表示命令序列结束&#xff0c;相当于java中的break<br /> &#xff08;3&#xff09;最后的”</em>&#34;表示默认模式&#xff0c;相当于java中的default<br /> <strong>b.案例实操</strong> <img src="https://i-blog.csdnimg.cn/blog_migrate/2f528d796e92fc28f9de1f1da1cf3f95.png" alt="在这里插入图片描述" /></p> <h5>- <strong>7.3、for循环</strong></h5> <p><strong>a.基本语法1</strong><br /> for (( 初始值;循环控制条件;变量变化 ))<br /> do<br /> 程序<br /> done</p> <p><strong>b.案例实操1</strong><br /> 注意&#xff1a;双小括号(( ))中就可以直接使用数学中的运算表达式&#xff0c;如&#xff1a;&lt;&#61;<br /> <img src="https://i-blog.csdnimg.cn/blog_migrate/a0a5e4b00a5ffa453b7fb15b77c41a45.png" alt="在这里插入图片描述" /></p> <p><strong>c.基本语法2</strong><br /> for 变量 in 值1 值2 值3<br /> do<br /> 程序<br /> done<br /> <strong>d.操作实例2</strong><br /> <img src="https://i-blog.csdnimg.cn/blog_migrate/56ed1d0d2cd2d4a5f01ed6ca0a6e5e05.png" alt="在这里插入图片描述" /><br /> 增强for循环<br /> <img src="https://i-blog.csdnimg.cn/blog_migrate/2597ee251d95e88467fb19f79.png" alt="在这里插入图片描述" /></p> <h5>- <strong>7.4、while循环&#xff08;条件判断循环&#xff09;</strong></h5> <p><strong>a.基本语法</strong><br /> while [ 条件判断式 ]<br /> do<br /> 程序<br /> done.<br /> <strong>b.案例实操</strong></p> <p><img src="https://i-blog.csdnimg.cn/blog_migrate/d09a7ae146a5cc03b96a33738c8a8790.png" alt="在这里插入图片描述" /><br /> 另一种写法&#xff1a;使用内嵌函数let</p> <pre></pre> <h4>8.read读取控制台输入</h4> <p><strong>a.基本语法</strong><br /> read (选项) (参数)<br /> 选项&#xff1a;</p> <ul><li>-p&#xff1a;指定读取值时的提示符</li><li>-t&#xff1a;读取超时时间&#xff08;超时退出&#xff09;<br /> 参数&#xff1a;</li><li>变量&#xff1a;指定读取值的变量名<br /> <strong>b.按理实操</strong><br /> <img src="https://i-blog.csdnimg.cn/blog_migrate/f20b6d3f610d16b43ccb4e0a96cb9c47.png" alt="在这里插入图片描述" /></li></ul> <h4>9.函数</h4> <h5>- 9.1、系统函数</h5> <h6>- 9.1.1、basename</h6> <p><strong>&#xff08;1&#xff09;基本语法</strong><br /> basename [string/pathname] [suffix] &#xff08;功能描述&#xff1a;basename命令会删掉所有前缀&#xff0c;包括最后一个(&#39;/&#39;字符)&#xff0c;然后将字符显示出来&#xff09;<br /> basename可以理解为获取路径里的文件名称<br /> 选项&#xff1a;<br /> suffix为后缀&#xff0c;如果suffix被指定了&#xff0c;basename会将pathname或string中的suffix去掉。<br /> <strong>&#xff08;2&#xff09;案例实操</strong><br /> 调用系统函数&#xff1a;\)(函数名 参数)
在这里插入图片描述
在这里插入图片描述

- 9.1.2、dirname

(1)基本语法

(2)案例实操
在这里插入图片描述
在这里插入图片描述

- 9.2、自定义函数

a.基本语法
[function] funname[()]
{
Actiion;
[return int;]
}
b.经验技巧

  1. 必须在调用之前先申明函数,先申明函数,shell脚本是逐行运行(解释性语言)。不会像其它语言一样先去编译。
  2. 函数返回值,只能通过$?系统变量获得,可以显示加return返回,如果不加,将以最后一条命令运行结果作为返回值。return后跟数值0-255

c.案例实操
在这里插入图片描述

10.综合应用案例-归档文件

讯享网

在这里插入图片描述
然后使用crontab可以定制执行
在这里插入图片描述

小讯
上一篇 2025-04-18 08:13
下一篇 2025-06-08 21:35

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/156990.html