第一章 shell基本概述

第一章 shell基本概述

1.什么是shell

shell是一个命令解释器,主要用来接收用户的指令,进入驱动操作系统,或硬件。 
Linux里有很多种shell,例如: 
Bourne Shell(/usr/bin/sh或/bin/sh) 
Bourne Again Shell(/bin/bash) 
C Shell(/usr/bin/csh) 
K Shell(/usr/bin/ksh) 
Shell for Root(/sbin/sh)

2.什么是shell脚本

shell脚本就是把命令全部放在一起执行 
shell脚本里可以包含若干个变量,循环,if判断,for循环,函数等 
变量+函数+流程控制+条件判断+shell命令 = shell脚本

3.shell可以实现什么功能

1.Linux系统支持的命令,都可以用shell实现 
2.系统优化脚本,例如:优化SSH 修改端口号 配置yum源 关闭SElinux,时间同步,安装常用软件等 操作
3.定时任务,例如每天定时备份数据库的数据 
4.日志切割脚本,定时切割日志 
5.服务启动脚本,二进制安装的服务没有systemd,可以写脚本启动 
6.代码上线脚本,将开发好的代码使用脚本部署到web服务器 
7.zabbix自定义监控脚本,使用脚本获取自定义的监控项的数值 8.跳板机脚本,可以使用shell开发一个跳板机

4.学习shell的必备技能

1.熟练的VIM技能 
2.熟练的Linux基础命令使用 
3.熟练的正则表达式和三剑客命令使用

5.学习shell的正确姿势

1.知道自己要干什么,想要什么效果 
2.拿到需求先不要立刻写脚本,先用命令行实现,然后转换成脚本 
3.先能看懂,然后模仿,然后会修改,最后能按照自己的需求编写各种shell脚本 
4.思考,练习,总结 --> 思考,练习,总结

第二章 shell入门

1.shell书写方式

1.shell脚本名称必须要有含义,切忌随便起名,在公司里容易被打。文件后缀名最好以.sh结尾。 
2.shell脚本首行建议添加使用的解释器,如:#!/bin/bash 
3.最好给自己的脚本加个注释,注释内容包含了脚本创建时间,作者,以及脚本作用等。 
4.注释尽量不要有中文 
5.脚本放在专门的目录里

举例:

#!/bin/bash #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。 
# Author: Oldzhang. 526195417@qq.com #作者名称 
# Create Time 2020/07/31 #创建日期 
# Script Description: this is my 1st shell script. #脚本描述

2.第一个shell脚本

cat > hello.sh << 'EOF'
#!/bin/bash 
echo "Hello World" 
EOF

3.shell执行方式

3.1 执行脚本命令

./test.sh 
bash test.sh 
source test.sh

3.2 首行不指定解释器

1.如果不在脚本首行指定 #!/bin/bash解释器,那么./执行的时候系统会默认调用bash来执行脚 本。
2.那是如果我的脚本是python语言写的,那么执行的使用就会报错。

3.3 首行指定解释器

1.如果首行添加了解释器./执行的时候默认会读取脚本第一行,来确定使用什么解释器运行脚本。

3.4 直接指定解释器运行

我们也可以直接指定使用什么解释器来运行,那样即使脚本首行没有添加解释器也可以运行,例如 
bash test.sh 
python test.sh

3.5 python的hello

#!/usr/bin/python3 
hello = 'hellooooo' 
print(hello)

第三章 shell变量

1.什么是变量

变量是Shell传递数据的一种方式。 
以一个固定的字符串去表示一个不固定的值,便于后续的复用和维护。

2.变量的分类

环境变量(全局变量) 对整个系统生效 
普通变量(局部变量) 只对当前的脚本生效 

变量的生存周期 
永久的 需要修改环境变量配置文件 变量永久生效 /etc/profile 
临时的 直接使用export声明变量即可,关闭shell则变量失效 

临时变量的export区别 
不加export 则只对当前的shell生效
加export 则对当前打开窗口所有的shell生效

3.环境变量配置文件生效的顺序

1.登陆Shell首先会加载/etc/profile文件 
2.然后会执行家目录中的环境变量配置文件 
3.按照执行顺序 
/etc/profile 
.bash_profile 
.bashrc 
/etc/bashrc

4.变量的命名规范

1.以大小写字母 下划线 数字 拼接成变量名,最好以字母开头,最好名字有含义,不然写着写着很容 易忘记这个变量干嘛用的 
2.变量名=变量值 等号表示给变量赋值,注意等号两边不要有空格 
3.系统的环境变量都是大写的,注意不要用系统保留的变量名称,比如PATH 
4.变量命名最好不要与系统命令冲突,比如 date=20200731

变量命名参考:

path_data #全小写
Path_Date #驼峰写法,首字母大写 
PATH_DATA #全大写

5.变量定义的几种方式

5.1 字符串定义变量

定义一个变量:

[root@m-61 ~]# name="shell"

查看变量:

[root@m-61 ~]# echo "$name" 
shell
[root@m-61 ~]# echo "${name}" 
shell

5.2 命令定义变量

使用命令定义变量:

[root@m-61 ~]# time=`date` [root@m-61 ~]# echo ${time} 
2020年 07月 31日 星期五 19:11:17 CST 
[root@m-61 ~]# time=$(date +%F) 
[root@m-61 ~]# echo ${time} 
2020-07-31

命令定义变量两种方式区别:

1.反引号 `命令` 和 $(命令) 都可以表示将命令赋值给变量 
2.建议使用$(),因为如果脚本语句里包含单引号和双引号,很容易和反引号搞混,另外也不方便阅 读。

5.3 引用变量

引用变量$和 ${}的区别:

[root@m-61 ~]# name="shell"
[root@m-61 ~]# echo "$name_host" 
[root@m-61 ~]# echo "${name}_host" 
shell_host

结论:

如果不加${},可能会造成歧义,使用${}更保险

单引号和双引号区别:

[root@m-61 ~]# echo "name is ${name}" 
name is shell 
[root@m-61 ~]# echo 'name is ${name}' 
name is ${name}

结论:

1.单引号不会解析变量,给什么,吐什么 
2.双引号可以正确解析变量

什么情况下使用单引号和双引号:

1.如果需要解析变量,就用双引号 
2.如果输出的结果要求是普通的字符串,或者需要正确显示特殊字符,则可以用单引号或者撬棍\。

6.变量的传递

6.1 位置参数传递

执行脚本的时候我们可以通过传递参数来实现变量的赋值,接受参数的变量名是shell固定的,我们不能自定义.

脚本如下:

cat > vars.sh <<'EOF' 
#!/bin/bash 
echo "#当前shell脚本的文件名: $0" 
echo "#第1个shell脚本位置参数:$1" 
echo "#第2个shell脚本位置参数:$2" 
echo "#第3个shell脚本位置参数:$3" 
echo "#所有传递的位置参数是: $*" 
echo "#所有传递的位置参数是: $@" 
echo "#总共传递的参数个数是: $#" 
echo "#当前程序运行的 PID 是: $$" 
echo "#上一个命令执行的返回结果: $?" 
EOF

执行效果:

bash vars.sh 11 22 33 44 
#当前shell脚本的文件名: vars.sh 
#第1个shell脚本位置参数:11 
#第2个shell脚本位置参数:22 
#第3个shell脚本位置参数:33 
#所有传递的位置参数是: 11 22 33 44 
#所有传递的位置参数是: 11 22 33 44 
#总共传递的参数个数是: 4 
#当前程序运行的 PID 是: 11943 
#上一个命令执行的返回结果: 0

练习题:

1.编写脚本,通过变量传参的形式免交互创建Linux系统用户及密码 
2.编写一个通过传参自动修改主机名的脚本

6.2 交互式参数传递

语法解释:

read -p "提示符: " 变量名称

脚本如下:

[root@m-61 ~]# cat read.sh 
#!/bin/bash

#-s 不回显,就是不显示输入的内容 
#-n 指定字符个数 
#-t 超时时间 

read -p "Login: " user 
read -s -t20 -p "Passwd: " passwd 
echo -e "\n====================" 
echo -e "\nlogin: ${user} \npasswd: ${passwd}"

执行效果:

[root@m-61 ~]# bash read.sh 
Login: root 
Passwd: 

==================== 

login: root 
passwd: 123456

小小练习题: 接收用户输入的各种信息创建用户和密码

需求: 
接收用户输入的各种信息创建用户 
1.交互式传递3个变量 
username 
uid 
passwd 

2.把账号密码文件保存到/tmp/user.log 
username:passwd 

执行效果: 
bash useradd.sh 
please input user name : 
please input uid : 
please input passwd :

练习题:

1.将前面练习的免交互创建用户名密码改写为交互式脚本 
2.编写一个探测主机存活的脚本,交互式的用户输入需要测试的IP地址,然后探测IP地址是否存活 
3.编写一个交互式修改主机名和IP地址的脚本 
4.编写一个交互式的创建定时任务的脚本,提示用户输入分 时 日 月 周和任务,例如: */5 * * * * /sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向 着 太 阳 出 发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值