shell执行多行命令
[root@localhost ~]# date;whoami
2023年 02月 14日 星期二 01:21:25 EST
root
把复杂的命令执行过程,通过逻辑代码,组成一个脚本文件,再去执行该文件
Shebang
#! /bin/bash
#! /bin/perl
#! /bin/python
执行脚本的方式
source my_first.sh
. my_first.sh
bash my_first.sh
./my_first.sh
[root@localhost ~]# cat test_date.sh
#! /bin/bash
echo 当前的时间日期是: `date`
[root@localhost ~]# bash test_date.sh
当前的时间日期是: 2023年 02月 14日 星期二 01:29:12 EST
echo能够输出变量的值
[root@localhost ~]# cat echo_var.sh
#! /bin/bash
#显示用户的个人信息
echo "User info for username: ${
USER}"
echo "User UID is :$UID"
echo "User Home is:" $HOME
[root@localhost ~]# sh echo_var.sh
User info for username: root
User UID is :0
User Home is: /root
echo和转义符的概念
还原符号,不会被阅读为特殊含义
eg1:
[root@localhost ~]# echo "$6999"
999
[root@localhost ~]# echo "\$6999"
$6999
eg2:
[root@localhost ~]# echo '$6999'
$6999
变量在脚本中的使用
变量被引用的时候,会赋予其值,脚本中的变量,在shell执行完毕后就会消失,根据执行的方式决定
[root@localhost ~]# cat make_var.sh
#!/bin/bash
name="张三"
age=10
echo "姓名:$name,年龄:$age"
[root@localhost ~]# bash make_var.sh
姓名:张三,年龄:10
[root@localhost ~]# echo $name
[root@localhost ~]# source make_var.sh
姓名:张三,年龄:10
[root@localhost ~]# echo $name
张三
当使用不同执行方式执行脚本产生的后果也不一样
source和. 是在当前的shell环境中加载变量,执行脚本
bash和sh 执行脚本的时候,是开启子shell运行的,变量也是在子shell环境中加载,子shell退出后,变量也就消失了
对变量值的获取,一定加上美元符号,否则就错误了
shell一大特性就是可以从命令的执行结果中,再提取结果,因此特别适合编程
${vars} 取出变量结果
$() 在括号中执行命令、且拿到命令执行的结果
“ 在括号中执行命令、且拿到命令执行的结果
() 开启子shell执行命令结果
$vars 取出变量结果
[root@localhost ~]# echo "当前的时间是$(date)"
当前的时间是2023年 02月 14日 星期二 02:07:21 EST
[root@localhost ~]# echo "当前的用户是 `whoami`"
当前的用户是 root
[root@localhost ~]# `whoami`
-bash: root: 未找到命令
[root@localhost ~]# root
-bash: root: 未找到命令
[root@localhost ~]# (pwd;echo $BASH_SUBSHELL;whoami)
/root
1
root
数学计算
运算符号
用于数值计算的命令
双括号(())
效率极高,常用方法
特殊符号运算
[root@localhost ~]# a=5
[root@localhost ~]# echo $((++a))
6
[root@localhost ~]# echo $a
6
#先打印再赋值
[root@localhost ~]# echo $((a++))
6
[root@localhost ~]# echo $a
7
案例,对用户输入判断是否是整数的脚本
#!/bin/bash
print_usage(){
printf "Please enter an integer\n"
exit 1
}
#接受用户输入
read -p "Please input first number:" firstnum
# 如果用户输入,去掉了整数部分,为空,说明是一个数字
# if的-n参数,如果string长度非零,则为真
# 如果该字符串不为空,那么if逻辑成立,说明用户输入的不是一个纯数字
if [ -n "`echo $firstnum|sed 's/[0-9]//g'`" ];then print_usage fi read -p "Please input the operators:" operators #判断运算符 if [ "${
operators}" != "+" ] && [ "${
operators}" != "-" ] && [ "${
operators}" != "*" ] && [ "${
operators}" != "/" ];then echo "Please use {
+|-|*|/}" exit 2 fi #输入第二个数字 read -p "Please input second number:" secondnum if [ -n "`echo $secondnum|sed 's/[0-9]//g'`" ];then print_usage fi #进行计算 echo "${
firstnum}${
operators}${
secondnum}结果是:$((${
firstnum}${
operators}${
secondnum}))"
执行
[root@localhost ~]# bash is_int.sh
Please input first number: 10
Please input first number: +
Please input first number: 6
10+6结果是:16
直接对用户输入计算
[root@localhost ~]# cat jisuan.sh
#!/bin/bash
echo $(($1))
[root@localhost ~]# bash jisuan.sh 2+3
5
let命令
let命令等同于双括号计算,但是双括号效率更高
[root@localhost ~]# i=3
[root@localhost ~]# let i=i+7
[root@localhost ~]# echo $i
10
expr命令
expr命令允许在命令行处理数学表达式,简单的计算器命令
产看帮助
expr --help
[root@lcoalhost ~]# expr 1 + 5
6
# expr并不是很好用
# 很多符号在shell里有特殊含义因此必须转义使用
[root@lcoalhost ~]# expr 5 * 2
expr: syntax error
[root@lcoalhost ~]# expr 5 \* 2
10
# 求长度
[root@lcoalhost ~]# expr length 123132134524asdqweqweqewqfgdfgdfgdf
35
# 逻辑判断,必须加上引号
[root@lcoalhost ~]# expr 33 '>' 3
1
[root@lcoalhost ~]# expr 33 '>' 333
0
# 除法
[root@lcoalhost ~]# expr 50 / 5
10
expr模式匹配
expr支持模式匹配,也就是如同正则的作用
有2个模式符号
: 冒号,计算字符串中的字符数
.* 任意字符串重复0次或多次
语法:统计字符串的字符个数
expr 字符串 : “.*”
# 统计yc.jpg字符个数
[root@lcoalhost ~]# expr yc.jpg ":" ".*"
6
# 统计jpg后缀的文件,字符个数,找不到符合的就为0
# 无论jpg后面有多少个字符,只匹配到jpg这3个字符结尾
[root@lcoalhost ~]# expr yc.jpg ":" ".*\.jpg"
6
[root@lcoalhost ~]# expr yc.jpg123123 ":" ".*\.jpg"
6
# 找不到的情况
[root@lcoalhost ~]# expr yc.jpwg123123 ":" ".*\.jpg"
0
expr案例:判断文件名是否符合要求
[root@lcoalhost ~]# cat expr1.sh
#!/bin/bash
if expr "$1" : ".*\.jpg" &> /dev/null
then
echo "This is jpg file"
else
echo "这不是jpg"
fi
# 执行
[root@lcoalhost ~]# bash expr1.sh aaa.jpg
This is jpg file
[root@lcoalhost ~]# bash expr1.sh t1.sh
这不是jpg文件
找出字符长度不大于6的单词
[root@lcoalhost ~]# cat word_length.sh
#!/bin/bash
# 注意后面这个变量,别加引号
for str in I am WTF, I teach you to learn linux
do
if [ `expr length $str` -le 6 ]
then
echo $str
fi
done
bc命令用法
bc命令可以当作计算器来用,当作命令行计算器用
交互式计算
支持小数计算
在这里插入代码片
管道符计算
[root@lcoalhost ~]# echo "4*4"|bc
16
[root@lcoalhost ~]# echo "4.5-1.1"|bc
3.4
[root@lcoalhost ~]# num=5
[root@lcoalhost ~]# result=`echo $num+6|bc`
[root@lcoalhost ~]# echo $result
11
提示:整数的计算,用双小括号,let,expr;带有小数的计算,用bc
bc案例
题目:计算1-100的总和
方案1
利用tr命令进行替换
echo {
1..100} | tr " " "+"
交给bc命令
echo {
1..100} | tr " " "+" | bc
方案2
利用序列
seq -s "+" 100
双括号计算
echo $((`seq -s "+" 100`))
expr命令计算,稍复杂,expr命令是接受多个参数来计算的
expr接受以空格分割的多个参数
linux下构造参数的命令 xargs
seq -s " + " 100 | xargs expr
awk计算
awk支持小数计算
awk支持if条件判断,数组等
echo "8.8 6.6" | awk '{print ($1+$2)}'
echo "8.8 6.6" | awk '{print ($1+2*$2)}'
中括号计算
$[表达式]
num=6
res=$[num+4]
Shell条件测试
shell变量除了直接赋值,或者脚本传参,还有就是read命令读取
read也是内置命令
-p 设置提示信息
-t 等待用户输入超时,timeout
read -p “请输入:” vars
shell条件测试语法
test条件测试
test命令评估一个表达式,如果条件为真,状态码为0,否则不为0,通过$?取值
参数:
-e 判断该文件是否存在,(普通文件,目录),存在就为真,否则为假
test命令实践
中括号的条件测试[ ]
脚本中经常进行条件测试,用的最多的,就是中括号 [ ]
test和[ ]的作用是一样
注意:中括号,前后的空格必须有
在条件测试中使用变量,必须添加双引号
[ -n “$filename” ]
字符串比较测试
= 判断是否相等
!= 判断是否不等
! 取结果的反义
注意:
- 对于字符串变量的比较要给变量添加双引号
- 使用等号的值判断,左右两边必须有空格
数值比较测试
1.在中括号中,使用数学比较符号,需添加转义符号
2.双中括号
对单中括号的补充,双中括号还支持正则处理
在双中括号中,不需要转义符
在工作中,用的最多的就是单中括号,双括号属于特殊场景的扩展语法
逻辑操作符号
&&
||
if语句
单分支
多分支
mysql监控脚本
python程序连接mysql
1.安装python3开发环境的依赖
yum install python3 python3-devel python3-pip
2.通过python的包管理工具,安装连接mysql的模块
pip3 install pymysql
3.代码
[root@bogon ~]# cat pymysql_conn.py
import pymysql
db = pymysql.connect(
host="localhost",
user='root',
password='1234',
db='mysql',
charset='utf8'
)
#操控数据库
cursor=db.cursor()
cursor.execute('select version()')
data=cursor.fetchone()
print("数据库连接成功!版本:%s"%data)
db.close()
运行结果
[root@bogon ~]# python3 pymysql_conn.py
数据库连接成功!版本:8.0.26
函数
函数的特点,类似于alias别名一样,能够简化linux命令的操作
函数格式
执行函数的基础概念
函数实践
函数定义和执行,分开在不同的文件中
url检测脚本
[root@localhost test]# cat check_url.sh
#!/bin/bash
#帮助函数
function usage(){
echo "Usage: $0 url"
exit 1
}
#检测url的函数
function check_url(){
#利用wget命令测试访问
wget --spider -q -o /dev/null --tries=1 -T 5 $1
if [ "$?" -eq 0 ]
then
echo "$1 is running.."
else
echo "$1 is no.."
fi
}
#程序开发习惯,设置一个入口函数,对需要执行的函数统一管理
main(){
if [ $# -ne 1 ]
then
usage
fi
check_url $1
}
#这里的特殊变量$*,是将所有传入进来的参数,当作一个整体
main $*
今天的文章shell开发_linux shell 菜鸟教程分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/61999.html