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”/ "命令 &>> 文件"
分别保存正确错误文件:“命令>>文件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 $?来判断条件结果,0为true,1为false)
基本语法:①.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")
切片
格式:{变量名:起始索引:步长} (注意:步长省略则是截取到末尾,$后面一定要加{})