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