Shell编程
2021-11-11 23:16:29 0 举报
AI智能生成
Shell编程概述、Shell基础入门、Shell高级进阶、系统任务设置、定时任务、虚拟机互传免密钥、执行脚本初始化
作者其他创作
大纲/内容
Shell编程概述
Kernel
Linux内核主要是为了和硬件打交道
Shell
命令解释器
描述
Shell是一个用C语言编写,它是用户使用Linux的桥梁
注意
Shell既是一种命令语言,优势一种程序语言
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核服务
图文
分支主题
Shell两大主流
分类
sh
Bourne shell(sh) ,Solaris,hpux默认shell
Bourne again shell(bash) ,Linux系统默认shell
csh
C shell(csh)
tc shell(tcsh)
图文
分支主题
#!声明
告诉系统其后路径所指定的程序即是解释此脚本的Shell程序
#! /bin/bash
echo "Hello World !"
Shell脚本执行
执行方式
输入脚本的绝对路径或相对路径
/root/helloworld.sh
./helloworld.sh
执行的必须是一个可执行文件
bash或sh + 脚本
sh helloworld.sh
当脚本没有x权限时,root和文件所有者通过该方式可以正常执行
在脚本的路径前面再加“.” 或 source
source helloworld.sh
执行方式图文展示
分支主题
区别
第一种和第二种会新开一个bash,不同bash种的变量无法共享
第三种 实在同一个Shell里面执行的
export
描述
可以将当前进程的变量传递给子进程去使用
将来配置profile的时候,所有的变量前面必须加export
图文
分支主题
注意
当参数被多次赋值时,采用就近原则
Shell基础入门
Shell变量
定义变量时,变量名不加美元符号
命令只能使用英文字母,数字和下划线,首个字符不能以数字开头
中间不能有空格,可以使用下滑线(_)
不能使用标点符号
不能使用bash里面的关键字(可用help命令查看保留关键字)
变量的类型
局部变量
局部变量在脚本命令种定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行
Shell变量
shell变量是由shell程序设置的特殊变量,shell变量中有一部分是环境变量,有一部分是局部变量
常见问题
图文
分支主题
注意
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
操作
变量的声明
name="zhangsan"
变量的调用
$name
只读变量
readonly url
删除变量
unset name
Shell的字符串
说明
字符串是shell编程中最常用数据类型
字符串可以用单引号,可以用双引号,也可以不用引号
单引号
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
单引号字符串中不能出现单独一个的单引号,但可成对出现,作为字符串拼接使用
双引号
双引号里可以由变量
双引号里可以出现转义字符
操作
声明字符串
字符串拼接--双引号
"$name"
${name}
两格式可传参
字符串拼接--单引号
'$passwd'
传参类型
字符串的长度
${#email}
返回变量长度
${email:1:4}
切片,截取索引1~4为,0开始
Shell数组
注意
bash支持一维数组(不支持多维数组),并且没有限定数组的大小
数组元素的下标由0开始编号。
获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0
操作
定义数组
注意
括号来表示数组,数组元素用“空格“符号分隔开
格式
数组名=(值1 值2 .....值n)
实例
arr1=("a" "b" "c" "d")
读取数组
格式
${数组名[下标]}
实例
reada=${arr1[1]}
b
使用 @ 符号可以获取数组中的所有元素
echo ${#arr1[@]}
4
获取数组长度
length1=${#arr1[@]}
4
length2=${#arr1[*]}
4
Shell的注释
注意
以 # 开头的行就是注释,会被解释器忽略
通过每一行加上一个 # 号设置多行注释
多行注释
<<eof
1.多行注释?
eof
<<!
2.多行注释
!
Shell参数传递
说明
执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字
图文
分支主题
实例
内容
结果
sh args.txt 11 22 33 44
Shell高级进阶
Shell运算符
算数运算符
描述
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
实例
图文参数
分支主题
关系运算符
描述
关系运算符只支持数字,不支持字符串,除非字符串的值是数字
图文参数
分支主题
实例
布尔运算符
图文参数
分支主题
实例
逻辑运算符
实例
字符串运算符
实例
图文参数
分支主题
文件测试运算符
描述
图文参数
分支主题
实例
echo打印数据
描述
Shell 的 echo 指令用于字符串的输出
操作
显示普通字符串
echo "Hello World"
显示转义字符
echo "\"Hello World\""
显示变量
name="zhangsan"
echo "$name Hello World"
显示换行
echo -e "OK! \n"
echo "Hello World"
显示不换行
echo -e "OK! \c"
echo "Hello World"
显示结果定向至文件
echo "Hello World" > myfile
原样输出字符串
echo '$name\"'
显示命令执行结果
echo `date`
test命令
描述
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
分类
数字
图文
字符串
图文
文件测试
图文
实例
Shell流程控制
if
描述
条件判断语句
格式
分支主题
实例
分支主题
case
描述
Shell case 语句为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
格式
分支主题
实例
分支主题
for
描述
当变量值在列表里,for循环即执行一次所有命令,使用变量名获取列表中的当前取值
命令可为任何有效的shell命令和语句,in列表可以包含替换、字符串和文件名
in列表是可选的,如果不用它,for循环使用命令行的位置参数
格式
分支主题
实例
分支主题
while循环
描述
while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。
格式
分支主题
实例
分支主题
break
描述
break命令允许跳出所有循环(终止执行后面的所有循环)
实例
分支主题
continue
描述
continue命令不会跳出所有循环,仅仅跳出当前循环
实例
分支主题
Shell函数
描述
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255
实例
系统任务设置
系统启动流程
1、启动计算机的硬件(BIOS)
读取时间
选择对应的启动模式(USB HDD EFI)
2、如果是Linux系统,回去找/boot目录.引导这个系统启动
3、计算机系统开始启动,读取初始化配置文件
vim /etc/inittab
启动时控制着计算机的运行级别 runlevel
运行级别图文
分支主题
id:3:initdefault: 默认runlevel为3
以runlevel=3开始启动对应的服务和组件
4、开始默认引导公共的组件或者服务
vim /etc/rc.d/rc.sysinit
5、开始加载对应runlevel的服务
vi /etc/rc3.d/
K:关机时需要关闭的服务
S:启动时需要开启的服务
数字代表了开启或者关闭的顺序
所有的文件都是软链接,链接的地址为 /etc/init.d
6、当启动完毕,所有的服务也被加载完成
运行流程图文展示
分支主题
系统服务
我们可以使用chkconfig命令查看当前虚拟机的服务
通过查看可以得知不同的级别对应到每一个服务确定本次开机自动启动
开机结束后,我们需要使用service(Centos6)Systemctl(Centos7)命令控制服务的开启或者关闭
开机自启动服务
方式
方法一:rc.local
1、首先创建脚本存放的文件夹
mkdir -p /usr/local/scripts
2、在文件夹中创建脚本文件
vim hello.sh
给予执行权限
u+x
3、去/etc/rc.d/rc.local文件中添加脚本的绝对路径
sh /usr/local/scripts/hello.sh
给予rc.local执行权限
u+x
4、重启虚拟机
reboot
方法二:chkconfig
1、创建开机自启动脚本文件
vim schoolntpdate.sh
#!/bin/bash
#chkconfig: 2345 88 99
#description:auto_run
2、给其设置执行权限
chmod u+x schoolntpdate.sh
3、将脚本拷贝到 /etc/init.d目录下
cp schoolntpdate.sh /etc/init.d/
4、添加到服务
chkconfig --add /etc/init.d/schoolntpdate.sh
5、重启服务器
reboot
图文展示
分支主题
定时任务
编辑任务
格式
* * * * * command
分 时 日 月 周 命令
参数
参数一
第1列表示分钟0~59 每分钟用*或者 */2表示
第2列表示小时0~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
参数二
*:表示任意时间都,实际上就是“每”的意思。可以代表00-23小时或者00-12每月或者00-59
分-:表示区间,是一个范围,00 17-19 * * * cmd,就是每天17,18,19点的整点执行命令
,:是分割时段,30 3,19,21 * * * cmd,就是每天凌晨3和晚上19,21点的半点时刻执行命令
/n:表示分割,可以看成除法,*/5 * * * * cmd,每隔五分钟执行一次
实例
运行
1、在系统服务中心,crond负责周期任务
systemctl status crond.service
2、添加任务,编辑当前用户的任务列表
crontab -e
3、编辑任务
4、重启crontab,使配置生效
systemctl restart crond.service
5、通过crontab -l
查看当前的定时任务
6、查看任务的历史
vim /var/spool/mail/root
7、清除任务
crontab -r
图文展示
分支主题
虚拟机互传免密钥
流程
1、三台主机分别生成秘钥
【123】vim /etc/ssh/ssh_config 在最后添加
StrictHostKeyChecking no UserKnownHostsFile /dev/null
2、将秘钥分别拷贝给自己和别人
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node01
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node02
【123】ssh-copy-id -i ~/.ssh/id_rsa.pub root@node03
123456
3、关闭主机拍摄快照
power off
执行脚本初始化
1.上传配置文件及脚本
2、在windows编译的脚本配置,可能在Linux中会有异常(两者编码方式略有不同)
异常
-bash: ./bdp.sh: /bin/bash^M: bad interpreter: No such file or directory
解决方法
vim或者vi的命令模式下,输入命令
set fileformat=unix
克隆后初始化
改主机名
vim /etc/hostname
改主机ip
vim /etc/sysconfig/network-scripts/ifcfg-ens33
自由主题
0 条评论
下一页