Shell脚本:
利用 if…then
单层、简单条件判断式
如果你有一个判断式要进行,那么我们可以简单这样看:
if [ 条件判断式 ] ; then
当条件判断成立时,可以进行的命令
fi
如果有多个条件要判别时,除了将许多条件写入一个中括号外,还可以用多个中括号隔开,中间用 &&(and)或 ||(or)连接。
现在我们来改写一下前面写的ans_yn.sh
原来的时候:
通过if语句升级:
多重、复杂条件判断式
if [ 条件判断式 ] ; then
当条件判断式成立时,可执行的命令
else
当条件判断式不成立时,可执行的命令
fi
如果是更复杂的话,则可以这样
if [ 条件判断式一 ] ; then
当条件判断式一成立时,可执行命令
elif [ 条件判断式二 ] ; then
当条件判断式二成立时,可执行命令
else
当条件判断式一与二均不成立时,可执行的命令
fi
接下来我们再进化一下ans_yn.sh
我们再来做个示例,我们想让用户输入 hello 这个关键词时,利用参数的方法可以这样依序设计:
1、 判断$1是否为hello,如果是的话,就显示“Hello,howareyou?”;
2、 如果没有加任何参数,就提示用户必须要使用的参数执行法;
3、 而如果加入的参数不是hello,就提醒用户仅能使用hello作为参数;
整个程序的编写如下:
下面我们来多学一个命令——netstat,这个命令可以查询到目前主机开启的网络服务端口(service ports),相关的功能我们会在服务器架构设篇继续介绍,这里你只要知道,我可以利用【netstat -tuln】来获取目前主机设备启动的服务,获取的信息像是这样
上面的重点是【Local Address(本地主机的IP与端口对应)】那个字段,它代表的是本机所启动的网络服务,IP的部分说明的是该服务位于哪个接口上。若为127.0.0.1则是仅针对本机开放,若是 0.0.0.0 或 ::: 则代表对整个 Internet 开放。假设我想知道我的主机某些端口(21、22、25、80)是否开放,那我可以写一个这样的脚本:
再来看一个例子,当兵是国民应尽的义务,不过,在当兵的时候却总想着退伍,那咱们来写个脚本,实现让用户输入他的退伍日期,然后脚本计算出他还有几天才退伍?
看起来很难,其实利用好 date 命令,这个并不难
利用 case…esac 判断
case可以来处理多个变量的情况
case $变量名称 in <==关键字case,还有变量前有美元符
"第一个变量内容") <==变量内容建议用双引号,关键字是右括号
程序段
;; <==每个类别的结尾使用两个分号来处理
"第二个变量内容")
程序段
;;
*) <==最后一个变量内容使用*代替其他所有值
不含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac <==最终的case结尾
利用function 功能
什么是函数功能?简单来说,其实,函数可以在shell脚本中做出一个类似自定义执行命令的东西,最大的功能是可以简化我们很多的程序代码。
function的语法是这样的
function fname(){
程序段
}
因为shell脚本的执行方式是由上而下、由左而右,因此在shell脚本中的function的设置一定要在程序的最前面
另外,function也是拥有内置变量的,它的内置变量与shell脚本很类似,函数名称代表示 $0,而后续接的变量也是以$1、$2…来替换,这里很容易搞错。我们再来改写一下上面的例子
循环(loop)
while do done、until do done(不定循环)
不定循环最常见的就是下面的两种状态
while [ condition ] <==中括号内的状态就是判断式
do <==do是循环的开始
程序段落
done <==done是循环的结束
until [ condition ] <==中括号内的状态就是判断式
do <==do是循环的开始
程序段落
done <==done是循环的结束
这两并不一样,while是说condition成立的时候一直循环,until则是当condition成立才退出循环。
我们来测试一下
再来看一个累加到100的例子
答案:5050
for…do…done(固定循环)
来看一个简单示例就懂了
输出三行就是 There are dog、 There are cat、 There are elephent
很好理解,这是一个经典的foreach循环结构
快速查看本机用户的uuid
检测网络可ping主机
上面的seq意思是sequence的意思,代表后面接的两个数值是一直连续的。$(seq 1 100)等同于{1..100}
for…do…done的数值处理
除了上面的方法之外,for循环还有另外一种写法,语法如下
for (( 初始值; 限制值; 赋值运算 ))
do
程序段
done
for后面括号内的三串内容的意义为:
- 初始值:某个变量在循环中的起始值
- 限制值:当变量的值在这个限制值的范围内,就继续循环
- 赋值运算:每做一次循环时,变量也变化,例如i=i+1
看示例,从1累加到用户输入的值
搭配随机数与数组的实验
示例:中午吃什么好呢?
- eated 是一个控制循环的变量
$
{RANDOM}*n/32767,返回一个0到n-1的整数值- eatecon数组保存的是已经选择的eat数组里的下标
- 如果有重复选择的,才会进入第一个if里的for里的那个if,它控制mycheck=1,也就不会进入第二个if了,这轮随机数就作废了
shell脚本的跟踪与调试
sh命令可以帮助我们了解脚本文件是否存在语法问题
sh [-nvx] scripts.sh
-n:不要执行脚本,仅检查语法的问题
-v:在执行脚本前,先将脚本文件的内容输出到屏幕上
-x:将使用到的脚本内容显示到屏幕上
- 使用-n,若什么也没有输出,则没有语法错误
- 使用-x,在+后面的数据都是使用到的命令串。
过场:
shell脚本部分到此结束,后面我们又会和硬件、配置、磁盘这些东西江湖再见了,在此之前,这里来个小记录,怎么给终端修改颜色,打造个性Linux。
LinuxDIY:
登录信息:
还记得Linux的基本学习(七)我们聊得吗?
bash的登录与欢迎信息:/etc/issue、/etc/motd
我们可以通过cat /etc/issue来查看我们bash的登录信息
里面的信息对应内容如下:
\d:本地端时间的日期
\I:显示第几个终端页面
\m:显示硬件等级(i386/i486/i586)
\n:显示主机的网络名称
\O:显示domain name
\r:操作系统的版本(相当于 uname -r)
\t:显示本地端时间的时间
\S:操作系统的名称
\v:操作系统的版本
接下来,任由你改!
另外,除了/etc/issue之外还有个/etc/issue.net,这是提供给telnet,这个远程登录程序用的。当我们使用telnet连接到主机时,主机的登录画面就会显示/etc/issue.net。
至于如果您想要让用户登录后取得一些信息,例如您想要大家都知道的信息,那么将信息加入到/etc/motd里面。
这样就可以修改个性的登录信息了。
提示信息:
还是在【Linux的基本学习(七)】,我们知道可以修改变量PS1来实现改变提示信息
-
PS1:(提示字符的设置,默认是 ‘[\u@\h \W]\
$
’) -
- \d :可以显示日期格式【星期 月 日】,如:【Mon Feb 2】
-
\H :完整的主机名
-
\h :仅取得主机名在第一个小数点之前的名字
-
\t :显示时间(24小时格式)【HH:MM:SS】
-
\T :显示时间(12小时格式)【HH:MM:SS】
-
\A :显示时间(24小时格式)【HH:MM】
-
@ :显示时间(12小时格式)【am/pm格式】
-
\u :目前使用者的账号
-
\v :BASH的版本信息
-
\w :完整的工作目录名称
-
\W :利用basename函数取的工作目录名称
- \# :下达的第几个指令
- \
$
:提示字符,如果是root时,提示字符为#,否则就是$
那么怎么修改颜色呢?
还是通过修改这个PS1,修改字符串的颜色的格式是:\[\e[F;Bm\],其中“F“是字体的颜色,编号为30-37;“B”是背景的颜色,编号为40-47
F | B | |
30 | 40 | 黑色 |
31 | 41 | 红色 |
32 | 42 | 绿色 |
33 | 43 | 黄色 |
34 | 44 | 蓝色 |
35 | 45 | 紫红色 |
36 | 46 | 青蓝色 |
37 | 47 | 白色 |
比如我想要显示[主机前面的字符串-现在时间-用户-工作目录]权限提示字符,并且要求绿字黑底,那我就可以使用这样的命令:
PS1='\h-\@-\u\[\e[32;40m\]-\w]\$'
哈哈,还不错吧。
注意,目前的修改都只是当前终端的修改,再开一个进程,又会回到默认格式,那要怎么样做到永久的更改呢?修改配置文件 .bashrc。
如果只是想修改当前用户的个性化配置文件,那么就进入他的家目录的./bashrc文件中加上上面那句设置即可。
好了,个性化Linux设计完成(我的好像挺丑的)
CentOS8联网
我突然发现,虚拟机中的CentOS8可以ping本机或者局域网主机,但是一旦去ping外面的地址(比如baidu.com),就会出现connect: network is unreachable 的问题。
查了很多资料,终于解决了,特此记录:
首先,需要你更改文件/etc/sysconfig/network-scripts/ifcfg-ens33,这里的ens33是网卡名,这个每个人的情况都不一样的。
然后修改内容如下:
TYPE=Ethernet
BOOTPROTO=static
IPADDR=192.168.1.9
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=114.114.114.114
DNS2=8.8.8.8
DEFROUTE=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=a577059f-0a9f-430d-bc9c-f7a52051293b
DEVICE=ens33
ONBOOT=yes
然后重新启动网络:service network restart
如果centOS8中,请使用:nmcli c reload
重启网络后如果还是不行,那就请 reboot 一下,应该就好了。
这篇文章篇幅比较短,就写到这里了,下一篇开始我们就进入Linux的使用者管理