shell开发_linux shell 菜鸟教程

shell开发_linux shell 菜鸟教程shell_shell开发

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 判断该文件是否存在,(普通文件,目录),存在就为真,否则为假
在这里插入图片描述
在这里插入图片描述

shell开发_linux shell 菜鸟教程

在这里插入图片描述

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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注