【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…...

css2复合选择器
一.后代(包含)选择器(一样的标签可以用class命名以分别) 空格表示 全部后代 应用 二.子类选择器 >表示 只要子不要孙 应用 三.并集选择器 ,表示 代表和 一般竖着写 应用 四.伪类选择器(包括伪链接…...

新版MQL语言程序设计:键盘快捷键交易的设计与实现
文章目录 一、什么是快捷键交易二、使用快捷键交易的好处三、键盘快捷键交易程序设计思路四、键盘快捷键交易程序具体实现1.界面设计2.键盘交易事件机制的代码实现 一、什么是快捷键交易 操盘中按快捷键交易是指在股票或期货交易中,通过使用快捷键来进行交易操作的…...

数据结构之基数排序
基数排序的思想是按组成关键字的各个数位的值进行排序,它是分配排序的一种。在该排序方法中把一个关键字 Ki看成一个 d 元组,即 K1i,K2i,,Kdi 其中,0≤ Kji<r,i1~ n,j1~d。这里的r 称为基数。若关键字是…...

区间dp 笔记
区间dp一般是先枚举区间长度,再枚举左端点,再枚举分界点,时间复杂度为 环形石子合并 将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。 规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该…...

MySQL-SQL优化
文章目录 1. SQL性能分析1.1 SQL执行频率1.2 慢查询日志1.3 profile详情1.4 explain 2. SQL优化2.1 Insert 优化2.2 Group By 优化2.3 Order By 优化2.4 Limit 优化2.5 Count() 优化2.6 Update 优化 3. 拓展3.1 请你说一下MySQL中的性能调优的方法?3.2 执行 SQL 响应…...

详细了解ref和reactive.
这几天看到好多文章标题都是类似于: 不用 ref 的 xx 个理由不用 reactive 的 xx 个理由历数 ref 的 xx 宗罪 我就很不解,到底是什么原因导致有这两批人: 抵触 ref 的人抵触 reactive 的人 看了这些文章,我可以总结出他们的想法…...

使用Linux docker方式快速安装Plik并结合内网穿透实现公网访问
文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问,实现随时随地在任意设备上传或者…...

Redis Centos7 安装到启动
文章目录 安装Redis启动redis查看redis状况连接redis服务端 安装Redis 1.下载scl源 yum install centos-release-scl-rh2.下载redis yum install rh-redis5-redis 3. 创建软连接 1.cd /usr/bin 2. In -s /opt/rh/rh-redis5/root/usr/bin/redis-server ./redis-server 3. …...

「数据结构」二叉搜索树1:实现BST
🎇个人主页:Ice_Sugar_7 🎇所属专栏:Java数据结构 🎇欢迎点赞收藏加关注哦! 实现BST 🍉二叉搜索树的性质🍉实现二叉搜索树🍌插入🍌查找🍌删除 &am…...

可达鸭二月月赛——基础赛第六场(周五)题解,这次四个题的题解都在这一篇文章内,满满干货,含有位运算的详细用法介绍。
姓名 王胤皓 T1 题解 T1 题面 T1 思路 样例输入就是骗人的,其实直接输出就可以了,输出 Hello 2024,注意,中间有一个空格! T1 代码 #include<bits/stdc.h> using namespace std; #define ll long long int …...