《Linux shell变量总结回顾》RHEL6

shell脚本(一)基础知识,shell脚本基础知识

shell

一、简介

1.作用:与内核进行交互

2.语言类型:解释性语言,给内核解释用

3.脚本中第一行内容:

#!/bin/bash                      
这是shell脚本的第一行内容,表示用bash这个解释器去解释下面的内容

#!/bin/sh                           
这也可以是shell脚本的第一行内容,表示用sh这个解释器去解释下面的内容

#!/usr/bin/env bash       
env表示使用相对路径,自动找bash解释器所在位置。可以解决不同版本的系统bash不一定在/usr/bin/bash这个路径下的问题

4.为了使脚本方便其他人阅读,一般会在开头加上作者、创建时间、邮箱、版本、描述等内容,可以使用以下设置快捷键的方法在脚本中增加这些信息

vim /etc/vimrc

map <F4> ms:call WESTOS()<cr>’s
function WESTOS()
        call
append(0,”######################################”)
        call append(1,”# Author     :vaon                   #”)
        call append(2,”# Create
Date:”.strftime(“%Y-%m-%d”).”             #”)
        call append(3,”# Email     
:[email protected]        
#”)
        call append(4,”# Version    :1.0                    #”)
        call append(5,”# Description:                       #”)
        call
append(6,”######################################”)
        call append(7,”                          “)
        call append(8,”#!/usr/bin/env bash”)
endfunction

#map表示影射–>按F4时调用(呼叫)WESTOS函数

#0代表第一行,1第二行…

#黄色部分strftime是一个系统自带的函数,表示显示当前时间   .是分隔符,表示这个函数与其他两段内容互不影响

#下面是设定函数的方法:

    Fucton 函数名()

    内容

    Endfunction

然后创建一个脚本使用F4键就会在脚本最前面自动加上以下内容:

二、基础知识

1.变量的声明${a}b

设定a=1

echo $a 会出现1,

但echo $ab就不会出现1b,因为系统把ab当成一个变量了。

可以echo ${a}b,会出现1b,把作为一个已定义的1

2.转义、弱引用、强引用

1)\表示转义

echo ###不会出现结果,但是加上 echo \#\#\#就会出现###

2)“”表示弱引用,也可以输出###

3)‘’表示强引用,可以输出###

4)强引用和弱引用的区别

例如 $  !  \  “  这些强引用会把他们当作普通内容打印到屏幕上

而弱引用会把他们当成系统变量,执行变量里的内容

还例如在弱引用中`hostname`表示执行hostname命令

而在强引用中表示输出`hostname`这个内容

3.diff、patch

1)diff

【1】.

[[email protected]
mnt]# cat file1
abcd
1234
[[email protected]
mnt]# cat file2
abcd
[[email protected]
mnt]# diff file1 file2
2d1
< 1234
#表示file1删除1234就和file2一样了

【2】.比较目录

diff -r 目录一 目录二

2)打补丁

建立hello文件:

vim hello

westos

建立hello.new文件:

vim hello.new

westos

456

安装自动更新工具包:

yum install patch -y

将hello.new与hello文件比较,多出的内容做成hello.path补丁包:

diff -u hello hello.new > hello.path

用path补丁包去更新hello文件:

patch hello hello.path

查看hello文件,已经被更新成和hello.new一样了:

cat hello

westos

456

注:如果patch后面加上-b参数表示在更新的同时备份原文件为hello.orig

4.grep

首先建立一个文件:

[[email protected]
mnt]# vim /mnt/passwd

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
test:ROOT:test
test:test:root
test:root:test
test:roottest:test

1)查找包含root子段的行

[[email protected]
mnt]# grep root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:test:root
test:root:test
test:roottest:test

2)查找包含root子段的行,不区分大小写

[[email protected]
mnt]# grep -i root /mnt/passwd
root:x:0:0:root:/root:/bin/bash
test:ROOT:test
test:test:root
www.hj8828.com,test:root:test
test:roottest:test

3)只要root开头的

[[email protected]
mnt]# grep -i ^root /mnt/passwd
root:x:0:0:root:/root:/bin/bash

4)只要root结尾的

[[email protected]
mnt]# grep -i root$ /mnt/passwd
test:test:root

5)以root开头和结尾的行都不要。-E表示后面两个条件同时筛选,-v表示不要筛选出的行

[[email protected]
mnt]# grep -i root /mnt/passwd|grep -i -E “^root|root$” -v
test:ROOT:test
test:root:test
test:roottest:test

6)表示只要包含只有root子段的行,root前后只要有字母都不要,如roottest这行就不要

[[email protected]
mnt]# grep -i “\<root\>” /mnt/passwd|grep -i -E “^root|root$”
-v
test:ROOT:test
test:root:test
问题:

查看所有能登陆系统的用户

解答:

[[email protected]
mnt]# grep “\<bash\>” /etc/passwd
root:x:0:0:root:/root:/bin/bash
可见只有root能登陆
7)grep -n 表示显示搜索出的字符串所在行号

[[email protected]
mnt]# grep -n hello /mnt/passwd
4:hello

8)gep -n2
表示显示搜索出的行以及它的上面2行和下面2行,并且显示各自在文件中的行号

注:如果-n和2之间有空格则表示除了上面显示的内容还会在每行开头显示出文件名

[[email protected]
mnt]# grep -n2 hello /mnt/passwd
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:hello
5-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
6-games:x:12:100:games:/usr/games:/sbin/nologin

9)grep -B2 表示显示搜索出的行以及这行的上两行内容
[[email protected]
mnt]# grep -B2 hello /mnt/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
10)grep -A2 表示下两行

[[email protected]
mnt]# grep -A2 hello /mnt/passwd
hello
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
11)表示搜索/mnt目录下包含root字符的文件
[[email protected]
mnt]# grep -r hello /mnt/
/mnt/passwd:hello

5.cut

用法:cut -d 分隔符 -f 第几列 文件

-c指定字符

-d指定分隔符

-f指定第几列

cut -d : -f 2 /mnt/psswd     #以:为分隔符,显示passwd文件第二列

cut -d : -f 2,7 /mnt/psswd   #,表示第二和第七列,如果是-表示2到第7列

cut -c 3 /mnt/passwd      #显示第三列的字符,不使用分隔符

cut -c 1,3 /mnt/passwd     #显示一和三列的字符,不使用分隔符

题目:

显示eth0网卡的ip

解答:

[[email protected]
mnt]# ifconfig eth0|grep “\<inet\>”|cut -d ” ” -f 10
172.25.254.1

6.awk

-v表示给变量赋予内容:

[[email protected]
mnt]# name=hello
[[email protected]
mnt]# awk -F : -v name=$name ‘BEGIN {print name} {print $1}END {print
“end”}’ /mnt/passwd
hello
root
bin
daemon
hello
mail
games
test
test
test
test
end
7.sed

-i      #这个参数表示写入文件

sed ‘s/old/new/g’ passwd       #将passwd文件中的所有old字符替换为new

sed ‘s/old/new/g’ passwd       #将passwd文件中的所有old字符替换为new,并写入passwd文件

sed ‘2,5s/old/new/g’ passwd      #替换2到5行

sed ‘/adm/,/gdm/s/old/new/g’ passwd   #从adm字符一直到gdm字符的内容中将old替换为new

sed -e ‘s/old/new/g’ -e ‘s/old1/new1/g’ passwd  
#将old替换为new同时将old1替换为new1

sed 5d passwd    #删除第5行

sed 5p passwd    #复制第5行

sed -n 5p passwd    #只显示第5行

-p    #表示直接将 sed 的动作写在一个档案内, -f filename 则可以执行
filename 内的sed 动作

vim file

s/sbin/westos/g
s/nologin/linux/g

sed -f file passwd

题目:

将httpd服务端口改为8080

解答:

############################
# Author     :vaon                           #
# Create Date:2017-12-16             #
# Email     
:[email protected]      
#
############################

#!/bin/bash
PORT=`grep ^Listen /etc/httpd/conf/httpd.conf`
sed “s/$PORT/Listen $1/g” -i /etc/httpd/conf/httpd.conf
systemctl restart httpd

8.设置变量

1)临时设置(环境级)

在当前环境生效,当前环境关闭,变量失效

先看一个例子:

[[email protected]
mnt]# a=1
[[email protected]
mnt]# echo $a
1
[[email protected]
mnt]# vim test.sh
#!/bin/bash
echo $a
[[email protected]
mnt]# sh test.sh 

[[email protected]
mnt]#

#由于a=1是在当前使用的shell里面赋的值,当进入脚本执行时,脚本使用的是子shell,这个子shell中并没有设定a=1,所以结果为空

[[email protected]
mnt]# export a=1
[[email protected]
mnt]# sh test.sh
1

#可以临时设定a=1给所有shell,一旦登出就会失去这个临时设定

2)永久设置

【1】.系统级

对所有用户生效

[[email protected]
mnt]# vim /etc/profile

export a=1

[[email protected]
mnt]# source /etc/profile

[[email protected]
mnt]# logout
Connection to 172.25.254.1 closed.
[[email protected]
Desktop]# ssh
[email protected]
[email protected]’s
password:
Last login: Sat Dec 16 09:12:16 2017 from 172.25.254.10
[[email protected]
~]# cd /mnt/
[[email protected]
mnt]# sh test.sh
1

#这样所有shell都可以使用a=1这个变量,登出系统再登陆依然存在a=1

【2】.用户级

只针对配置过的用户生效,其他用户无法使用

vim /root/.bash_profile

export a=1

source /root/.bash_profile

现在a=1只对root用户生效

9.将脚本加到系统命令中去
[[email protected]
mnt]# vim /etc/profile

export PATH=$PATH:/mnt

注:这里同样存在系统级或用户级的设置,在这里使用的是系统级设置。如果只允许root可以设置/root/.bash_profile文件

[[email protected]
mnt]# source /etc/profile

[[email protected]
mnt]# chmod +x test.sh 

然后退出/mnt目录,直接把test.sh脚本当成系统命令去执行,发现也可以:

[[email protected]
mnt]# cd
[[email protected]
~]# test.sh
1
10.命令别名

1)使用别名

[[email protected]
~]# vim /etc/bashrc
alias kan=’cat’             #表示执行’kan’的时候相当于执行’cat’命令

[[email protected]
~]# source /etc/bashrc

查看别名列表:

[[email protected]
~]# alias

         …

alias kan=’cat’

         …

执行kan这个单词就相当于执行cat命令

[[email protected]
~]# kan /mnt/test.sh
######################################
# Author     :vaon                   #
# Create Date:2017-12-16             #
# Email     
:[email protected]        
#
######################################
                          
#!/bin/bash
echo $a
2)删除别名
删除/etc/bashrc中的alias kan=’cat’

然后在删除kan信息:

unalias kan

现在查看alias列表,里面已经没有kan的信息了

11.*和@区别

vim test.sh

#!/bin/bash
echo ‘$1 Is’ $1
echo ‘$2 Is’ $2
echo ‘$3 Is’ $3
echo ‘$* Is’ $*
echo ‘$# Is’ $#
echo
‘[email protected]
Is’
[email protected]
[[email protected]
mnt]# sh test.sh 1 2 3
$1 Is 1                                                  
#显示第1个字符
$2 Is 2                                                  
#显示第1个字符
$3 Is 3                                                  
#显示第1个字符
$* Is 1 2 3                                            
#显示所有字符
$# Is 3                                                  
#显示最后一个字符
[email protected]
Is 1 2 3                                           #显示所有字符
*和@都表示所有内容,但实际上一个是所有内容方到“”里面。而@是每个数据都加引号

$*   “1 2 3”

&@  “1” “2” “3”

12.shell脚本中函数的定义

READ()

{

        echo hello word

}

13.变量对比

1)test

2)[ ]

[[email protected]
mnt]# a=1
[[email protected]
mnt]# b=1
[[email protected]
mnt]# test “$a” == “$b” && echo yes || echo no
yes
[[email protected]
mnt]# [ “$a” == “$b” ] && echo yes || echo no
yes
3)[ 条件1 -a 条件2 ] 表示条件1和2都满足
4)[ 条件1 -o 条件2 ] 表示条件1和2任一个满足

5)[ 条件1 -eq 条件2 ]  等于

6)[ 条件1 -ne 条件2 ]  不等于

7)[ 条件1 -gt 条件2 ]  大于

8)[ 条件1 -ge 条件2 ]  大于等于

9)[ 条件1 -lt 条件2 ]  小于

10)[ 条件1 -le 条件2 ]  小于等于

[[email protected]
mnt]# [ “$a” -eq “$b” ] && echo yes || echo no
yes

11)[ -n ]   变量内容不为空

12)[ -z ]    变量内容为空

[[email protected]
mnt]# a=8
[[email protected]
mnt]# [ -n “$a” ] && echo yes || echo no
yes
[[email protected]
mnt]# [ -z “$a” ] && echo yes || echo no
no

13)[ -b ]  是否为块设备文件

14)[ -c ]  是否为字符设备文件

[[email protected]
mnt]# [ -b /dev/sda ] && echo yes || echo no
yes
[[email protected]
mnt]# [ -c /dev/vfio/vfio ] && echo yes || echo no
yes

15)[ -f ]  是否为常规文件

16)[ -S ]  是否为套接字文件

17)[ -L  ]  是否为链接文件

18)[ -d ]  是否为目录

19)[ -e ] 文件是否存在

20)[ -r ]  是否可读

21)[ -w ]  是否可写

22)[ -x ]  是否可执行

18)[ filename1 -nt filename2 ] 
如果 filename1 比 filename2 新,则为真

19)[ filename1 -ot filename2 ] 
如果 filename1 比 filename2 旧,则为真

[[email protected]
mnt]# touch file
[[email protected]
mnt]# [ /mnt/check_ip -ot file ] && echo yes || echo no
yes

题目:

显示输入的文件类型

解答:

#!/bin/bash
[ -e $1 ] && (
        [ -f $1 ] && echo “$1 Is File”
        [ -d $1 ] && echo “$1 Is Directory”
        [ -b $1 ] && echo “$1 Is Block File”
        [ -L $1 ] && echo “$1 Is Link”
        [ -S $1 ] && echo “$1 Is Socket”
)
14.四则运算

15.语句

case语句:
并发的去匹配所有条件,所有条件同一时间去配置,效率比if语句高

if语句是逐行去匹配,第一行不匹配再去匹配下一行,效率较低

exit 退出脚本。后面加数字1|0则表示退出后$?的值为1|0

break 退出循环

由于上篇文章总结的不是很详细,有很多方面并未涉及到shell各个方面,所以发表此文章对shell做了更全面的总结:

练习题四,

 

第1章 练习题

文章版权:

1.1 每天晚上 12 点,打包站点目录/var/www/html 备份到/data 目录下(最好每次备份按时间生成不同的备份包)

环境变量路径:

1.1.1 测试命令

[[email protected]
~]# cd / && tar zcf /data/www_`date +%F`.tar.gz  var/www/html

[[email protected]
~]# set   //查看到的是局部变量和全局变量2种

1.1.2 写入脚本中

[[email protected]
/]# cat /server/scripts/www.sh

cd / && tar zcf /data/www_`date +%F`.tar.gz  var/www/html

[[email protected]
~]# env  //查看系统的全局环境变量

1.1.3 测试脚本

[[email protected]
~]# sh /server/scripts/www.sh

[[email protected]
~]# echo $PATH  //查看系统环境变量路径

1.1.4 写入定时任务

[[email protected]
/]# crontab -l |tail -2

#### backup /var/www/html dir

00 00  * * *  /bin/sh  /server/scripts/www.sh >/dev/null 2>&1

[[email protected]
~]# export $PATH  //也可以使用export查看环境变量路径

1.1.5 检查执行结果

[[email protected]
~]# ll /data/

total 16

-rw-r–r–  1 root root 154 Sep 11 09:44 www_2017-09-11.tar.gz

[[email protected]
~]# export PATH=$PATH:/date/  //临时添加/date目录到环境变量路径下

1.2 每周 六、日 上午 9:00和下午 14: 00  来老男孩这里学习(执行程序/server/script/oldboy.sh代替学习)。

00 9,14 * * 0,6  /bin/sh /server/scripts/oldboy.sh >/dev/null
2>&1

                     0表示周日

                     6表示周六

要想重启主机后还生效就要编辑环境配置文件root/.bashec或/root/.bash_profile与/etc/profile文件,想要立刻生效可以使用命令:

1.3 描述下列路径的内容是做什么的。

/etc/sysctl.conf            系统内核的配置文件

/etc/rc.local               开机自启动

/etc/hosts                  ip与域名的对应关系 ,解析主机名

/etc/fstab                  开机自动挂载

/var/log/secure             用户登陆信息,主要查看其中的Failed

注:.bash_profile文件支队系统当前用户生效

1.4 请说出下列 grep 正则表达式的含义

^         以…开头的行

$         以…结尾的行

.(点号)    任意一个字符

\         在转义字符  \n \t

*           前一个字符练习出现0次或1次以上

{n,m}       前一个字符连续出现,至少n次,最多m

[^t]         取不包含t的

^[^t]        以不是t的开头

[[email protected]
~]# source .bash_profile  

1.5  排除文件中的空行和空格

[[email protected]
~]# ls –a    可以查看到这2个文件

1.5.1 文件的内容

[[email protected]
~]# cat -A mun.txt

znix1$

znix2$

znix3$

$

znix4$

      $

znix5$

      $

znix6$

 

1.5.2 egrep方法

找出空行  -v参数排除

[[email protected]
~]# egrep -n “^ *$” mun.txt

4:

6:     

8:     

10:

14:

[[email protected]
~]# egrep -n  “^$|^ +$” mun.txt

4:

6:     

8:     

10:

14:

脚本的执行:

1.5.3 awk方法

[[email protected]
~]# awk ‘!/^[ ]*$/’ mun.txt

znix1

znix2

znix3

znix4

znix5

znix6

sh script    //这种方法script不需要可执行权限

1.6 把passwd.txt 第一列取出来

./ script          //必须具有可执行权限

1.6.1 文件内容

[[email protected]
~]# cat passwd.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

. script           //这种方法script也不需要可执行权限

1.6.2 排除思想

[[email protected]
~]# egrep “^[^:]+” passwd.txt  -o

root

bin

……

                       

1.6.3 sed方法

[[email protected]
~]# sed -r ‘s#(^.*)(:x.*:)(.*)#\3\2\1#g’ passwd.txt

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

……

排除不是以 :开头的行

[[email protected]
~]# sed -r ‘s#(^[^:]+)(.*:)(/.*$)#\3\2\1#’ passwd.txt

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

……

区分局部变量和全局变量

1.6.4 awk方法

awk中的变量:

-vOFS=”:”

OFS 的内容就是 , 的内容

awk在显示每一列内容的时候,每一列之间的分隔符

-v 修改和创建awk可以使用的变量

[[email protected]
~]# awk -F: -vOFS=”:” ‘{print $NF,$2,$3,$4,$5,$6,$1}’ passwd.txt

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

……

[[email protected]
~]# str=1000   //局部变量

1.7 vi/vim命令、快捷键

 含义

命令

退出保存

:wq

退出并强制保存,!为强制的意思

:wq!

强制退出,不保存 

:q!

另存为

:q  /tmp/****

光标移动到文件的最后一行

G

光标移动到文件的第一行

gg

光标移动到文件的100行

100gg 100G :100

从光标所在位置将光标移动到当前行的开头

0  ^

从光标所在位置将光标移动到当前行的结尾

$

删除当前行的内容

dd

删除当前行到文件的最后一行的内容 

dG

删除当前行到文件的第一行的内容

dgg

粘贴

p

粘贴10次

10p

复制

yy

取消上一次的动作

u

删除一行

dd

/ 搜索内容

继续向下搜索              n

继续向上搜索              N

向上搜索 

?

取消对找到的内容的高亮显示

:noh

 

1.7.1 编辑services定位到第100行把这一行复制到文件的最后一行粘贴10次。

100gg

yy

G

10p

[[email protected]
~]# echo $str

1.8 授权 oldboy 目录及其子目录 755 的权限。

chmod -R 755 oldboy

1000

1.9 把 oldboy 目录及其子目录的属主改为 oldboy,组改为 root。

chown  oldboy.lodboy oldboy.txt

去编辑一个脚本:

1.9.1 修改时可能发生的错误

[[email protected]
~]# id oldboy

uid=500(oldboy) gid=501(incahome) groups=501(incahome)

[[email protected]
~]# chown oldboy.oldboy oldboy-new.txt

[[email protected]
znix ~]# chown oldboy.oldboy num.txt

chown: invalid user: `oldboy.oldboy’

检查oldboy用户是否存在,检查oldbo这个用户组是否存在

# vim bianliang.sh

1.10 描述下 umask 的作用.

umask管理着linux默认的权限

实例1-1 当umask为021时

file 权限为644

 666-021+001=644

dir 权限为 756

 777-021=756

#!/bin/bash

1.11 每天打包备份 /etc/rc.local /etc/hosts /etc/services 到 /backup目录。

echo $str

1.11.1 测试命令

[email protected]
~]# cd / && tar zcf /backup/file`date +%F`.tar.gz  etc/rc.local 
etc/hosts etc/services

  [email protected]
/]# ll /backup/file2017-09-11.tar.gz

-rw-r–r– 1 root root 127455 Sep 11 15:41 /backup/file2017-09-11.tar.gz

[[email protected]
~]# bianliang.sh  //我们定义的变量,但是通过脚本却不能输出

1.11.2 写入脚本

[[email protected]
/]# cat /server/scripts/file.sh

cd / && tar zcf /backup/file`date +%F`.tar.gz  etc/rc.local  etc/hosts
etc/services

 

1.11.3 测试脚本

[[email protected]
/]# sh /server/scripts/file.sh

[[email protected]
/]# ll /backup/file2017-09-11.tar.gz

-rw-r–r– 1 root root 127455 Sep 11 15:44 /backup/file2017-09-11.t

[[email protected]
/]# cat /server/scripts/file.sh

[[email protected]
~]# export str   //添加到全局变量中

1.11.4 写入定时任务

### beifen zhongyaowenjan

00 00 * * * /bin/sh /server/scripts/file.sh >/dev/null 2>&1

[[email protected]
~]# bianliang.sh   //再次使用完全ok

1.11.5 测试定时任务

[[email protected]
~]# date -s ’23:59:29′

Mon Sep 11 23:59:29 CST 2017

[[email protected]
~]# ll /backup/file2017-09-1*

-rw-r–r– 1 root root 127455 Sep 11 15:44 /backup/file2017-09-11.tar.gz

-rw-r–r– 1 root root 127455 Sep 12  2017 /backup/file2017-09-12.tar.gz

1000

第2章 回顾课程

要想完全的清除某个全局变量:

2.1 定时任务

# unset str  清除全局变量

每隔 2 个小时将/etc/services 文件打包备份到/tmp 下(最好每次备份成不同的备份包)

#env   可以查看到所有全局变量

2.1.1 测试命令

[[email protected]
~]# cd / && /bin/tar zcf /tmp/ser_`date +%F_%H`.tar.gz 
etc/services

&& || 的用法:(参数的比对)

2.1.2 放入脚本中

[[email protected]
~]# cat /server/scripts/ser.sh

cd / && /bin/tar zcf /tmp/ser_`date +%F_%H`.tar.gz  etc/services

&& 条件符合要求才会执行后面的动作

2.1.3 测试脚本

[[email protected]
~]# sh /server/scripts/ser.sh

||    条件不符合要求时才会执行后面的动作

2.1.4 写入定时任务

[[email protected]
~]# crontab -l |tail -2

#backup /etc/services

00 */2 * * * /bin/sh /server/scripts/bak-ser.sh >/dev/null
2>&1

//查看/ect目录下是否有/grub.conf文件,有则输出yes,无则输出no。

2.1.5 检查定时任务是否成功

1)是否打包成功,看看文件里面是否有追加的信息

2)查看定时任务日志 /var/log/cron

[[email protected]
~]# [ -f /etc/grub.conf ] && echo yes  || echo no 

2.2 无法连接linux

Yes        

2.2.1 道路是否通畅

ping ip地址

实例2-1 无法ping通的解决办法:

服务器的ip地址是否正确

服务器网卡是否启动,即ONBOOT是否为yes

系统网卡的配置

实例2-2 VMware相关的:

vmware-5个服务是否启动

vmware配置-网卡是否连接

查看你vmware网卡的vmnet8 是否已经启动

查看/shellscripts/hello.sh是否可执行,可执行则输入yes,否则就赋予它可执行权限

2.2.2 是否有人劫财劫色

查看 iptables selinux是否关闭

[[email protected]
shellscripts]# [ -x /shellscripts/hello.sh ] && echo yes || chmod +x
/shellscripts/hello.sh

2.2.3 是否有人提供服务

实例2-3 看22端口是否开启

方法一: telnet 10.0.0.200 22

方法二: ss -lntup |grep 22

实例2-4 进程是否在运行

ps -ef |grep sshd

[[email protected]
shellscripts]# ls

2.3 linux无法上网怎么办

hello.sh  ipadd.sh  logmess_clean.sh 

2.3.1 ping 域名

域名无法ping 通

[[email protected]
~]# ping centos.houzhaoshun.cn

ping: unknown host centos.houzhaoshun.cn

 

[[email protected]
shellscripts]# hello.sh

2.3.2 ping  外网ip

可以ping 通

[[email protected]
~]# ping 123.206.66.149

PING 123.206.66.149 (123.206.66.149) 56(84) bytes of data.

64 bytes from 123.206.66.149: icmp_seq=1 ttl=128 time=63.1 ms

64 bytes from 123.206.66.149: icmp_seq=2 ttl=128 time=60.5 ms

hello world!   

2.3.3 检查dns配置文件

[[email protected]
~]# cat /etc/resolv.conf

“”和‘’与 ` ` 在shell变量中的区别       

2.3.4 修改配置文件

修改完成重启网卡,生效

[[email protected]
~]# service network restart

Shutting down interface eth0:                              [  OK  ]

Shutting down loopback interface:                          [  OK  ]

Bringing up loopback interface:                            [  OK  ]

Bringing up interface eth0:  Determining if ip address 10.0.0.201 is
already in use for device eth0…

                                                           [  OK  ]

“ ” 允许通过$符引用其他变量

2.4 检查一个软件是否按照 rpm 相关

‘’禁止引用其他变量符,视为普通字符

2.4.1 查询某个软件包是否安装

[[email protected]
~]# rpm -qa tree

tree-1.5.3-3.el6.x86_64

将命令执行的结果输出给变量

2.4.2 查询软件包里面的内容

[[email protected]
~]# rpm -ql tree

/usr/bin/tree

/usr/share/doc/tree-1.5.3

/usr/share/doc/tree-1.5.3/LICENSE

/usr/share/doc/tree-1.5.3/README

/usr/share/man/man1/tree.1.gz

[[email protected]
~]# echo “$PWD is lujing”

2.4.3 查询某个命令属于哪个软件包

查询的时候要使用绝对路径

[[email protected]
~]# rpm -qf `which crond` 

cronie-1.4.4-16.el6_8.2.x86_64

 

第1章 练习题 1.1 每天晚上 12
点,打包站点目录 /var/www/html 备份到 /data
目录下(最好每次备份按时间生成不同的备份包) 1.1….

/root is lujing

[[email protected]
~]# echo ‘$PWD is lujing’

$PWD is lujing

[[email protected]
~]# echo $a

1000

[[email protected]
~]# echo $aaaaaaaa  //系统把$aaaaa视为一个变量

 

[[email protected]
~]# echo ${a}aaaaaa   //把变量用{}括起来,系统才会去输出变量

1000aaaaaa

#echo `ls`  反引号中的命令时可以单独执行的,然后再由echo输出

 

扩展:”\ “反斜杠,作用屏蔽字符的特殊意义

test命令

 用途:测试表达式是否成立,成立返回值为0,否返回值为其他值。

 格式:test  条件表达式  [条件表达式]

 

 ≡ 常见的测试类型

      测试文件的状态

      字符的串比较

      整数值比较

      逻辑测试

 

测试文件的状态

   格式:[操作符   文件或目录]

  常见的测试操作符

-d :测试是否为目录【directory】

 

[[email protected]
/]# [ -d /var/spool/ ]

[[email protected]
/]# echo $?

0

 

-e:测测试目录或文件是否存在【exist】

 

[[email protected]
/]# [ -e /etc/passwd ]

[[email protected]
/]# echo $?

0

 

-f:测试是否为文件【file】

 

[[email protected]
Packages]# [ -f /etc/passwd ]

[[email protected]
Packages]# echo $?

0

[[email protected]
Packages]#

 

-r:测试当前的用户是否有读取的权限【read】

 

[[email protected]
/]# [ -r /etc/shadow ]

[[email protected]
/]# echo $?

0

[[email protected]
/]#

 

-w:测试当前的用户是否有写的权限【write】

 

[[email protected]
/]# [ -w /etc/shadow ]

[[email protected]
/]# echo $?

0

[[email protected]
/]#

 

-x:测试当前的用户是否可执行和该文件【excute】

 

[[email protected]
/]# [ -x /etc/shadow ]

[[email protected]
/]# echo $?

1

[[email protected]
/]# ll /etc/shadow

———-. 1 root root 1086 2月  26 22:38 /etc/shadow

 

-L:测试是否为符号链接文件【link】

 

 

[[email protected]
/]# ll /etc/shadow

———-. 1 root root 1086 2月  26 22:38 /etc/shadow

[[email protected]
/]# [ -L /etc/shadow ]

[[email protected]
/]# echo $?

1

整数值比较

 格式:[ 整数1 操作符整数2 ]

常用的操作测试符

  -eq:等于(Equal)

  -ne:不等于(Not Equal)

  -gt:大于(Greater Than)

  -lt:小于(Lesser Than)

  -le:小于或等于(Lessser or Equal)

  -ge:大于或等于(Greater or Equal)

案例

  如果登录用户数小于或等于10则输出YES

 

[[email protected]
桌面]# who|wc -l