【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脚本的执行方式
chomd u+x file_name
./filename
sh filename
. 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″,依此类推。
参考
- 【export】Linux中export命令介绍,三种方法设置环境变量
- shell编程之带参数的函数
- Linux set命令详解(Linux修改变量值的set命令)
相关文章:

【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脚本名(…...

斯巴鲁Subaru EDI需求分析
斯巴鲁Subaru是日本运输集团斯巴鲁公司(前身为富士重工)的汽车制造部门,以性能而闻名,曾赢得 3 次世界拉力锦标赛和 10 次澳大利亚拉力锦标赛。 斯巴鲁Subaru EDI 需求分析 企业与斯巴鲁Subaru建立EDI连接,首先需要确…...
golang 集成sentry:PostgreSQL
本文介绍通过 pgx库集成sentry, pgx 特点是速度快,可以完全控制,并且支持所有 postgres 数据类型。 pgx地址: https://github.com/jackc/pgx 最简单的接入方式是自定义一个logger, 然后注入到pgx, 完整示…...

ubuntu20.04 安装mysql(8.x)
安装mysql命令 sudo apt-get install mysql-server安装完毕后,立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…...
ChatGPT升级至GPT-4 Turbo:性能升级同时更为经济
ChatGPT升级至GPT-4 Turbo:性能升级同时更为经济 随着技术的进步,ChatGPT迎来了其最新的迭代版本——GPT-4 Turbo。这一最新版本不仅在性能上得到了显著提升,而且在成本效益上也更加引人注目。 性能提升 GPT-4 Turbo带来了诸多改进&#x…...

Android 粒子喷泉动效
一、前言: 在学习open gl es实现动效的时候,打算回顾了一下用普通的2D坐标系实现粒子效果和 open gl 3d 坐标系的区别,以及难易程度,因此本篇以Canvas 2D坐标系实现了一个简单的demo。 粒子动效原理: 粒子动效本质上…...

fast.ai 深度学习笔记(一)
深度学习 2:第 1 部分第 1 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-1-602f73869197 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,这…...
【机器学习】Ubuntu系统下CUDA驱动卸载及重装
目录 背景 驱动卸载 驱动安装 CUDA驱动安装 安装nvidia-smi 背景 这里包含显卡驱动和CUDA驱动,在如下场景下,我们需要卸载显卡驱动并重新安装。 在某些情况下需要对显卡驱动进行升级某些情况下(如重启,或者调整系统配置等&a…...

相机图像质量研究(8)常见问题总结:光学结构对成像的影响--工厂调焦
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

【MySQL】数据库基础 -- 详解
一、什么是数据库 存储数据用文件就可以了,为什么还要弄个数据库? 一般的文件确实提供了数据的存储功能,但是文件并没有提供非常好的数据(内容)的管理能力(用户角度)。 文件保存数据有以下几个缺点&…...

零基础学Python之整合MySQL
Python 标准数据库接口为 Python DB-API,Python DB-API为开发人员提供了数据库应用编程接口。 不同的数据库你需要下载不同的DB API模块,例如你需要访问Oracle数据库和Mysql数据,你需要下载Oracle和MySQL数据库模块。 DB-API 是一个规范. 它…...

股票均线的使用方法和实战技术,看涨看空的均线形态与案例教学
一、教程描述 本套教程讲解了14种均线的特殊形态,通过直观图形以及大量案例的教学,将深奥、繁琐的均线变得生动与具体,广大投资者在认真学习以后,可以学会均线的使用方法,掌握最强的均线应用实战技术。本套教程不仅适…...

服务器被黑,安装Linux RootKit木马
前言 疫情还没有结束,放假只能猫家里继续分析和研究最新的攻击技术和样本了,正好前段时间群里有人说服务器被黑,然后扔了个样本在群里,今天咱就拿这个样本开刀,给大家研究一下这个样本究竟是个啥,顺便也给…...

【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 🚀…...

3d渲染100农场如何使用?渲染100邀请码1a12
3d渲染农场通常用于电影、动画或视觉效果的渲染,本文以广受好评的渲染100农场为例,来讲解它的使用方法。 1、注册账号 前往渲染100官网(http://www.xuanran100.com/?ycode1a12)注册账号, 新用户注册记得填邀请码1a12,有30元大礼…...

【数据结构和算法】--- 基于c语言排序算法的实现(2)
目录 一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare法1.2.2 挖坑法1.2.3 前后指针法 1.3 快速排序优化1.3.1 三数取中法选key1.3.2 递归到小的子区间使用插入排序 1.4 快排非递归版 二、归并排序2.1 归并排序2.1.1 递归版2.1.2 非递归版 一、交换排序 基本思想:…...
ORACLE的 软 软 软 解析!
在海鲨数据库架构师精英群里,有位朋友说ORACLE 有 软软软解析. 就是把执行计划缓存在客户端里,从而避免去服务端找执行计划. 他给了个设置方法, Weblogic console->datasource->connectionPool Statement Cache Type >LRU Statement Cache Size100 CURSOR_NUMBER …...
【模板】k 短路 / [SDOI2010] 魔法猪学院
题目背景 注:对于 k k k 短路问题,A* 算法的最坏时间复杂度是 O ( n k log n ) O(nk \log n) O(nklogn) 的。虽然 A* 算法可以通过本题原版数据,但可以构造数据,使得 A* 算法在原题的数据范围内无法通过。事实上,…...
【Make编译控制 08】CMake动静态库
目录 一、编译动静态库 二、链接静态库 三、链接动态库 前情提示:【Make编译控制 07】CMake常用命令-CSDN博客 有些时候我们编写的源代码并不需要将他们编译生成可执行程序,而是生成一些静态库或动态库提供给第三方使用,所以我们需要用到…...

05 06 Verilog基础语法与应用讲解
05. 1. 位操作 计数器实验升级,设计8个LED灯以每个0.5s的速率循环闪烁(跑马灯) 1.1 方法1:使用移位操作符<<来控制led灯的循环亮灭 设计代码 Verilog中,判断操作的时候不加位宽限定是可以的,比如i…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...