【Linux学习(2)】----shell编程篇(1)
Linux下的shell编程学习
一、shell脚本(需要解释器)
1.系统命令的堆积
2.特定的语法+系统的命令=文件
二、shell脚本能做什么:
基于标准化之上的 -> 工具化
作用:简化操作步骤,提高效率,减少人为干预,减少系统故障
1.自动化地完成基础配置
(系统初始化操作、系统更新、内核调整、网络、时区、SSH优化)
2.自动化安装程序
(自动化安装LNMP、LAMP、MySQL、Nginx、Redis)
3.自动化调整配置文件:
(Nginx Conf、MySQL Conf)
4.自动化部署业务(代码)
部署php、java、秒级回退
5.自动化定期备份回复程序
(MySQL全备+增量+binlog+crond+shell脚本)
6.自动化信息的采集(Zabbix + shell)
硬件、系统、服务、网络等等
7.日志的收集(ELK)
收集->存储->展示->分析
日志分析(取值—>排序->去重->统计->分析)
8.自动化扩容/缩容(zabbix+shell)
监控服务器,如果发现当某一个云主机cpu持续80%+触发动作(脚本)
脚本:调用api开通云主机->初始化环境->加入集群->对外提供
当前CPU使用率20%->判断有多啊好烧脑web结点->判断是否超过预设-(超)->缩减到对应预设状态->变更负载的配置
9.shell什么都能做,但要符合实际情况以及实际业务需求
tip:编写shell脚本的小思路:1.取行->取值->对比->判断->输出->修改(监控)
三、Shell技能
特性:
变量
自定义变量
系统环境变量
预定义变量
位置参数变量
内置
条件判断,循环语句,流程控制,函数,数组,正则表达式
四、利用vim编写文本
vi 文件名称
{
echo "123"
}
此时文件是没有执行权限的,只有读写权限,若要可执行,则:
chmod u+x 文件名称
文件的运行可以有以下三种运行方式:
./文件名称 {但凡是 ./文件名称 均把此文件当做脚本去运行里面的命令。但需要添加执行权限}
bash 文件名称 {是使用bash shell解释器去执行文件中的命令,在解释器中执行,故文件不需要添加执行权限}
sh 文件名称 {等同于 bash 文件名称}
为了能够帮助系统更好地识别文本中的内容,通常在文本中的首行添加解释器路径,如 #!/bin/sh(不同的机子路径不同),若不在头部加解释器,那么只能指明解释器再运行文本中的内容。但在首行添加了解释器路径后,仍然需要给已经编写好的文件添加执行权限。故将文本内容修改为
vi 文件名称
{
#!/bin/sh
echo "123"
}
五、bash shell的特性
1.自动补全: table 如果写错,则无法补全
2.命令历史: history
3.别名: alias {查看当前shell文件的别名,如 alias tt="echo tt"+回车+tt+alias,可以查看到当前shell的别名} unalias
4.常用快捷键:Ctrl+u、k、a、e、l、c、z、d、w、r、y
5.前台后台的作业控制: bg、fg、jobs、screen
6.输入输出重定向 >,>>,1>,2>>,&>,cat <(表示读入一个文件)
7.管道 | 左边命令结果 {如 ls | grep ta 表示查找当前目录中到有 ta 名字的文件}
8.命令排序:{
; 可以将两个命令连续执行,且前面命令执行结果不影响后面命令的执行结果
&& 可以将两个命令连续执行,且前面命令执行不成功后面命令不执行
|| 可以将两个命令连续执行,且前面命令执行不成功后面命令继续执行
}
9.转义 \
10.颜色
{
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 向日葵色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天篮字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
echo -e "\033[40m 黑底色 \033[0m"
echo -e "\033[41m 红底色 \033[0m"
echo -e "\033[42m 绿底色 \033[0m"
echo -e "\033[43m 黄底色 \033[0m"
echo -e "\033[44m 蓝底色 \033[0m"
echo -e "\033[45m 紫底色 \033[0m"
echo -e "\033[46m 天篮底色 \033[0m"
echo -e "\033[47m 白底色 \033[0m"
}
11.shell的内置命令:
exit 退出整个程序
break 结束当前循环,或跳出本层循环
continue 忽略本层循环剩余代码,直接进行下一次循环
六、shell变量
基本实例,在打开终端后,可以直接输入
{
a=1
b=2
c=$a+$b
echo $c|bc
}
自定义变量:
1.定义变量 变量名字=变量值
2.引用变量 $变量名字 或者 ${变量名字}常量名字
3.查看变量 echo $变量名字
set 显示所有变量,包含自定义变量和环境变量
4.取消变量 unset 变量名字 作用范围:仅在当前shell中有效
系统变量:
定义环境变量 export 变量,将自定义的变量转换为环境变量
引用环境变量 $变量名字 或者 ${变量名字}常量名字
查看环境变量 echo $变量名字 | grep 限制条件
取消环境变量 unset 变量名称
变量作用范围 在当前shell和子shell有效
位置参数变量
脚本参数传参: $1-9,${10},${11},${12}
例如
{
#!/bin/sh
read -p "please input anumber:" k
t=9
echo "this is $1"
echo "this is $2"
echo "this is $3"
echo "this is test $t"
echo "this is k $k"
}
预定义变量:
$0 脚本名称
{若要只显示文件全名称,则要求使用 basename 全路径+文件名称.文件类型}
$* 所有参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$!上一个后台进程的 PID
$?上一个命令的返回值 0 表示成功
例如{
#!/bin/sh
echo "index 3 is $3"
echo "index 2 is $2"
echo "index 1 is $1"
echo "all number: $*"
echo "all number: $@"
echo "number length is: $#"
echo "now the PID is: $$"
echo '$0='$(basename $0)
echo '$4='$4
echo '$5='$5
echo '$6='$6
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
}
关联数组:
1.定义关联数组,声明是关联数据
declare -A 数组名称
赋值法一:
数组名称[属性1]=属性值1
数组名称[属性2]=属性值2
数组名称[属性3]=属性值3
赋值法二:
数组名称=([属性1]=属性值1 [属性2]=属性值2 [属性3]=属性值3)
数组的显示:
数组值的显示 echo ${数组名称[*]} 或 echo ${数组名称[@]}
数组键的显示 echo ${!数组名称[*]} 或 echo ${!数组名称[@]}
瞬时显示数组赋值:declare -A
实例
{
#!/bin/bash
declare -A tt_array_1
tt_array_1[name]=zhangsan
tt_array_1[age]=18
tt_array_1[skill]=linux
declare -A tt_array_2
tt_array_2=([name]=tt [age]=18 [sex]=m [book]=linux)
echo ${tt_array_1[*]} 或 echo ${tt_array_2[@]} #打印所有元素值
echo ${!tt_array_1[*]} 或 echo ${!tt_array_2[@]} #打印键
declare -A
}
tip:onsql数据库之所以快是因为它采用了键值对
七、变量赋值与输出的方式
变量赋值于输出实例:
{
#!/bin/sh
ip1=12345
school="high shcool"
today=`date +%F`
today1=$(date +%F)
echo $ip1
echo $school
echo $today
echo $today1
}其中today和today1的显示方式一样,即两种变量的赋值效果是一样的
1.显示赋值:
变量名称=变量值
2.read 从键盘读入变量值
read -p "提示信息:" 变量名称
read -t 时间(秒位单位) -p "提示信息:" 变量名称 限制输入变量的时间
其中(针对本人的Linux系统有){
{
#!/bin/bash
read -t 5 -p "please name: " name
}此情况下只有 ./文件名称 才可以正确运行
{
#!/bin/sh
read -t 5 -p "please name: " name
}此情况下只有 bash 文件名称 才可以正确运行,表示只有在程序启动5秒内才能输入信息
若超过5秒则程序终止
}
read -n2 -p "提示信息: " 变量名称 变量仅接收两个字符且无需按回车键
其中(针对本人的Linux系统有){
{
#!/bin/sh
read -n2 -p "提示信息 " 变量名称
echo "输出信息:$变量名称"
}此情况下只有 bash 文件名称 才可以正确运行
}
3.变量的输出
"" 与 ''
{
#!/bin/sh
xyz=1000phone
echo "${xyz} is good" 解析变量,将变量内容展示出来
echo '${xyz} is good' 不解析变量,在''是什么内容就展示什么内容,这可以输出特殊字符
}
``与$()
{
today=`date +%F`
today1=$(date +%F)
echo $today
echo $today1
}today和today1的显示方式一样,即两种变量的赋值效果是一样的,
但是命令必须用 变量=$(命令) 的方式才能交命令结果赋值于变量
八、变量的数值运算:
1.整数运算:
{
a=1
b=2
expr $a +、-、\*、%、/ $b
}
{
echo $((数字 +、-、*、%、/、**、^ 数字))
运算顺序遵从数学运算
}
{
echo $[数字 +、-、*、%、/、**、^ 数字]
运算顺序遵从数学运算,可以嵌套()但不能嵌套[]
}
{
let 变量名称=数字 +、-、*、%、/、**、^ 数字
echo $变量名称
}
2.小数运算
{
echo "小数 +、-、*、%、/、**、^ 小数" 在用除法时仅输出结果整数部分
}
{
echo "scale=2;4/8" |bc 定义以两位小数输出
}
九、变量替代
unset 变量1 清空变量中已经存在的值
${变量名-新的变量值}
变量没有被赋值:会使用“新的变量值”替代;变量有被赋值(包括空值)则不会被替代
${变量名:-新的变量值}
变量没有被赋值(包括空值):会使用“新的变量值”替代;变量有被赋值(不包括空值)则不会被替代
十、变量的自增
此处的变量自增同常见编程语言的变量自增,如
{
#!/bin/bash
read -p "input anumber : " a
echo "you input is $a"
if [ $a -le 5 ];then
let ++a
echo "you input ++a is $a"
else
let --a
echo "you input --a is $a"
fi
}在本人的linux系统中,只有 bash 文件名称 才能执行
{
#!/bin/bash
read -p "input anumber : " a
echo "you input is $a"
while [ $a -le 5 ];do
let a++
echo "you input a plus one is :$a"
done
}在本人的linux系统中,只有 bash 文件名称 才能执行
十一、流程控制语句:
1选择If语句
单分支:
{
if [ 条件1 ];then
结果1
fi
}
双分支:
{
if [ 条件1 ];then
结果1
else
结果2
fi
}
多分支:
{
if [ 条件1 ];then
结果1
elif [ 条件2 ];then
结果2
elif [ 条件3 ];then
结果3
else
结果4
fi
}
2 选择case语句:
{
case 变量 in
模式 1)
命令序列1
;;
模式 2)
命令序列2
;;
模式 3)
命令序列3
;;
*)
无匹配后命令序列
esac
}
case实例:
实例{
#!/bin/bash
read -p "请输入数字:" num
case $num in
1)
echo "你输入的是1"
;;
2)
echo "你输入的是2"
;;
*)
echo "你输入的不是1也不是2"
exit 1
esac
}
流程控制for循环
{
for 变量名称 in {取值列表}
do
循环体
done
}
for循环实例
实例一{
#!/bin/bash
for i in {1..5}
do
echo 123
done
}
实例二{
#!/bin/bash
for i in a b c d e f
do
echo 123
done
}
流程控制while循环
{
while 条件测试
do
循环体
done
}
while实例
实例一:每隔1秒钟打印一次日期{
while date
do
date
sleep 1
done
}此程序需要Ctrl+c才能停止
十二、函数
一、函数的作用
1.自定义一堆命令
2.避免大量的重复代码,加强可读性
3.可以只定义函数,如不被调用则不被执行
二、定义函数
方式一:
function 函数名称(){函数体}
方式二:
函数名称(){函数体}
2.调用函数(函数要先定义,再使用)
方式一:
直接调用函数名称
3.函数返回值
return 整数值
4.函数传参
1.函数的参数可以是用户直接输入
2.函数的参数可以是set内置输入(重置)
3.fun $1 传入脚本后第一个参数
4.fun $* 接收所有参数的传递
实例
1.判断某个文件是否存在{
#!/bin/sh
file=文件路径/文件名称.文件类型
j_file(){
if [ -f $file ];then
echo "此文件存在"
return 0
else
echo "此文件不存在"
return 1;
fi
}
j_file
}
2.判断用户输入数字等级{
#!/bin/sh
g_num(){
read -p "请输入1-10的一个整数:" num
if [ $num -ge 0 -a $num -le 3 ];then
echo "你输入的等级是:A"
return 0
elif [ $num -ge 2 -a $num -le 5 ];then
echo "你输入的等级是:B"
return 1
elif [ $num -ge 4 -a $num -le 7 ];then
echo "你输入的等级是:C"
return 2
elif [ $num -ge 6 -a $num -le 9 ];then
echo "你输入的等级是:D"
return 3
elif [ $num -ge 8 -a $num -le 11 ];then
echo "你输入的等级是:E"
return 4
fi
}
g_num
}
以上是本人今日小节,不喜勿喷,感谢理解
相关连接:
更多推荐
所有评论(0)