Shell
概述
- Linux系统中的Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负
责接收用户输入的操作指令(命令) 并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
Shell类型
- 查看当前系统支持的Shell版本
echo $SHELL
变量
- 创建变量本质是向系统申请存储空间,用于存储可能发生变化的数据;
分类
系统变量(全局)
- 一旦创建,则可以在系统任意位置使用该变量数据;
普通变量
- 创建在文件或函数中,只能在创建变量的文件或函数中使用;
语法
- 创建变量
#变量名称取名必须符合以下要求(命名规范):#由数字、字母、下划线组成(_);#数字不开头;#做到见名知义;#避免关键字变量名称=数据
- 删除变量
unset 变量名称
- 数据包含特殊符号的字符串需要使用双引号或单引号括起来
变量名称="字符串"变量名称='字符串'
- 输出变量值
echo $变量名称
- 嵌套使用变量,必须使用双引号将内容括起来
变量名称1="字符串内容$变量名称2"变量名称1="${变量名称2}字符串内容"
shell文件创建
创建文件
touch 文件路径/文件名称.shvi 文件路径/文件名称.sh
编辑文件内容
- 必须以
#!/bin/bash开头
执行shell文件
方式一
- 最常用,不需要执行权限
sh 目标文件路径
方式二
- 最常用,不需要执行权限
. 目标文件路径
方式三
- 需要执行权限
./目标文件路径
方式四
- 最不常用,不需要执行权限
source 目标文件路径
预定义变量
$0:获取文件名称;$数字:数字取值范围[1,9],获取对应位置传入文件的数据(文件传参);$#:预定义参数个数(传入文件的数据个数);$*:以整体字符串形式输出所有传入数据;$@:分别输出所有传入数据;$?:获取上一次命令执行状态,0表示执行成功,大于0表示失败
输入与输出
- 输入
read -p "提示说明文本" 变量名称
- 输出
echo 数据echo $变量名称
算术运算符
+加法-减法*乘法/除法%取余(取模)
`expr 表达式`((表达式))
比较运算符
-gt:大于,表示greater than-lt:小于,表示less than-ge:大于等于,表示greater than or equals-le:小于等于,表示less than or equals-eq:等于,表示equals-ne:不等于,表示not equals
#结果为0或1,0表示为真(关系成立),1表示为假(关系不成立)test 表达式[ 表达式 ]test 选项 路径选项:-f 判断文件是否存在,且类型为文件类型-d 判断文件夹是否存在,且类为文件夹类型
逻辑运算符
&&:与,表示并且,符号左右条件结果都为真,则结果为真,否则为假||:或,表示或者,符号左右条件结果有至少一个为真,则结果为真,否则为假(左右条件都为假)
分支
if-elif-else
if 条件;then 条件体elif 条件;then 条件体.....else 条件体fi
- 判断当前主机是否能与指定主机通信
- 判断文件是否存在以及文件类型
- 判断成绩等级
- 判断成绩等级(优化版)
case(了解)
case 变量 in值1) 条件体;;值2) 条件体;;.....*) 条件体esac
- 根据月份判断当月总天数
循环
for(掌握)
++:自增,在原值基础上加1--:自减,在原值基础上减1
#大于 >#小于 <#等于 ==#大于等于 >=#小于等于 <=#不等于 !=for((初始化①;条件②;步进③))do 循环体④done① -> ② -> 退出循环执行① -> ② -> ④ -> ③ -> ② -> 退出循环执行① -> ② -> ④ -> ③ -> ② -> ④ -> ③ -> ② -> 退出循环执行① -> ② -> ④ -> ③ -> ② -> ④ -> ③ -> ② -> .... 退出循环执行for((count=1;count<11;count++))do echo "Hello"done
- 命令行输出10次Hello
- 运算1到指定数num的累加结果;
- 测试指定网段主机是否能通信
while(了解)
while [ 条件① ]do 循环体②done① -> 退出循环① -> ② -> ① -> 退出循环① -> ② -> ① -> ② -> ① ...... -> 退出循环
- 计算1到n的累加结果
until(了解)
#条件为退出循环条件until [ 条件 ]do 循环体done
for-in(掌握)
for 变量 in 值1 值2 值3 .....do 循环体done
for 变量 in {起始值..结束值}do 循环体done
select(了解)
select 变量 in 值1 值2 值3 .....do 循环体doneselect 变量 in {起始值..结束值}do 循环体done
循环控制
break
- 立即结束当层整个循环
continue
- 结束当层本次循环,继续下一次循环
循环嵌套
#!/bin/bashfor i in {1..10}do for j in {10..20} do echo "i=${i},j=${j}" donedone
函数
- 为指定代码块取个名字,后期要执行该代码可以通过该名称定位代码进行执行;
- 优点:提高代码重用率、减少代码冗余;
语法
定义
function 函数名称(){ 函数体 return 值}
function sum(){ re=0 read -p "num1:" $num1 read -p "num2:" $num1 re=`expr $num1 + $num2` echo $re}
调用
函数名称
案例
- 无参数无返回值
- 有参无返回值
- 有参有返回值
sed
- 可以实现文件内容的编辑(替换、插入、删除、修改)。
添加
#在指定行数后添加指定内容sed '行数a 内容' 文件路径#在指定行数前添加指定内容sed '行数i 内容' 文件路径
将passwd文件中的第1行后添加*******行内容
- 将
passwd文件中的第1行前添加*******行内容
修改
sed '行数c 内容' 文件路径sed '起始行数,结束行数c 内容' 文件路径
- 将
passwd文件中的第2行进行修改为*******
- 将
passwd文件中的第2到5行进行修改为*******
删除
sed '行数d' 文件路径sed '起始行数,结束行数d' 文件路径
- 将
passwd文件中的第2行进行删除
- 将
passwd文件中的第2到5行进行删除
查看
sed -n '行数p' 文件路径sed -n '起始行数,结束行数p' 文件路径
- 将
passwd文件中的第2行内容输出
- 将
passwd文件中的第2到5行内容输出
替换
sed 's/旧的内容/新的内容/g' 文件路径
- 将
passwd文件中的sbin替换为~
持久化
sed -i 操作 文件路径
- 将
passwd文件中的sbin替换为~,并写入到源文件(passwd)中
awk
- 实现文本内容分割(切割)
awk -F '分隔符' '{print $数字}' 文件名称
- 将
passwd文件每行内容以:作为分隔符进行分割,取出分割的第1个数据
at
- 一次性定时任务,默认未安装,需要自行下载。
命令
- 服务名称为
atd
#启动服务systemctl start atd
- 创建定时任务
at now+时间单位>执行的命令>ctrl+d保存并退出单位:minute(s)、hour(s)、day(s)
- 1分钟后执行指定任务
crontab
- 执行周期性的定时任务(按指定时间周期性完成)。
命令
创建
crontab -e* * * * * 用户名 命令
- 每周3执行指定任务
查看
crontab -l
删除
crontab -r
取别名
- 可以为常用命令取别名,简化命令执行
命令
alias 别名='命令内容'
案例
alias cnet='cd /etc/sysconfig/network-scripts'