shell编程基础笔记

目录

echo改字体颜色和字体背景颜色

bash基本功能:

运行方式:推荐使用第二种方法

变量类型

字符串处理:

[条件判断:(使用echo $?来判断条件结果,0为true,1为false)](#条件判断:(使用echo $?来判断条件结果,0为true,1为false))

条件语句:

循环语句

特殊流程控制语句

read读取控制台输入

函数

数组:

切片


部分图片截取自【尚硅谷Linux系统管理教程(linux系统管理精讲)】https://www.bilibili.com/video/BV1ut411a7ro?vd_source=4aa5c9ca48e929b37821b89859f00208B仅供学习使用,感谢!

echo改字体颜色和字体背景颜色

bash 基本功能:

①。查看历史输入命令history,最大存储在磁盘1000条,可进入/etc/profile进行修改HISTSIZE=1000,进行扩充;

补充:可以使用上下箭头进行历史命令的切换,也可以使用"!历史命令行号"

②。命令改别名alias,进入/root/.bashrc可进行修改,使用source /root/.bashrc进行更新,可使用"unalias 别名"进行删除

加入--color=auto显示颜色

③。错误输出重定向追加保存:"错误命令 2>> 文件"(只能保存错误命令)

正确输出和错误输出同时重定向追加保存:" 命令**>>文件2>&1****"** / " 命令 &>> 文件 "

分别保存正确错误文件:" 命令**>>文件12>>文件2**"

④。多命令顺序执行:

1)。";" 顺序执行多命令并结果互不影响

2)。"&&" 前者正确,执行后者

3)。" || " 前者错误,执行后者

⑤。bash中其他特殊符号(重点注意)

''单引号,所见即所得,不能在单引号内再使用单引号。

""双引号,拥有"调用变量的值","引用命令","转义字符"的特殊含义,双引号可以嵌套单引号,但不能直接嵌套双引号或反引号。

`` 反引号,其括起来的内容是系统命令,可以调用系统命令将结果赋值给一个变量例如:a=`ls /root`

$() 和反引号作用一样,用来引用系统命令。(推荐使用)

() 用于一串命令执行时,()中的命令会在子shell中运行(相当于执行局部变量)

{} 用于一串命令执行时,{}中的命令会在当前shell中执行,也可以用于变量变形与替换 (相当于执行全局变量)

⑥。bash快捷键

查看系统所有快捷键:stty -a

修改系统快捷键:stty 关键字 快捷键

运行方式: 推荐使用第二种方法

①.bash/sh + 绝对/相对路径

②.赋予执行权限chmod +x 文件,以后可以直接用路径调用不需要加bash/sh(相对路径要加./)

③.脚本路径前加".空格"或者source

变量类型

①.预定义变量

$? 功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体实施那个数,有命令自己来决定),则证明上一个命令执行不正确

查看当前进程的进程号(PID) $! 后台运行的最后一个进程的进程号(PID ②。环境变量 常用系统变量$HOME ,$PWD,$SHELL,$USER 查看系统变量值:echo $HOME 1)。PATH:系统查找命令的路径 PATH变量的值是用":"分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报"命令没有发现"的错误 自已定义的脚本也可以通过将脚本复制到PATH变量定义的路径中,或者使用PATH="$PATH":/root/sh修改PATH变量的值进行叠加,就可以不输入路径而直接运行 2)。PS1变量:命令提示符设置 PS1,是用来定义命令行的提示符,可以按照我们自己的需求来定义自己喜欢的提示符,PS1支持以下这些选项 ![](https://i-blog.csdnimg.cn/direct/5665613bc921441c9e3e7ed929a812f6.png) 3)LANG语系变量 LANG变量定义了Linux系统的主语系环境,这个变量的默认值 ![](https://i-blog.csdnimg.cn/direct/d1fae0deec2e4494b9764dc4bb4e7614.png) 可以使用locale -a \| more来查看支持的语系 4)环境变量配置文件调用过程 ![](https://i-blog.csdnimg.cn/direct/356f15d31c9346908c42d15076bcf7e0.png) ③。位置参数变量 特殊变量 $n 功能描述:n为数字,$0代表脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10} $# 功能描述:获取所有输入参数个数,常用于循环 $\* 功能描述:这个变量代表命令行中的所有参数,$\*把所有的参数看成了一个整体 $@ 功能描述:这个变量也代表命令行中的所有参数,不过$@把每一个参数区分对待 举例 ![](https://i-blog.csdnimg.cn/direct/47b3ccac4e0e46a98273186196129801.png) ![](https://i-blog.csdnimg.cn/direct/0dd5568ce9ac452bbdbfda2765a96d2d.png) ④.自定义变量 基本语法: 定义变量:变量名=变量值,注意=前后不能有空格(定义变量不需要加$,调用变量需要给变量前加$) 撤销变量:unset 变量名 声明静态变量:readonly 变量,注意:不能unset 使用"export 变量(declare -x 变量)"可以把变量升级为全局(环境)变量,供其他变量使用(例如将父shell继承给子shell) 变量连接:变量="$变量"连接值 变量定义规则: 变量名称由字母,数字,下划线组成,不能以数字开头,环境变量建议大写 等号两侧不能有空格 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算 变量的值如果有空格,需要使用双引号和单引号括起来 ![](https://i-blog.csdnimg.cn/direct/ac614cfde9794f709e78691dd5a63723.png) ## **字符串处理:** ①。cut列提取命令 cut \[选项\] 文件名 选项: -d 分隔符:按照指定分隔符进行分列 -f 列号:提取第几列,一般与-d联用,**cut** **命令的默认分隔符为制表符** **tab** **键,不对空格支持** -c 字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为1)来进行字段提取。"n-"表示从第n个字符到行尾;"n-m"从第n个字符到第m个字符;"-m"表示从第一个字符到第m个字符。 ②。 Awk 列数表示直接为"$数字" 可以使用"-F 分隔符"来进行分割,注意引号的使用 ![](https://i-blog.csdnimg.cn/direct/c96a84a3eda84b8582f3c9dc0e865391.png) 1)。printf 输出 ![](https://i-blog.csdnimg.cn/direct/0ade45a3ec4a48898c1b0053e086ef7a.png) ![](https://i-blog.csdnimg.cn/direct/ed40a47640e94bd89d06072523ee6aaa.png) 2)。 awk基本使用 awk '条件1 {动作1} 条件2 {动作2}....' 文件名 (动作写在{}中,转义字符和字符串需要用""括起来, awk解决cut不能处理的空格问题) ![](https://i-blog.csdnimg.cn/direct/c540f9b02cd74dfe94e20f09362f0e5f.png) ![](https://i-blog.csdnimg.cn/direct/428bf390496643709afa41054b150aa5.png) ![](https://i-blog.csdnimg.cn/direct/4f38b8587702419885e98d78340ceb2c.png) ![](https://i-blog.csdnimg.cn/direct/b7111101ec1b4257962cc69c17f8c1e1.png) 3)awk内置变量 ![](https://i-blog.csdnimg.cn/direct/2eff5d4e8af94cc881f065756bb898dc.png) ![](https://i-blog.csdnimg.cn/direct/4c50fbad441d44778aa7c16064720830.png) ![](https://i-blog.csdnimg.cn/direct/2185f0ce379b42a7b0938a6ee6e972b4.png) 注意:当使用FS时,可能第一行没有起作用,可能是需要加BEGIN条件 ③。sed命令 列数表示直接为数字 sed命令主要是用来将数据进行选取,替换,删除,新增的命令 格式:sed \[选项\] '\[动作\]' 文件名 ![](https://i-blog.csdnimg.cn/direct/a348796bc18b477ab9302d10faf544c2.png) ![](https://i-blog.csdnimg.cn/direct/b4cc3218d0c947c7b3fc53d17baab336.png) ![](https://i-blog.csdnimg.cn/direct/f3e0bb9433bd44e1819984a700cdbc05.png) ![](https://i-blog.csdnimg.cn/direct/85a02b4f62c54b569f5c38f280420c14.png) 注意:1)如果想追加或插入多行数据,除最后一行外,每行的末尾都要加入"\\"代表数据未完结; 2)-d只有行删除,没有具体的字符串删除功能,可以使用s将字符串替换为空,即可达到删除字符串的效果 3)多条动作之间要用";"号或回车进行分割(一般与-e配合使用),当使用-e对多条命令进行编辑时,要与命令紧挨使用,中间不能有其他选项 4)指定行范围可以用","例如1,3表示第一行到第三行 ④。排序命令sort 格式:sort \[选项\] 文件名 ![](https://i-blog.csdnimg.cn/direct/1b6481b9beb14b74b341fb464176653c.png) 补充:-k 指定字段号,一般与-t搭配使用,当-t分割后可以选择指定字段号;"-k 3"表示从第三个字段到行尾排序 ⑤。uniq命令 uniq命令是用来取消重复行,其实和"sort -u"是一样的 格式:uniq \[选项\] 文件名 选项:-i: 忽略大小写 ⑥。统计命令wc 格式:wc \[选项\] 文件名 选项:-l: 只统计行数 -w :只统计单词数 -m:只统计字符数 ## **条件判断:** (使用echo $?来判断条件结果,0为true,1为false) 基本语法:①.test 判断条件 ②.\[ 判断条件 \] (注意条件前后距离\[\]要有空格,等号前后也要有空格) 常用判断条件: ①.两个整数之间比较 ![](https://i-blog.csdnimg.cn/direct/2a40cf5f090447d4bdde4217de4b42e1.png) ②.按照文件权限进行判断 ![](https://i-blog.csdnimg.cn/direct/d8db77f1647d4b37a882d4a8537c8862.png) ③.按照文件类型进行判断 ![](https://i-blog.csdnimg.cn/direct/dbd1dcc395a04ec180b862eeee4e8372.png) ![](https://i-blog.csdnimg.cn/direct/7207b13b511647a2a1d370feb113ddb8.png) ④.两个文件之间进行比较 ![](https://i-blog.csdnimg.cn/direct/81c8c4f1ff0a491a8ef9f058ca1aae0e.png) ⑤。字符串比较 ![](https://i-blog.csdnimg.cn/direct/03641790181a46ad909801227f791146.png) ⑥。多重条件比较 ![](https://i-blog.csdnimg.cn/direct/c16931975d574fc38e0018ad83f3c2c3.png) ## **条件语句:** 注意:条件判断式不用再额外加中括号,例子多加了一层中括号 ①.if判断基本语法: 单分支: if \[ 条件判断式 \];then 程序 fi 或者 if \[ 条件判断式 \] then 程序 fi 多分支: if \[ 条件判断式 \] then 程序 elif \[ 条件判断式 \] then 程序 else 程序 fi 注意事项:\[ 条件判断式 \],中括号和条件判断式之间必须要有空格,if后要有空格 ![](https://i-blog.csdnimg.cn/direct/b6379be930a7404c9d4ef104ca0778bf.png) ②.case语句基本语法 case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; ...........省略其他分支 \*) 如果变量的值都不是以上的值,则执行此程序 ;; esac 注意事项:①case行尾必须为单词"in",每一行模式匹配必须以右括号")"结束 ②双分号";;"表示命令序列结束,相当于break ③最后的"\*)"表示默认模式,相当于default ![](https://i-blog.csdnimg.cn/direct/89b52b387ca442209df2b1ab6e8321f2.png) ## **循环语句** 并发控制(补充) \& 将程序放置后台运行 Wait 允许脚本等待一个或多个后台进程完成 一种做法: for语句 do { 循环体 }\& Wait ①for循环基本语法: for((初始值;循环条件控制;变量变化)) do 程序 done ![](https://i-blog.csdnimg.cn/direct/3805627e9eba4779a7ef2b0511e8b26f.png) ② for in循环基本语法: for 变量 in 值1 值2 值3...... do 程序 done ![](https://i-blog.csdnimg.cn/direct/8e346fa317024d3aa2f71973f7e21f62.png) ③$\*,$@基本语法:两个均代表命令行中的所有参数,$\*将所有参数看成一个整体,$@把每个参数区分对待 比较:$\*,$@都表示传递给函数或脚本的所有参数,不被双引号包含时,都以$1 $2 $3.....的形式分开输出所有参数; 当它们被双引号包含时,$\*会以"$1 $2 $3...."按整体的形式输出所有参数,$@以$1 $2 $3.....的形式分开输出所有参数 ![](https://i-blog.csdnimg.cn/direct/1c939d5003114a9ca1b90e8b3d2c2800.png) ④,while/until循环基本语法 while只要条件判断式不成立时跳出循环 until只要条件判断式成立则跳出循环 while/until \[ 条件判断式 \] do 程序 done ![](https://i-blog.csdnimg.cn/direct/91570f73136541aebc88f29a485734c2.png) ## **特殊流程控制语句** ①,exit语句 系统的exit命令,是用于退出当前用户的登陆状态; 在shell脚本中,exit语句是用来退出当前脚本的,只要碰到exit语句,后续的程序就不再执行 语法:exit \[返回值\] 可以使用$?来查看exit的返回值 ②,break和continue ## **read** **读取控制台输入** 基本语法:read (选项) (参数) 选项:-p:指定读取值时的提示符; -t:指定读取值时等待的时间 (秒)。 -n: 指定接受的字符数 -s: 隐藏输入的数据 参数: 变量:指定读取值的变量名 注意:字符串比较时,等号前后要有空格,否则计算机会识别为赋值语句,定义变量时不要有空格 若输入错误可以ctrl+退格键删除 ![](https://i-blog.csdnimg.cn/direct/a9c591fade704b84b6b472fc2ea648d1.png) ## **函数** 系统函数 ①basename 基本语法:basename \[string/pathname\] \[suffix\] 功能描述:basename命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来。 选项:suffix为后缀,如果suffix被指定了,basename会将pathname或suffix去掉 ②dirname Dirname 文件绝对路径 功能描述:dirname命令会获取所有的前缀路径 ![](https://i-blog.csdnimg.cn/direct/7f45209adbbd486c975948d2e334f8de.png) 自定义函数 基本语法 \[function\] 函数名() { 函数体; \[return int;\] } 经验技巧: ①。必须在调用函数地方之前,先声明函数,shell脚本是逐步运行的,不会像其他语言一样先编译 ②,函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令结果作为返回值,return后跟数值n(0-255) ![](https://i-blog.csdnimg.cn/direct/460bff7b66c543a4aa06e57756b6dd07.png) ## **数组:** 注意:查看和引用数组时需要加{}包裹数组 ①,定义数组 数组名=(元素1 元素2 元素3,元素n) 数组名\[下标\]=变量值 元素定义示例: ![](https://i-blog.csdnimg.cn/direct/8244552e409447b19dce37ae42e17ccb.png) ②,查看数组 declare -a \|grep 目标数组 ③,访问数组 ![](https://i-blog.csdnimg.cn/direct/8b490bdca56a47f0a93ca1f5bee41f4d.png) ④,关联数组 功能:自定义索引; 语法:先声明关联数组 declare -A 关联数组名 数组名=(\[自定义数组名1\]=值1 \[自定义数组名2\]=值2 ...........) people=(\[p1\]=li \[pi2\]=wang \[p3\]=zhang \[p4\]="ni ba") ![](https://i-blog.csdnimg.cn/direct/39544350712d4a7691a96096e9518adc.png) ## **切片** 格式:{变量名:起始索引:步长} (注意:步长省略则是截取到末尾,$后面一定要加{}) ![](https://i-blog.csdnimg.cn/direct/657614c9d9a144a2834c35ae4556c428.png)

相关推荐
丁劲犇8 分钟前
碳基生物的悲歌-DeepSeek思考实现Linux动态库递归收集工具
linux·递归·deepseek·ldd
羊小猪~~32 分钟前
MYSQL学习笔记(九):MYSQL表的“增删改查”
数据库·笔记·后端·sql·学习·mysql·考研
zhouwu_linux34 分钟前
MT7628基于原厂的SDK包, 修改ra1网卡的MAC方法。
linux·运维·macos
2401_8979300643 分钟前
linux系统如何配置host.docker.internal
linux·docker·eureka
yuanbenshidiaos1 小时前
【数据挖掘】数据仓库
数据仓库·笔记·数据挖掘
诶尔法Alpha1 小时前
Linux上使用dify构建RAG
linux·运维·服务器
熬夜苦读学习2 小时前
Linux文件系统
linux·运维·服务器·开发语言·后端
沐千熏2 小时前
Liunx(CentOS-6-x86_64)系统安装MySql(5.6.50)
linux·mysql·centos
sealaugh322 小时前
aws(学习笔记第二十九课) aws cloudfront hands on
笔记·学习·aws
FakeOccupational3 小时前
【计算社会学】 多智能体建模 ABM Agent Based Modeling 笔记
笔记