第一周 第4章 Linux试炼之配置与shell实战
linux高级配置
给linux设置静态ip地址
1 | 一个简单的方法: |
1 | 修改好以后还有最重要的一步,重启网卡。如果结果显示的是OK,就说明是没有问题的。 |
Linux起名字(hostname)
1 | 那针对linux机器也是一样的,ip不好记,所以针对每一台linux机器还有一个主机名,hostname,我们可以给hostname设置一个通俗易懂、方便记忆的名字。 |
1 | hostname //获取主机名 |
Linux的金钟罩铁布衫(防火墙)
1 | 我们在学习阶段,建议关闭防火墙,因为在后面我们会使用到多台机器,如果不关闭防火墙,会遇到机器之间无法通信的场景,比较麻烦,在实际工作中这块工作是由运维负责管理的,我们不需要关注这块。 |
1 | 针对防火墙的关闭也分为两种方式,临时关闭和永久关闭, |
1 | centos7: |
linux之shell编程
什么是shell
1 | shell编程其实就是把之前在shell中执行的单个命令按照一定的逻辑和规则,组装到一个文件中,后面执行的时候就可以直接执行这个文件了,这个文件我们称之为shell脚本。 |
我的第一个shell脚本
1 | shell脚本的后缀倒没有那么严格的要求,只是建议大家以.sh结尾,这算是一个约定,大家都遵守这个约定,后期只要看到.sh结尾的文件就知道这个是shell脚本了。 |
1 | >>> vi hello.sh |
执行我的shell脚本
1 |
|
1 | 其实bash和sh在之前对应的是两种类型的shell,不过后来统一了,我们在这也就不区分了,所以在shell脚本中的第一行引入/bin/bash,或者/bin/sh都是一样的,这块大家知道就行了。 |
1 | 注意了,大家在看其它资料的时候,资料中一般都会说需要先给脚本添加执行权限,然后才能执行,为什么我们在这里没有给脚本增加执行权限就能执行呢? |
1 | 主要原因是这样的,因为在这里我们直接指定的文件名称,前面没有带任何路径信息,那么按照linux的查找规则,它会到PATH这个环境变量中指定的路径里面查找,这个时候PATH环境变量中都有哪些路径呢,我们来看一下 |
1 | 打开/etc/profile文件,在最后一行添加export PATH=.:$PATH,保存文件即可 |
1 | 最后再讲一个小命令,shell脚本的单步执行,可以方便脚本调试 |
shell中的变量
1 | 学习任何编程语言都需要先学习变量,shell也不例外,但是要注意,shell中的变量不需要声明,初始化也不需要指定类型,shell是一门弱类型的语言,JAVA则是强类型的语言,需要提前声明变量,并且指定变量类型。 |
1 | shell中变量的命名要求: |
1 | 创建一些变量,执行之后提示-bash: name: command not found的都表示是错误的,执行成功的话是没有任何输出的,没有反馈就是最好的结果 |
1 | 打印变量的值,通过echo命令 |
1 | 有什么区别吗? |
变量的分类
1 | shell中的变量可以分为四种: |
本地变量
1 | 本地变量的格式是VAR_NAME=VALUE |
1 | 当前shell的子进程进入方法: |
环境变量
1 | 它的格式为:export VAR_NAME=VALUE |
1 | 注意了,在实际工作中我们设置环境变量一般都是需要让它永久生效,这种临时的并不适用,如何设置为永久的呢? |
位置变量
1 | 在进行shell编程的时候,有时候我们想给shell脚本动态的传递一些参数,这个时候就需要用到位置变量,类似于$0 $1 $2这样的,$后面的数字理论上没有什么限制, |
1 | 创建一个脚本文件,location.sh 在里面打印一下这些位置变量看看到底是什么内容 |
特殊变量
1 | 最后来看一下shell中的特殊变量,针对特殊变量我们主要学习下面列出来的两个 |
1 | 首先是$? |
1 | 第二个特殊变量是$#,它表示的是shell脚本所有参数的个数 |
变量和引号的特殊使用
1 | 前面我们学习了shell中的变量,那针对变量和引号在工作中有一些特殊的使用场景 |
1 | 双引号解析变量 |
1 | 反引号 执行并引用命令的执行结果 |
1 | 最后还有一个大招 大家注意一下 |
linux shell 字符串中指定字符替换
1 | echo ${string/23/bb} //abc1bb42341 替换一次 |
shell中的循环和判断
for循环
1 | 第一种格式:和java中的for循环格式有点类似,但是也不一样 |
1 | 这一种格式适合用在迭代多次,步长一致的情况 |
while循环
1 | while循环主要适用于循环次数未知,或不便于使用for直接生成较大列表时 |
1 | test EXPR 或者 [ EXPR ] ,第二种形式里面中括号和表达式之间的空格不能少 |
1 | [root@bigdata01 shell]# vi while1.sh |
1 | 中括号这种,看起来比较清晰 |
if判断
1 | if判断分为三种形式 |
单分支
1 | 单分支 |
1 | [root@bigdata01 shell]# vi if1.sh |
1 | 改进 |
双分支
1 | 格式如下: |
多分支
1 | 格式如下: |
shell扩展
shell后台运行
1 | 在实际工作中会遇到这种情况,针对带有while无限循环的shell脚本,我们希望它能够一直运行,不影响我在这个窗口执行其它操作 |
1 | 但是当我们把这个窗口关闭以后会发现之前放到后台运行的shell脚本也停止了,我们是希望这个脚本能够一直在后台运行的 |
1 | 如何保证关闭shell窗口而不影响放到后台的shell脚本执行呢? |
1 | [root@bigdata01 shell]# nohup sh while2.sh & |
标准输出、标准错误输出、和重定向的用法
1 | 标准输出:表示是命令或者程序输出的正常信息 |
1 | 标准输出可以使用文件描述符1来表示,标准错误输出可以使用文件描述符2来表示 |
1 | 演示一下重定向 >,这里的1表示把标准输出重定向到文件中 |
1 | 重复执行此命令会发现文件内的内容没有变化,这是因为 > 会覆盖掉之前的内容 |
1 | 如果想要追加的话需要使用 >> |
1 | 注意,这里的1可以省略,因为默认情况下不写也是1 |
1 | 标准错误输出的用法和这个一样,标准错误输出需要使用2,使用1是无法把这个错误输出信息重定向到文件中的 |
1 | #注意 1和2与>之间不能有空格 |
1 | 最后来看一个综合案例 |
Linux中的定时器crontab
1 | crontab的格式是这样的:* * * * * user-name command |
1 | 查看crontab服务状态:systemctl status crond |
1 | 下面我们就来配置一个。 |
1 | 然后在/etc/crontab文件中配置 |
1 | 现在这种情况脚本执行之后的结果我们是没有保存的,如果让crontab定时去调度执行,我们压根就看不到执行的结果信息,所以需要把脚本执行的结果重定向到一个文件中, |
1 | 如果我们执行的脚本确实不会产生任何输出信息,那么我们如何确认脚本是否被成功调度了呢? |
1 | 如果这个任务暂时不想调度了,想临时停止一段时间,可以修改配置文件,在这一行配置前面加上#号就可以了,这样这一行配置就被注释了,后期想使用的时候把#号去掉就可以了。 |