当前位置: 首页 > article >正文

shell编程基础笔记

目录

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

bash基本功能:

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

变量类型

字符串处理:

条件判断:(使用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/    "命令  &>> 文件"

         分别保存正确错误文件:“命令>>文件 2>>文件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支持以下这些选项

3)LANG语系变量

LANG变量定义了Linux系统的主语系环境,这个变量的默认值

可以使用locale -a | more来查看支持的语系

4)环境变量配置文件调用过程

③。位置参数变量

特殊变量

$n         功能描述:n为数字,$0代表脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}

$#         功能描述:获取所有输入参数个数,常用于循环
$*       功能描述:这个变量代表命令行中的所有参数,$*把所有的参数看成了一个整体

$@     功能描述:这个变量也代表命令行中的所有参数,不过$@把每一个参数区分对待

举例

④.自定义变量

基本语法:

定义变量:变量名=变量值,注意=前后不能有空格(定义变量不需要加$,调用变量需要给变量前加$

撤销变量:unset   变量名

声明静态变量:readonly 变量,注意:不能unset

使用“export 变量(declare -x  变量)”可以把变量升级为全局(环境)变量,供其他变量使用(例如将父shell继承给子shell)

变量连接:变量=“$变量”连接值

变量定义规则:

变量名称由字母,数字,下划线组成,不能以数字开头,环境变量建议大写

等号两侧不能有空格

在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

变量的值如果有空格,需要使用双引号和单引号括起来

字符串处理:

①。cut列提取命令

  cut    [选项]    文件名

选项:

-d 分隔符:按照指定分隔符进行分列

-f   列号:提取第几列,一般与-d联用,cut命令的默认分隔符为制表符tab键,不对空格支持

-c  字符范围: 不依赖分隔符来区分列,而是通过字符范围(行首为1)来进行字段提取。“n-”表示从第n个字符到行尾;“n-m”从第n个字符到第m个字符;“-m”表示从第一个字符到第m个字符。

②。  Awk

列数表示直接为"$数字"

可以使用“-F 分隔符”来进行分割,注意引号的使用

 

1)。printf  输出

2)。 awk基本使用      awk   ‘条件1  {动作1}  条件2  {动作2}….’   文件名      (动作写在{}中,转义字符和字符串需要用“”括起来,

awk解决cut不能处理的空格问题

3)awk内置变量

注意:当使用FS时,可能第一行没有起作用,可能是需要加BEGIN条件

③。sed命令

列数表示直接为数字

sed命令主要是用来将数据进行选取,替换,删除,新增的命令

格式:sed    [选项]    '[动作]'    文件名

注意:1)如果想追加或插入多行数据,除最后一行外,每行的末尾都要加入“\”代表数据未完结;

2)-d只有行删除,没有具体的字符串删除功能,可以使用s将字符串替换为空,即可达到删除字符串的效果

3)多条动作之间要用“;”号或回车进行分割(一般与-e配合使用),当使用-e对多条命令进行编辑时,要与命令紧挨使用,中间不能有其他选项

4)指定行范围可以用“,”例如1,3表示第一行到第三行

④。排序命令sort

格式:sort    [选项]   文件名

补充:-k     指定字段号,一般与-t搭配使用,当-t分割后可以选择指定字段号;“-k  3”表示从第三个字段到行尾排序

⑤。uniq命令

uniq命令是用来取消重复行,其实和“sort  -u”是一样的

格式:uniq   [选项]   文件名

选项:-i: 忽略大小写

⑥。统计命令wc

格式:wc  [选项]   文件名

选项:-l:   只统计行数

-w :只统计单词数

-m:只统计字符数

条件判断:(使用echo $?来判断条件结果,0true1false

基本语法:①.test  判断条件

.[ 判断条件 ]           (注意条件前后距离[]要有空格,等号前后也要有空格)

常用判断条件:

.两个整数之间比较

②.按照文件权限进行判断

③.按照文件类型进行判断

④.两个文件之间进行比较

⑤。字符串比较

⑥。多重条件比较

条件语句:

注意:条件判断式不用再额外加中括号,例子多加了一层中括号

①.if判断基本语法:

单分支:

 if   [ 条件判断式 ];then

 程序

 fi

或者

 if [ 条件判断式 ]

 then

       程序

 fi

多分支:

 if [ 条件判断式 ]

 then

       程序

 elif [ 条件判断式 ]

 then

       程序

 else

程序

 fi

注意事项:[   条件判断式   ],中括号和条件判断式之间必须要有空格,if后要有空格

②.case语句基本语法

 case   $变量名 in

“值1”)

如果变量的值等于值1,则执行程序1

;;

 “值2”)

如果变量的值等于值2,则执行程序2

;;

………..省略其他分支

 *)

如果变量的值都不是以上的值,则执行此程序

;;

 esac

注意事项:①case行尾必须为单词“in”,每一行模式匹配必须以右括号“)”结束

②双分号“;;”表示命令序列结束,相当于break

③最后的“*)”表示默认模式,相当于default

循环语句

并发控制(补充)

&   将程序放置后台运行

Wait    允许脚本等待一个或多个后台进程完成

一种做法:

for语句

      do {

循环体

}&

Wait

①for循环基本语法:

 for((初始值;循环条件控制;变量变化))

 do

          程序

 done

 ② for in循环基本语法:

 for 变量  in  值1 值2 值3……

 do

程序

 done

③$*,$@基本语法:两个均代表命令行中的所有参数,$*将所有参数看成一个整体,$@把每个参数区分对待

比较:$*,$@都表示传递给函数或脚本的所有参数,不被双引号包含时,都以$1 $2 $3…..的形式分开输出所有参数;

 当它们被双引号包含时,$*会以“$1 $2 $3….”按整体的形式输出所有参数,$@以$1 $2 $3…..的形式分开输出所有参数

④,while/until循环基本语法

while只要条件判断式不成立时跳出循环

until只要条件判断式成立则跳出循环

 while/until [ 条件判断式 ]

 do

         程序

 done

特殊流程控制语句

①,exit语句

系统的exit命令,是用于退出当前用户的登陆状态;

在shell脚本中,exit语句是用来退出当前脚本的,只要碰到exit语句,后续的程序就不再执行

语法:exit  [返回值]

可以使用$?来查看exit的返回值

②,break和continue

read读取控制台输入

基本语法:read     (选项)  (参数)

选项:-p:指定读取值时的提示符;

  -t:指定读取值时等待的时间 (秒)。

  -n:   指定接受的字符数

  -s:   隐藏输入的数据

参数:

变量:指定读取值的变量名

注意:字符串比较时,等号前后要有空格,否则计算机会识别为赋值语句,定义变量时不要有空格

若输入错误可以ctrl+退格键删除

函数

系统函数

①basename

 基本语法:basename [string/pathname] [suffix]

 功能描述:basename命令会删掉所有的前缀包括最后一个("/")字符,然后将字符串显示出来。

 选项:suffix为后缀,如果suffix被指定了,basename会将pathname或suffix去掉

②dirname

Dirname  文件绝对路径

功能描述:dirname命令会获取所有的前缀路径

自定义函数

基本语法

[function]  函数名()

{

函数体;

[return int;]

}

经验技巧:

①。必须在调用函数地方之前,先声明函数,shell脚本是逐步运行的,不会像其他语言一样先编译

②,函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令结果作为返回值,return后跟数值n(0-255)

数组:

注意:查看和引用数组时需要加{}包裹数组

 

①,定义数组

数组名=(元素1  元素2  元素3,元素n)

数组名[下标]=变量值

元素定义示例:

②,查看数组

declare   -a  |grep   目标数组

③,访问数组

④,关联数组

功能:自定义索引;

语法:先声明关联数组

  declare  -A  关联数组名

  数组名=([自定义数组名1]=值1  [自定义数组名2]=值2 ………..)

  people=([p1]=li [pi2]=wang [p3]=zhang [p4]="ni ba")  

切片

格式:{变量名:起始索引:步长}    (注意:步长省略则是截取到末尾,$后面一定要加{})


http://www.kler.cn/a/418945.html

相关文章:

  • 蓝队基础(泷羽sec)
  • 基于群晖搭建个人图书架-TaleBook based on Docker
  • 挑战用React封装100个组件【007】
  • C++中输入 不定长数据的方法
  • 【看海的算法日记✨优选篇✨】第三回:二分之妙,寻径中道
  • GoogleTest做单元测试
  • 相关前端程序
  • element-plus弹窗二次封装踩坑
  • repo仓库转移到自己本地的git服务器
  • PostgreSQL17官网下载详细教程
  • Flutter 指纹识别
  • MVC core 传值session
  • Android 混淆问题
  • Rust vs Java:后端开发应该选哪个?
  • npm 最新国内淘宝镜像地址源 (旧版已不能用)
  • VS Code前端常用插件
  • 使用ECharts创建带百分比标注的环形图
  • ZOOKEEPER [Zookeeper——Docker下安装部署]
  • 解决“ VMware Tools for Windows Vista and later“报错问题
  • 泷羽sec-云技术
  • 机器学习6_支持向量机_算法流程
  • 易速鲜花聊天客服机器人的开发(下)
  • 服务器数据恢复—raid6阵列硬盘被误重组为raid5阵列的数据恢复案例
  • qt QConicalGradient详解
  • 解决虚拟机中 GitHub 无法通过 HTTPS 访问的问题
  • springboot359智慧草莓基地管理系统(论文+源码)_kaic