09、Linux 基础 - shell脚本与个性Linux

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的使用者管理