【Linux】Shell编程

Shell编程

目录

  • Shell编程
    • 1.shell基础
      • 1.输入重定向 & 输出重定向
      • 2.管道
      • 3.特殊字符
        • (3.1)通配符
        • (3.2)引号
        • (3.3)注释符(#)
      • 4.别名
      • 5.命令历史`history`
    • 2.Shell脚本
      • Shell脚本的执行方式
        • (1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。
        • (2)sh shell脚本名
        • (3). shell脚本名
    • 3.shell变量
      • 1.用户自定义变量
        • (1.1)定义
        • (1.2)清除变量
      • 2. 环境变量
        • (2.1)常用环境变量
        • (2.2)查看环境变量
      • 3. 位置变量
      • 4.特殊变量
    • 4.shell编程基础
      • 1.shell脚本的输入/输出
        • (4.1)输入命令
        • (4.2)输出命令
        • (4.3)export命令
          • export的语法:
      • 2.shell的逻辑运算
        • (2.1)条件测试
        • (2.2)逻辑运算
      • 3.shell的算术运算
      • (1)使用expr命令
      • (2)使用shell扩展$((expression))
      • (3) let命令
    • 5.shell的控制结构
      • 1.if语句
      • 2.elif语句
      • 3.case语句
      • 4.for语句
      • 5.while语句 & until语句
      • 6.break和continue语句
        • (1) break命令
        • (2) continue命令
    • 6.shell函数
      • 1.函数定义
      • 2 函数调用
      • 3.带参数的shell函数如何实现
  • 参考

1.shell基础

1.输入重定向 & 输出重定向

输入重定向 : command [参数] < 文件名
输出重定向 : command [参数] > 文件名

输出重定向追加 : command [参数] >> 文件名
在源文件的内容后面追加

2.管道

Shell使用管道将一个命令的输出直接作为另一个命令的输入
通过使用管道符 ‘|’ 来建立一个管道:
command_a [参数] | command_b [参数]

3.特殊字符

(3.1)通配符

通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。

  • *代表任何字符串(包括0个)
  • ?代表任何单个字符
  • [] 代表指定的一个字符范围,只要文件名中 [] 位置处打字符在 [] 中指定的范围之内,那么这个文件名就与这个模式串匹配。
(3.2)引号
  • 单引号('): 由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后也会失去原有意义,而只作为普通字符解释。
  • 双引号("): 由双引号括起来的字符,除“$”、“\”、“’”、和“””这几个字符仍是特殊字符并保留其特殊功能外,其余字符作为普通字符对待。
  • 反引号(`): 反引号(`)括起来的字符串被shell解释为命令,在执行时,shell首先执行该命令,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。
string = "current directory is `pwd`"
(3.3)注释符(#)

4.别名

(4.1)命令别名通常是其他命令缩写,用来减少键盘输入。命令格式为:
alias new-name = 'original-command'

(4.2)取消别名:
unalias new-name

(4.3)不加参数的alias命令执行结果将显示当前系统中定义的所有命令别名

5.命令历史history

(5.1)通过history命令可以对当前系统中执行过的所有shell命令进行显示

(5.2)若想重复执行命令历史中指定的命令,可使用如下格式:

!命令编号

(5.3)环境变量HISTSIZE的值保存历史命令记录的总行数,该值的范围正常情况下是100~1000,当从shell中退出时,最近执行的命令将保存在HISTFILE变量指定的文件中。

HISTSIZE和HISTFILESIZE的区别:

  • HISTFILESIZE: 定义了在 .bash_history 中保存命令的记录总数.
  • HISTSIZE: 定义了 history 命令输出的记录数.

2.Shell脚本

Shell脚本是用shell命令编写的文件,也称为shell script。与结构化程序不同,shell不需要编译成目标程序,也不需要链接成可执行的目标码,shell是按行一条接着一条地解释并执行shell脚本中的命令。

Shell脚本的执行方式

  • (1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。
chomd u+x file_name
./filename
  • (2)sh shell脚本名
sh filename
  • (3). shell脚本名
. filename

3.shell变量

在shell脚本中也可以使用变量,一个变量就是内存中被命名的一块存储空间。

  • 一个Shell变量的名字可以包含数字,字母和下划线,变量名的开头只准许是字母和下划线。变量名中的字母是大小
    写敏感的
  • 变量名在理论上的长度没有限制。
  • 在shell编程中可以使用四种变量:用户自定义变量、环境变量、位置变量和特殊变量。

1.用户自定义变量

(1.1)定义

注意:如果字符串里包含空格,就必须用引号把它们括起来。还要注意在等号两边不能有空格。
无论何时想要获取变量内容,必须在它前面加$字符。

var_name=hello
echo $var_name
(1.2)清除变量

设置的变量不需要时可以清除,清除变量格式如下:

unset variable-name

2. 环境变量

  • 当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化,这就是环境变量
  • 它决定了用户的工作环境,通常用大写字母作为变量名,以便把它们和用户在脚本程序里定义的变量区分开来。
  • 环境变量的值在系统的配置文件中设置,用户可对其进行修改
(2.1)常用环境变量

在这里插入图片描述

(2.2)查看环境变量
env

3. 位置变量

如果脚本程序在执行时带有参数,就会创建一些额外的变量,这些额外的变量因跟变量所在命令行位置有关,因此被称为位置变量或位置参数。

  • shell提供的位置变量有$0、​$1、​$2、$3、$4、$5、$6、$7、$8、
    $9。

  • 这10个位置变量在shell脚本执行时用于存放shell脚本名及参数。
    其中位置变量**$0存放脚本名**,$1、$2、$3、$4、$5、$6、$7、$8、$9存放从左至右的命令行上的参数。

  • 当命令行上命令参数超过9个时,shell提供了shift命令可以把所有
    参数变量左移一个位置,使$2变成$1,$3变成$2,依此类推。

    • 使用格式如下:shift [n]
    • 其中n表示向左移动参数的个数,默认值为1。

4.特殊变量

shell中有一些变量是系统定义的,有特殊的含义,变量值由系统指定,被称之为特殊变量:

  • $#:表示传递给脚本的实际参数个数
  • $$:当前shell脚本的进程号
  • $*:位置参数的值,各个参数之间用环境变量IFS中定义的字
    符分隔开。
  • $@:也表示位置参数的值,它不使用IFS环境变量,所以当IFS为空时,参数值不会结合在一起。
  • $!:上一个后台命令的进程号。
  • $?:执行最后一条命令的退出状态。

4.shell编程基础

1.shell脚本的输入/输出

(4.1)输入命令
read var
输入的内容...
echo $var
输出 输入的内容
(4.2)输出命令
  • echo默认情况下是换行标准输出语句。
  • echo输出多个空格时必须用单引号括起
(4.3)export命令

export命令可将在shell脚本中定义的变量导出到子shell中,并使之在子shell中有效。

export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。

  • export命令可用于显示或设置环境变量。
  • export命令的效果仅限于当前登录终端。
export的语法:
export [-fnp] [变量名]=[变量设置值]

参数说明:

  • -f:代表[变量名称]中为函数名称。
  • -n:删除指定的变量;实际未删除,只是不会输出到后续指令的执行环境中。
  • -p:显示所有的shell赋予子程序的环境变量。

实例1:显示当前所有的环境变量

$ export -p

实例2:设置环境变量

$ export PATH=$PATH:/home/dabai/test/bin

2.shell的逻辑运算

所有程序设计语言的基础是对条件进行测试判断,并根据测试结果采取不同的操作

(2.1)条件测试

两种条件测试命令,语法格式如下:

  • test 条件表达式
  • [ 条件表达式 ]

注意:使用第二种方法进行条件测试时,必须在[ ]前后保留空格,否则shell提示error。

三种测试类型:

  • 字符串比较

在这里插入图片描述

  • 算术比较
    在这里插入图片描述

  • 文件条件测试
    在这里插入图片描述

(2.2)逻辑运算

在进行条件判断时,shell提供了复杂的逻辑运算,分别是:AND运算和OR运算

  • AND运算,运算符为$$,语法格式为:statement1 && statement2 && statement3
  • OR运算,OR允许持续执行一系列命令直到有一条命令成功为止,其后的命令将不再被执行。运算符为:||

3.shell的算术运算

bash提供了3种方法对数值数据进行算术运算:

  • (1)使用expr命令
  • (2)使用shell扩展$((expression))
  • (3)使用let命令

(1)使用expr命令

expr命令将它的参数当作一个表达式来求值。语法格式:

expr experssion

注意:在使用expr时,运算符前后要有空格,且乘法要用
“\”转义,即“*”的形式。

(2)使用shell扩展$((expression))

该命令用于计算一个expression并返回它的值。

a=2 b=3
echo "the result of a+b is $((a+b))"

(3) let命令

用来求算术表达式的值,如果最后表达式的值为0,let命令返回1;否则返回0。语法格式为:

let experssion

注意:使用let命令时,变量前的$不是必须的,乘法也
不需转义使用

5.shell的控制结构

1.if语句

if condition
thenstatements
elsestatements
fi
if condition ; thenif condition ; thenif condition ; thenstatementsfifi
fi
if condition1 ; thenstatements
elif condition2 ; thenstatements
elif condition3 ; thenstatements……
elsestatements
fi

2.elif语句

if condition1
thenstatements
elif condition2
thenstatements
elif condition3
thenstatements……
elsestatements
fi

3.case语句

case variable inpattern1) statements;;pattern2) statements;;……patternn) statements;;*) statements;;
esac

实例(根据数字输出星期几):

#!/bin/bash
echo "please enter the number of the week:"
read number
case $number in
1) echo "Monday";;
2) echo "Tuesday";;
3) echo "Wednsday";;
4) echo "Thursday";;
5) echo "Friday";;
6) echo "saturday";;
7) echo "Sunday";;
*) echo "your enter must be in 1-7.";;
esac
  • case支持合并匹配模式,即在每一个模式中,可以使用通配符逻辑符号
#!/bin/bash
echo " abc is the user's name? please answer yes or no"
read name
case "$name" in
y|Y|yes|YES) echo "hello abc!";;
n*|N*) echo "abc isn't the user's name?";;
*) echo "sorry,your input isn't recognized.";;
esac
exit 0
  • 在case结构中,每个分支模式可以执行多条命令
#!/bin/bash
echo " abc is the user's name? please answer yes or no"
read name
case "$name" iny|Y|yes|YES)echo "hello abc!"echo "yes!";;n*|N*)echo "abc isn't the user's name?"echo "no!";;*) echo "sorry,your input isn't recognized."echo "please answer yes or no"exit 1;;
esac
exit 0

4.for语句

for variable in values
dostatements
done

5.while语句 & until语句

while condition 
dostatements
done

until语句与while语句一样,都是循环语句,但处理方式正好相反,即当判断条件为真时,循环停止:

until condition
dostatements
done

6.break和continue语句

和C语言基本一致。

(1) break命令

break命令的功能是在控制条件未满足之前,跳出for、while或until循环。

(2) continue命令

使for、while或until循环跳到下一次循环继续执行,循环变量取循环列表中的下一个值。

6.shell函数

1.函数定义

语法格式:

function_name ( ) {statements
}

2 函数调用

通常将函数看成是脚本中的一段代码,在使用函数前必须先定义该函数,使用时利用函数名直接调用。调用也和编程语言类似。

3.带参数的shell函数如何实现

  • 1.在shell中,向函数传递参数是使用位置参数来实现的。
  • 2.指定位置参数的值除了在脚本运行时传入位置参数外,还可通过内置命令set命令给脚本指定位置参数,一旦使用set设置了传入参数的值,脚本将忽略运行时传入的位置参数,实际上是被set命令重置了位置参数的值。

使用 set 命令修改位置参数(即脚本参数 $1$2 等)。例如:

set -- arg1 arg2 arg3
或者
set arg1 arg2 arg3

$1 的值将是 “arg1″,$2 的值将是 “arg2″,依此类推。

参考

  1. 【export】Linux中export命令介绍,三种方法设置环境变量
  2. shell编程之带参数的函数
  3. Linux set命令详解(Linux修改变量值的set命令)

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

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

相关文章

STM32控制JQ8400语音播报模块

时间记录&#xff1a;2024/2/7 一、JQ8400引脚介绍 标示说明ONE LINE一线操作引脚BUSY忙信号引脚&#xff0c;正在播放语音时输出高电平RX串口两线操作接收引脚TX串口两线操作发送引脚GND电源地引脚DC-5V电源引脚&#xff0c;3.3-5VDAC-RDAC输出右声道引脚DAC-LDAC输出左声道…

机器学习:分类决策树(Python)

一、各种熵的计算 entropy_utils.py import numpy as np # 数值计算 import math # 标量数据的计算class EntropyUtils:"""决策树中各种熵的计算&#xff0c;包括信息熵、信息增益、信息增益率、基尼指数。统一要求&#xff1a;按照信息增益最大、信息增益率…

mysql8.0 正值表达式Regular expressions (sample database classicmodels _No.5)

mysql8.0 正值表达式Regular expressions 准备工作&#xff0c;可以去下载 classicmodels 数据库资源如下 [ 点击&#xff1a;classicmodels] (https://download.csdn.net/download/tomxjc/88685970) 也可以去我的博客资源下载 https://download.csdn.net/download/tomxjc/8…

第二十六回 母夜叉孟州道卖人肉 武都头十字坡遇张青-Ubuntu 防火墙ufw配置

武松到县里投案&#xff0c;县官看武松是个汉子&#xff0c;就把诉状改成&#xff1a;武松与嫂一时斗殴杀死&#xff0c;后西门庆前来&#xff0c;两人互殴&#xff0c;打死西门庆。上报东平府。东平府尹也可怜武松&#xff0c;从轻发落&#xff0c;最后判了个&#xff1a;脊杖…

一条 SQL 更新语句是如何执行的?

之前你可能经常听 DBA 同事说&#xff0c;MySQL 可以恢复到半个月内任意一秒的状态&#xff0c;惊叹的同时&#xff0c;你是不是心中也会不免会好奇&#xff0c;这是怎样做到的呢&#xff1f; 我们先从一条更新语句讲起&#xff0c;首先创建一个表&#xff0c;这个表有一个主键…

百卓Smart管理平台 uploadfile.php 文件上传漏洞(CVE-2024-0939)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

零基础学Python(9)— 流程控制语句(下)

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。流程控制语句是编程语言中用于控制程序执行流程的语句&#xff0c;本节课就带大家认识下Python语言中常见的流程控制语句&#xff01;~&#x1f308; 目录 &#x1f680;1.while循环 &#x1f680;2.for循环 &#x1…

RCE(命令执行)知识点总结最详细

description: 这里是CTF做题时常见的会遇见的RCE的漏洞知识点总结。 如果你觉得写得好并且想看更多web知识的话可以去gitbook.22kaka.fun去看&#xff0c;上面是我写的一本关于web学习的一个gitbook&#xff0c;当然如果你能去我的github为我的这个项目点亮星星我会感激不尽htt…

STM32之定时器

一、简介 STM32F4xx系列共有14个定时器&#xff0c;其中2个高级定时器、10个通用定时器、2个基本定时器。下图 为各定时器及其功能。 图1.各定时器及其功能 二、定时器的计数模式 向上计数模式&#xff1a;计数器从0计数到自动加载值(TIMx_ARR)&#xff0c;然后重新从0开始…

17:定时器编程实战

1、实验目的 (1)使用定时器来完成LED闪烁 (2)原来实现闪烁时中间的延迟是用delay函数实现的&#xff0c;在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点 (3)本节用定时器来定一个时间&#xff08;譬如0.3s&#xff09;&#xff0c;在这个定时器定时时间内…

抽象springBoot报错

Failed to configure a DataSource: url attribute is not specified and no embedded datasource could be configured. 中文翻译&#xff1a;无法配置DataSource&#xff1a;未指定“url”属性&#xff0c;并且无法配置嵌入数据源。 DataSource 翻译&#xff1a;数据源 得…

The Back-And-Forth Method (BFM) for Wasserstein Gradient Flows windows安装

本文记录了BFM算法代码在windows上的安装过程。 算法原网站&#xff1a;https://wasserstein-gradient-flows.netlify.app/ github&#xff1a;https://github.com/wonjunee/wgfBFMcodes 文章目录 FFTWwgfBFMcodesMATLABpython注 FFTW 官网/下载路径&#xff1a;https://ww…

警惕钓鱼邮件,保护您的开发者账号

请警惕钓鱼邮件 钓鱼邮件经常冒充官方 Google Play 通信&#xff0c;以窃取敏感信息&#xff0c;并最终为了经济利益盗取开发者账号。 保护开发者免受钓鱼邮件侵害的提示&#xff1a; Google.com 是用于联系开发者的唯一合法电子邮件域名。我们不会通过电子邮件或实时聊天要求您…

【Linux系统学习】 4.Linux实用操作 上

Linux实用操作 1.各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrl c 命令输入错误&#xff0c;也可以通过快捷键ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1…

第十六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像质量评估

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列博文目录前言一、图像质量评估方法和相关函数的介绍二、均方误差示例代码三、峰值信噪比示例代码四、结构相似性指数示例代码五、视频质量评估示例代码六、OpenCV均方根误差计算示例代码七、OpenC…

Cilium CNI深度指南

Cilium是基于eBPF的功能强大的CNI插件&#xff0c;为云原生环境提供了强大的网络和安全支持。原文: Cilium CNI: A Comprehensive Deep Dive Guide for Networking and Security Enthusiasts! &#x1f313;简介 欢迎阅读为网络和安全爱好者提供的全面深入的指南&#xff01; 本…

【JavaEE】_传输层协议UDP与TCP

目录 1. 开发中常见的数据组织格式 1.1 XML 1.2 JSON 1.3 Protobuf 2. 端口号 3. UDP协议 4. TCP协议 4.1 特点 4.2 TCP报文格式 4.3 TCP可靠性机制 4.3.1 确认应答机制 4.3.2 超时重传机制 4.3.2.1 丢包的两种情况 4.3.2.2 重传时间 4.3.3 连接管理机制 4.3.3…

VSCode如何让先前打开的文件不被自动关闭,一直保持在标签栏里(关闭预览模式)

第一次接触VSCode-Huawei IDE编辑器&#xff0c;每次打开一个新的代码文件&#xff0c;旧的代码文件都会被自动关闭&#xff08;现在才知道是因为文件默认是以预览模式打开展示的&#xff09;。 那么如何才能让先前打开的文件一直保持在标签栏里呢&#xff1f; 我们需要去设置…

MySQL 升级脚本制作

当数据库更新字段后或添加一些基础信息&#xff0c;要对生产环境进行升级&#xff0c;之前都是手动编写sql&#xff0c;容易出错还容易缺失。 通过 Navcat 工具的数据库结构同步功能和数据同步功能完成数据库脚本的制作。 一、结构同步功能 1、选择 工具–结构同步&#xff1…

【项目技术点总结之三】使用Java生成复杂好看的word或pdf报告的解决方案

前言 项目中往往会遇到需要生成报告的场景&#xff0c;不管是简单报告还是复杂报告&#xff0c;其实都需要找很多资料去尝试&#xff0c;本文会提出几种个人完美解决报告生成的解决方案&#xff0c;而且会提出几个失败但是能生成报告的设想&#xff0c;当然都是踩过坑的&#…