echo
echo输出打印
普通输出打印:echo “abc”
使用-e支持控制符号,如 echo -e “\”
echo 颜色输出
- 字体颜色输出
echo -e “\e[1;31m abc \e[0m”(31m红色、32m绿色、33m黄色 前后\e为固定格式)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IsFvhJ5T-1653356782873)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328111439102.png)]
- 背景颜色输出
echo -e “\e[1;41m abc \e[0m” (41m红色背景、42m绿色、43m黄色)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B94glArD-1653356782874)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328111536371.png)]
shell脚本程序运行方法
- 新建shell脚本文件,注意顶部一定要加bash bang( #!/bin/bash )
- 赋执行权限:chmod 755 hello.sh
- 通过当前路径或者绝对路径执行:./hello.sh 或者 sh hello.sh
历史命令
History 记录在~/.bash_history history -w历史命令强行写入配置文件
重复执行第n条历史命令: !39(39为history命令打印出来的历史命令的序号)
清空历史命令:history -c
常用快捷键
移动到首位 Ctrl A
移动到尾部 ctrl E
剪切光标前内容 ctrl u
输出重定向
覆盖重定向 >
追加重定向 >>
追加的方式把正确和错误输出都保存到文件中:命令 >> 文件 2>&1 (前面表示把输出到追加到文件中,后面表示把标准错误输出到标准正确输出中),或者使用 命令 &>> 文件 命令(更常用)
多命令执行
命令1 ;命令2 ;命令3(多条命令顺序执行)
命令1 && 命令2 (命令1正确执行后命令2才执行,命令1报错,命令2不执行)
命令1 || 命令2 (命令1不正确执行命令2才执行,命令1正确执行,命令2不执行)
bash shell的特殊符号
- 单引号中的特殊符号都没有特殊含义。
- 双引号中的特殊符号都没有特殊含义,但是$、` 、\例外,拥有调用变量值,引用命令,转义符的特殊含义。
- 反引号中的为系统命令。(需要把命令的值赋予变量的情况下使用。直接使用命令的时候,直接输入回车即可)
- $符号用于调用变量的值。
- ()自动开启一个子shell并在子shell中执行括号中的命令,执行完以后自动退出子shell。如:(name=1m;echo $name)
- {}在当前shell中运行括号中的命令。如:{ name=1m;echo $name; },用得较少,不加括号一样可以执行。
- []用于变量测试
- #用于注释
- \转义符
bash的变量和运算符
1、变量可以由字母、数字和下划线组成,但不能由数字开头。Name=sc
2、变量默认类型都是字符串,如果需要数值运算,则必须指定特定变量类型为数值型。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZaOCEoU-1653356782875)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328114809525.png)]
3、shell语言中变量定义赋值的时候,等号=左右两侧不能加空格。
用户自定义变量
- 【变量查看】
set -u 调用未声明变量时会报错,临时生效,永久生效写入环境变量配置文件
set -x 在执行命令之前,会把命令先输出一遍(不常用)
set 查看系统所有变量 包括系统变量和自定义变量
- 【变量删除】
unset 变量名
- 【更细覆盖】
重新赋值即可覆盖
环境变量
2.1 用户自定义环境变量
用户自定义环境变量可以在父shell和子shell中生效,用户自定义变量只能在当前shell中生效。
用户自定义环境变量格式 export AGE=22
【环境变量查询】
set 可查看包含环境变量的所有变量,env查看所有环境变量
【环境变量删除】
Unset
【环境变量修改】
覆盖
2.2 系统自带环境变量
变量名称、作用均不能修改
【PATH系统环境变量】
PATH变量:系统查找命令的路径
系统命令不需要加绝对路径或者相对路径就可以运行的原因就是PATH环境变量的作用。
【PS1系统环境变量】
用来定义命令行的提示符
位置参数变量
$n 第n个命令行参数
$* 代表命令行所有参数,把所有参数看成一个整体
$@代表命令行所有参数,把每个参数区分对待
$#命令行所有参数个数
#!/bin/bash
num1=0
num2=0
for i in "$*"
do
echo $i
num1=$((num1+1))
done
echo "================================================="
for j in "$@"
do
echo $j
num2=$((num2+1))
done
echo "==============================================="
echo $num1 $num2
预定义变量
$? 最后一次执行的命令的返回状态。0上一条命令执行正确,非0上一条命令执行不正确
接收键盘输入
read [选项] [变量名]
-p 提示信息
-t 秒数,输入等待时间
-s 隐藏输入数据
-n 指定字符数
echo "begin input your userinfo"
read -t 30 -p "please input name:" name
read -t 30 -p "please input age:" age
echo "your username is $name,your age is $age"
read -s -t 30 -p "please input passwd" passwd
echo "your passwd is $passwd"
echo "begin add"
read -t 30 -p "please input num1[0/1]:" num1
echo -e "\n"
read -t 30 -p "please input num2[2/3]:" num2
echo -e "\n"
echo "num1 和 num2的和为:$(($num1+$num2))"
变量声明与运算
declare声明变量类型
shell中默认都是字符串类型,需要单独进行数值运算就需要单独进行类型定义
declare [+/-] 变量名
-:给变量设定类型属性
+: 取消变量的类型属性-a:将变量声明为数组型 declare -i c= a + a+ a+b 数值运算更常用方法 ( ( (( ((a+$b))
-i: 将变量声明为整数型 declare -a name[0]=“lizhencai” 或者 name[1]=“zhangsan”,数组调用 echo ${name[*]} 、echo ${name[1]}
数值运算方法
1、declare进行数值运算 declare -i c= a + a+ a+b
2、使用expr或者let命令工具进行运算
$(expr $a + $b),加号左右两侧必须有空格 let c=$a+$b
3、**使用 ( ( 运 算 式 ) ) , 推 荐 使 用 方 式 ∗ ∗ 。 或 者 使 用 ((运算式)),推荐使用方式**。或者使用 ((运算式)),推荐使用方式∗∗。或者使用[运算式]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fQxEXSc-1653356782876)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328141149008.png)]
四则运算练习题
#!/bin/bash
read -p "请输入第一个运算数字:" num1
read -p "请输入第二个运算数字:" num2
read -n 1 -p "请输入运算表达式[+、-、*、/]:" operator
echo -e "\n"
[ "$operator" == "+" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
[ "$operator" == "-" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
[ "$operator" == "*" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
[ "$operator" == "/" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
echo "请输入正确运算符!"
正则表达式
基础正则表达式
通过grep命令进行加载
- “*”:前一个字符重复0次或者任意多次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pfus413f-1653356782877)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328172630468.png)]
- “.”:匹配除了换行符外任意一个字符
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYOqRM4p-1653356782877)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328172411135.png)]
-
grep “.*” [文件名] 匹配任意字符
-
“^”:匹配行首
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYSqVJML-1653356782877)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328173302923.png)]
- “$”:匹配行尾
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Q6N8TQH-1653356782878)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328173337769.png)]
- 匹配空白行 grep “^KaTeX parse error: Expected group after '^' at position 19: …排除空白行 grep -v "^̲”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDHeGCF5-1653356782878)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328173829994.png)]
- “[]”:匹配括号中任意一个字符,一个字符。如,grep “s[ao]id” test.txt,要么匹配a、要么匹配o
- “[]”:匹配除括号中字符以外的任意一个字符(取反),注意:[]表示匹配以括号中任意一个字符开头的行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hdp1xHiN-1653356782879)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328175223816.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-alYowxRl-1653356782880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328175302360.png)]
- “\{n\}” 前面的字符恰好出现n次,这里的"\"表示转义,常用于数字的匹配查找
grep "[0-9]\{2\}" test.txt #数字出现两次的行
grep "[1][3-8][0-9]\{9\}" test.txt #匹配手机号
-
“\{n,\}” 前面的字符恰好出现大于等于n次
-
“\{n,m\}” 前面的字符恰好出现大于等于n次,小于等于m次
扩展正则表达式
- “?” 前一个字符匹配0次或者1次
- “+” 前面字符重复最少一次
正则实例
过滤ip地址
^(([1-9]\.)|([1-9][0-9]\.)|([1][0-9][0-9]\.)|([2][0-5][0-5]\.))(([0-9]\.)|([1-9][0-9]\.)|([1][0-9][0-9]\.)|([2][0-5][0-5]\.)){2}(([0-9])|([1-9][0-9])|([1][0-9][0-9])|([2][0-5][0-5]))$
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXrWDwMD-1653356782880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329115127291.png)]
字符截取和替换命令
cut截取列(grep是提取行)
cut -f n 文件名 提取文件中的第n列
cut -d “:” -f 1 -d按照分隔符进行提取,不支持空格作为分隔符
awk编程
awk的打印
- printf格式输出
提取根目录磁盘占用情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mQUt59IE-1653356782880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329145117829.png)]
awk的条件
- BEGIN 程序执行前执行一次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ggqA6LX3-1653356782881)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329150532758.png)]
- END 程序执行后执行一次
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tMvmvO8d-1653356782881)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329161503890.png)]
- 关系运算符
grep -v "name" student.sh | awk '$5 >= 86 {print $1}'
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2rlicb8Q-1653356782882)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329161852231.png)]
- A~B A包含在B中
- A!~B A不包含在B中
sed 命令
用于数据选取、替换、删除、新增的命令。
sed [选项] ‘[动作]’ 文件名
【选项】:
-n:只会把经过sed命令处理的行输出到屏幕
-e:允许对输入数据应用多条sed命令编辑
-f 脚本文件:从sed脚本读入sed操作。和awk命令的-f非常类似
-r:从sed中支持扩展正则表达式
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输入
【动作】:
a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要加\代表数据未完结。
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要加上\代表数据未完结。
i \: 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用\代表数据未完结。
d: 删除,删除指定的行。
p: 输出打印指定行
s: 替换字符串
sed -n 输入指定的处理的行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6P2v7nq6-1653356782882)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220330100305488.png)]
- 文本替换
sed 's/li/mm/g' student.txt #将student文件中的li替换成mm
sed 's/zhangsan/lisi/g ; s/79/84/g' student.txt #多条件同时替换
条件判断
文件类型判断
-d 文件:判断文件是否存在,并且是否为目录文件(是目录为真)
-e 文件:判断文件是否存在(存在为真)
-f 文件:判断文件是否存在,并是否为普通文件(为普通文件为真)
整数之间比较
整数1 -eq 整数2 #判断整数1和整数2是否相等(相等为真)、
-ne:是否不相等
-gt:是否大于
-lt:是否小于
-ge:是否大于等于
-le:是否小于等于
字符串的判断
字符串1 == 字符串2 :判断字符串1和字符串2是否相等
!= :是否不等
-n :判断字符串是否为非空,非空为真
-z :判断字符串是否为空,为空为真
流程控制
if条件判断
if [ 条件判断式 ]
then
程序
fi
双分支if语句
if [ 条件判断式 ]
then
程序1
else
程序2
fi
多分支if语句
if [ 条件判断式 ]
then
程序1
elif
then
程序2
else
程序3
fi
实例(简单四则运算器)
#!/bin/bash
read -p "请输入第一个运算数字:" num1
read -p "请输入第二个运算数字:" num2
read -p "请输入运算表达式[+、-、*、/]:" operator
#输入内容非空
if [ -n "$num1" ] && [ -n "$num2" ] && [ -n "$operator" ]
then
#判断输入运算数字是否为合法数字
temp1=$(echo $num1 | sed 's/[0-9]//g')
temp2=$(echo $num2 | sed 's/[0-9]//g')
if [ -z $temp1 ] && [ -z $temp2 ]
then
if [ "$operator" == "+" ] || [ "$operator" == "-" ] || [ "$operator" == "*" ]
then
echo -e "\e[1;32m $num1 $operator $num2的运算结果为:$(($num1 $operator $num2)) \e[0m"
elif [ "$operator" == "/" ]
then
if [ $num2 -eq 0 ]
then
echo -e "\e[1;32m 错误!(除法运算分母不能为0) \e[0m"
else
echo -e "\e[1;32m $num1 $operator $num2的运算结果为:$(($num1 $operator $num2)) \e[0m"
fi
else
echo -e "\e[1;31m 请输入合法的运算表达式!\e[0m"
fi
else
echo -e "\e[1;31m 请输入合法的运算数字!\e[0m"
fi
else
echo -e "\e[1;31m 输入内容不能为空!\e[0m"
fi
exit
for循环
for i in 值1 值2 值3
do
程序
done
for (( i=1;i<=100;i=i+1 ))
do
程序
done
then
echo -e "\e[1;32m 错误!(除法运算分母不能为0) \e[0m"
else
echo -e "\e[1;32m $num1 $operator $num2的运算结果为:$(($num1 $operator $num2)) \e[0m"
fi
else
echo -e "\e[1;31m 请输入合法的运算表达式!\e[0m"
fi
else
echo -e "\e[1;31m 请输入合法的运算数字!\e[0m"
fi
else
echo -e “\e[1;31m 输入内容不能为空!\e[0m”
fi
exit
### for循环
```shell
for i in 值1 值2 值3
do
程序
done
for (( i=1;i<=100;i=i+1 ))
do
程序
done