(超详细)Linux Shell 编程

Shell的定义

Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等。 用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话方式,称为交互的方式。
当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本。 在Shell脚本里内置了很多命令、语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行脚本的方式称为非交互的方式。 Shell脚本语言很适合用于处理纯文本型的数据,而Linux系统中几乎所有的配置文件、日志文件,以及绝大对数的启动文件都是纯文本类型的文件。

[root@localhost ~]# cat /etc/shells
/bin/sh (指向/bin/bash)
/bin/bash (默认shell类型)
/usr/bin/sh
/usr/bin/bash

请添加图片描述

shell脚本:

​ 关键字

​ Linux命令

​ shell自带命令

​ 函数

​ 控制语句

.sh 作为文件后缀,代表是shell脚本

/etc/profile ~/.bash_profile ~/.bashrc ~/etc/bashrc(以最后一个生效)

shell脚本类型:请添加图片描述

脚本书写规范

​ #!/bin/bash

添加注释信息

#日期,#作者,#作用,#版本,#联系方式…

#Date:2022-6-12

#Author:

#Desc:

#Vers:

#Email:

文件名后缀 .sh

shell脚本执行:请添加图片描述

shell脚本编写规范:
写shell脚本时,命令用反单引号括起来``
设置变量 name=upper(等号两边不能有空格)

成对的符号,建议一次性写完 () {} [] ’ ’ " " ``

对于流程控制语句,应一次性将格式写完,再添加内容。缩进最好空四个


if  []

   then(注意缩进)

fi

for 

do 

...

done

变量

变量赋值方法

​ 变量名="值 "(=左右两边没有空格)

​ echo $变量名(进行输出)

对于环境变量:变量名大写

​ set命令:查看环境变量
env命令:查看全局变量
declare:用来做定义
unset NAME:取消变量/删除变量
    eg :
      # unset A 撤销变量 A
      # readonly B=2 声明静态的变量 B=2 ,不能 unset
用户自定义只在set中有;env中没有
请添加图片描述
请添加图片描述
请添加图片描述

自定义环境变量

​ (仅在当前环境有效)

​ 1、export 变量名=值

​ 2、变量名=值;export 变量名

​ 3、declare -x 变量名=值

赋值用= ; 相等用==

用户级环境变量

~/.bashrc

全局环境变量

/etc/profile

/etc/bashrc

/etc/profile.d:存放脚本

取消环境变量:unset 变量名

局部变量

变量名=值
变量名=‘值’
变量名=“值”
变量名=command
变量名=$(command)
变量数组
特殊变量

赋值时引号的作用:

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值,$视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果 全局变量的定义方法 export 变量名

字符串变量:
请添加图片描述
数组:
请添加图片描述
获取数组元素:请添加图片描述

位置变量!!!

​ $0 获取当前shell脚本文件名

​ $n (n>0) 代表参数值

$@ 代表命令行中所有的参数
$# 代表命令行中所有参数的个数
$* 代表命令行中所有的参数

$? 获取上一条命令执行的状态返回值 0代表成功,非0代表失败
$$ 获取当前shell的进程ID
$! 获取上一个后台程序的进程ID(后台运行的最后一个进程号)
$_ 获取上一条命令或者脚本的最后一个参数

命令变量传递用法
请添加图片描述

echo

-n
-e
\t 制表符
\v 垂直制表符
\n 换行符
\r 回车
\b 退格

read

read option 变量名
-t 等待事件
-p 提示信息
${parameter:-word} 变量为空或未赋值,用word代替
${parameter:=word} 变量为空或未赋值,把变量值设置为word
${parameter:?word} 变量为空或未赋值,把word当作报错信息
${parameter:+word} 变量为空或未赋值,什么都不做,否则替换为word
-d 定界符 遇到这个字母终止读取
-e 交互式
-n:字符限制
-r:搭配/ 换行,表示未终止
-s:输入时字符不回显
请添加图片描述
read交互式
请添加图片描述

运算符:

+ - * / % 加 减 乘 除 取余
++ –
** 幂运算(自己乘自己)
== !=
< <= > >=
= += -= *= /= %=
&& || ! 与 或 非
请添加图片描述

(())
let (let赋值表达式)
请添加图片描述

$[]
请添加图片描述

bc 交互式运行,Ctrl+c退出
请添加图片描述
请添加图片描述

expr (运算时,运算符号和数字之间要有空格)
请添加图片描述
declare

(())
((i=i+1))
i=((i+1))
((2>1&&1=1)) 0代表flase 1代表true
请添加图片描述

条件测试:

test测试表达式
[ 测试表达式 ] !!!注意中括号两边空格
[[ 测试表达式> ]]
(( 测试表达式 ))

请添加图片描述
请添加图片描述
整数二元比较操作符:
请添加图片描述
逻辑操作符:
请添加图片描述

文件测试:

-d 文件存在且为目录则为真
-f 文件存在且为普通文件则为真
-e 文件存在则为真
-r 文件存在且可读则为真
-s 文件存在且大小不为0则为真
-w 文件存在且可写则为真
-x 文件存在且可执行则为真
-L 文件存在且为链接文件则为真
f1 -nt f2 newer than f1比f2新则为真
f1 -ot f2 older than f1比f2旧则为真

字符串测试:

-n 长度不为0则为真
-z 长度为0则为真
“str1” = “str2” 两个字符串相等为真,等号两端需要有空格,字符串需要加引号
“str1” != “str2” 两个字符串不相等为真,等号两端需要有空格,字符串需要加引号

整数比较

[] test
-eq
-ne
-gt
-ge
-lt
-le
[[]] (())
== =
!=
>
>=
<
<=

练习题1:
请添加图片描述
1、
请添加图片描述
请添加图片描述
2、
请添加图片描述

练习题2:
编写一个计数器:(注意expr格式要求很严格)
请添加图片描述
请添加图片描述
练习题3:
编写shell脚本获取用户的输入,
1、当用户输入的内容是文件时,输出文件内容,如果文件是shell脚本,则判断是否有执行权限,没有则添加,有则直接执行
2、当用户输入的内容是目录时,则输出目录下的内容
3、当用户输入一个链接文件时,可以查看此链接文件
4、当用户输入的内容不在此系统中,则提示“您输入的文件或目录不存在!”
请添加图片描述
请添加图片描述

cut:数据剪切
-b:以字节进行切割
-c:以字符切割
-d:指定分割符
-f:搭配-d使用指定显示那个区域

练习题4:
请添加图片描述
case 条件判断语句
case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整,常被应用于实现系统服务启动脚本等企业应用场景中。

case  变量  in
        one)
            命令
;;
        two)
             命令
;;
         *)   #*代表剩下的其他的
             命令
esac

for循环语句

for  条件
do
   命令
done
 
##或
 
for  条件;do
   命令
done

(seq序列)
请添加图片描述
(遍历数组中元素)
请添加图片描述

while循环语句

while  条件
do
   命令
done

请添加图片描述
break、continue、exit 循环控制语句
break 、continue在条件语句及循环语句(for、while、if等)中用于控制程序走向;而exit则用于终止所有语句并退出当前脚本。
请添加图片描述
请添加图片描述

shell函数

Shell 函数定义的语法格式如下:

function name() {
    
    
    statements
    [return value]
}

说明:
function是 Shell 中的关键字,专门用来定义函数;
name是函数名;
statements是函数要执行的代码,也就是一组语句;
return value表示函数的返回值,其中 return 是 Shell 关键字,
专门用在函数中返回一个值;这一部分可以写也可以不写。
由{ }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

函数调用
调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
name
如果传递参数,那么多个参数之间以空格分隔:
name param1 param2 param3
不管是哪种形式,函数名字后面都不需要带括号。
和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。
练习1、定义一个函数,计算所有参数的和:

#!/bin/bash
function getsum(){
    
    
local sum=0
for n in $@
do
   ((sum+=n))
done
return $sum
}
getsum 10 20 55 15 #调用函数并传递参数
echo $?
#$@表示函数的所有参数,$?表示函数的退出状态(返回值);
#此处我们借助 return 关键字将所有数字的和返回,并使用$?得到这个值,这种处理方案在其它编程语言中没有任何问题,
#但是在 Shell 中是非常错误的,Shell 函数的返回值和其它编程语言大有不同。
#函数返回值在调用该函数后通过 $? 来获得。
#local命令表示声明的变量是本地变量,多在函数内部使用

例子:(磁盘使用率)
请添加图片描述
请添加图片描述
请添加图片描述
Shell 输入/输出重定向
在这里插入图片描述
请添加图片描述
请添加图片描述

练习2、编写一个计算器(使用函数)

> #!/bin/bash
cat << EOF
———————————————————————
欢迎使用shell计算器
1、加法
2、减法
3、乘法
4、除法(除数不为0)
5、幂运算
6、退出
———————————————————————
EOF
function addition() {
    
    
    add=$((a+b))
    echo "a+b为:"$add
}
function subtraction() {
    
    
    sub=$((a-b))
    echo "a-b为:"$sub
}
function multiplication() {
    
    
    mul=$((a*b))
    echo "a*b为:"$mul
}
function division() {
    
    
    div=$((a/b))
    echo "a/b为:"$div
}
function mi_yunsuan() {
    
    
    mi=$((a**b))
    echo "a**b为;"$mi
}
while [[ True ]]
do
    read -p "请输入运算类型:" i
    read -p "请输入两个数进行计算:" a b
    case $i in
        1)
            addition
            continue
    ;;
        2)
            subtraction
            continue
    ;;
        3)
            multiplication
            continue
    ;;
        4)
            division
            continue
    ;;
        5)
            mi_yunsuan
            continue
    ;;
        6)
           echo "运算结束,退出!"
           break
    esac
done

请添加图片描述
请添加图片描述
请添加图片描述

mail命令

查看有没有postfix,如果有的话进行卸载(yum remove postfix)
请添加图片描述
安装mail命令:yum -y install mailx
详细过程进入此链接

set [email protected] #此处设置发件人的信息
set smtp=smtp.163.com #此处配置对应邮箱的stmp服务器
set [email protected] #此处配置发件人邮箱地址
set smtp-auth-password=TXFJCVVAQXORJNSR #客户端授权码,不是邮箱地址密码
set smtp-auth=login
注意:
请添加图片描述

[root@localhost tmp]# systemctl restart network #添加完DNS要重启网卡
[root@localhost ~]# echo "Content" | mail -s "Title" [email protected] #发邮件
注意:
echo "发送的内容" | mail -s "标题" 发送的邮箱

(接近实战的shell)

检测CPU使用率、检测磁盘使用率、检测内存使用率
1、检测CPU使用率
top命令

使用压缩命令占满CPU,再执行top命令进行查看

下面命令会创建 CPU 负荷,方法是通过压缩随机数据并将结果发送到 /dev/null:

cat /dev/urandom | gzip -9 > /dev/null

cat /proc/stat

cpu利用率=(user_pass + system_pass)*100%/(user_pass + system_pass + idle_pass)


2、磁盘的使用率

df -h命令查看


3、内存的使用率

free -m

使用量除以总量 看百分比

猜你喜欢

转载自blog.csdn.net/qq_50685659/article/details/125738428
今日推荐