shell变量总计回想,练习题4

www.ca88.com

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

shell

一、简介

1.成效:与基础举办互动

二.语言类型:解释性语言,给基础解释用

三.脚本中首先行内容:

#!/bin/bash                      
那是shell脚本的率先行内容,表示用bash那些解释器去解释下边包车型大巴内容

#!/bin/sh                           
那也得以是shell脚本的率先行内容,表示用sh那些解释器去解释上面的始末

#!/usr/bin/env bash       
env表示使用相对路线,自动找bash解释器所在地点。能够消除分歧版本的体系bash不一定在/usr/bin/bash这些路子下的难点

肆.为了使脚本方便别的人阅读,一般会在起来加上我、成立时间、邮箱、版本、描述等剧情,能够运用以下设置飞快键的艺术在剧本中扩充那么些音讯

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表示影射–>按F四时调用(呼叫)WESTOS函数

#0代表第3行,叁次之行…

#色情部分strftime是四个系统自带的函数,表示呈现当前时光   .是分隔符,表示这么些函数与其他两段内容互不影响

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

    Fucton 函数名()

    内容

    Endfunction

然后创设3个本子使用F四键就能够在本子最前头自动抬高以下内容:

二、基础知识

1.变量的扬言${a}b

设定a=1

echo $a 会出现1,

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

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

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

1)\代表转义

echo ###不会产出结果,但是加上 echo \#\#\#就可以油然则生###

二)“”表示弱引用,也得以出口###

叁)‘’表示强引用,能够输出###

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一样了

【二】.比较目录

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
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

陆)表示只要包涵唯有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

八)gep -n2表示呈现寻寻找的行以及它的地点二行和上边贰行,并且出示各自在文书中的行号

注:若是-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

玖)grep -B二 表示展现寻找出的行以及那行的上两行内容
[[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
十)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
1壹)表示找出/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   #,表示第一和第10列,要是是-表示二到第十列

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    #只展现第伍行

-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

八.安装变量

壹)权且安装(情形级)

在此时此刻情况生效,当前情状关闭,变量失效

先看3个例子:

[[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=一,所以结果为空

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

#可以目前设定a=一给全数shell,①旦登出就能够错过那几个一时半刻设定

二)恒久设置

【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=一这些变量,登出系统再登入依旧存在a=一

【2】.用户级

只针对配置过的用户生效,别的用户不可能利用

vim /root/.bash_profile

export a=1

source /root/.bash_profile

前几天a=3只对root用户生效

九.将脚本加到系统命令中去
[[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.命令别称

一)使用别称

[[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
二)删除此之外号
删除/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                                                  
#突显最终2个字符
[email protected]
Is 1 2 3                                           #呈现全数字符
*和@都表示全体剧情,但实际1个是有所内容方到“”里面。而@是各种数据都加引号

$*   “1 2 3”

&@  “1” “2” “3”

1二.shell脚本中等学校函授数的定义

READ()

{

        echo hello word

}

一三.变量比照

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 ] 表示原则一和贰都满意
4)[ 条件1 -o 条件2 ] 表示原则一和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”
)
1四.4则运算

15.语句

case语句:
现身的去相配全体条件,全数标准同一时半刻间去布置,功用比if语句高

if语句是逐行去相称,第二行不兼容再去相配下壹行,效能十分的低

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

break 退出循环

是因为上篇小说总括的不是很详细,有为数不少地点未有提到到shell各种方面,所以发布此文章对shell做了更健全的总括:

勤学苦练题4,

 

第1章 练习题

小说版权:

一.壹 每天清晨 1贰 点,打包站点目录/var/www/html 备份到/data 目录下(最棒每一遍备份定期间转移不一样的备份包)

碰到变量路线:

1.一.一 测试命令

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

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

壹.壹.二 写入脚本中

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

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

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

一.壹.3 测试脚本

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

[[email protected]
~]# echo $PATH  //查看系统情形变量路线

一.壹.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查看情形变量路线

一.一.五 检查实施结果

[[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目录随景况变量路线下

一.贰 周周 6、日 中午 玖:00和早晨 1四: 00  来老男孩这里上学(实施顺序/server/script/oldboy.sh取代学习)。

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

                     0代表周5

                     陆代表周日

要想重启主机后还生效就要编写制定境况布署文件root/.bashec或/root/.bash_profile与/etc/profile文件,想要立即见效能够应用命令:

一.三 描述下列路线的始末是做怎么着的。

/etc/sysctl.conf            系统基本的安插文件

/etc/rc.local               开机自运营

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

/etc/fstab                  开机自动挂载

/var/log/secure             用户登录音讯,首要查看里面包车型地铁Failed

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

1.四 请说出下列 grep 正则表达式的意义

^         以…开头的行

$         以…结尾的行

.(点号)    任性二个字符

\         在转义字符  \n \t

*           前一个字符演练出现0次或二回以上

{n,m}       前贰个字符一而再出现,至少n次,最多m

[^t]         取不包含t的

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

[[email protected]
~]# source .bash_profile  

1.伍  排除文件中的空行和空格

[[email protected]
~]# ls –a    能够查阅到这3个文件

一.伍.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不必要可进行权限

一.陆 把passwd.txt 第贰列收取来

./ script          //必须具备可施行权限

一.陆.一 文件内容

[[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也没有要求可实行权限

一.陆.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在体现每1列内容的时候,每①列之间的相间符

-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=一千   //局地变量

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 编辑services定位到第90行把这一行复制到文件的尾声一行粘贴1四回。

100gg

yy

G

10p

[[email protected]
~]# echo $str

一.八 授权 oldboy 目录及其子目录 755 的权柄。

chmod -R 755 oldboy

1000

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

chown  oldboy.lodboy oldboy.txt

去编辑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一 天天打包备份 /etc/rc.local /etc/hosts /etc/services 到 /backup目录。

echo $str

一.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一.二 写入脚本

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

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

 

1.1壹.叁 测试脚本

[[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壹.4 写入定期职务

### beifen zhongyaowenjan

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

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

1.1一.伍 测试定期职分

[[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

第3章 回看课程

要想完全的解决有些全局变量:

贰.一 定时任务

# unset str  清除全局变量

每隔 2 个钟头将/etc/services 文件打包备份到/tmp 下(最佳每一趟备份成差异的备份包)

#env   能够查阅到持有全局变量

2.壹.1 测试命令

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

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

贰.1.2 放入脚本中

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

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

&& 条件符合供给才会实行后边的动作

二.1.三 测试脚本

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

||    规范不符合供给时才会进行后边的动作

二.一.四 写入定期义务

[[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。

贰.一.伍 检查定期职责是还是不是中标

一)是或不是卷入成功,看看文件之中是否有扩张的新闻

二)查看定期职责日志 /var/log/cron

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

二.2 不可能连接linux

Yes        

贰.二.一 道路是还是不是畅通

ping ip地址

实例2-一 不可能ping通的化解办法:

服务器的ip地址是不是精确

服务器网卡是或不是运行,即ONBOOT是或不是为yes

系统网卡的布署

实例2-2 VMware相关的:

vmware-多少个服务是还是不是运营

vmware配置-网卡是不是连接

查阅你vmware网卡的vmnet捌 是或不是已经运行

翻看/shellscripts/hello.sh是或不是可实践,可实行则输入yes,不然就给予它可进行权限

二.二.2 是还是不是有人比肩劫色

查阅 iptables selinux是不是关闭

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

二.二.三 是还是不是有人提供服务

实例二-三 看2二端口是还是不是张开

方法一: telnet 10.0.0.200 22

方法二: ss -lntup |grep 22

实例二-肆 进度是或不是在运作

ps -ef |grep sshd

[[email protected]
shellscripts]# ls

2.三 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.叁.三 检查dns配置文件

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

“”和‘’与 ` ` 在shell变量中的分化       

二.叁.四 修改配置文件

修改达成重启网卡,生效

[[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  ]

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

二.4 检查三个软件是还是不是依照 rpm 相关

‘’禁止引用其余变量符,视为一般字符

2.4.1 查询有些软件包是否安装

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

tree-1.5.3-3.el6.x86_64

将指令施行的结果输出给变量

二.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”

二.四.三 查询有个别命令属于哪个软件包

询问的时候要运用相对路线

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

cronie-1.4.4-16.el6_8.2.x86_64

 

第二章 练习题 1.1 每一天晌午 1二点,打包站点目录 /var/www/html 备份到 /data
目录下(最佳每趟备份按期间转移区别的备份包) 一.一….

/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 操作符整数二 ]

常用的操作测试符

  -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

2

[[email protected]
桌面]# [ `who|wc -l` -le 10 ] && echo “YES”

YES

 

变量的加减法运算:

变量的加法运算:

[[email protected]
~]# a=1000

[[email protected]
~]# echo $a

1000

[[email protected]
~]# expr $a + $a

2000

[[email protected]
~]# echo $a + $a              //那是第22中学指鹿为马的操作,运算必须使用expr

1000 + 1000

[[email protected]
~]# expr $a+$a                //$a + $a
要有空格不然也是不对的

1000+1000

变量的乘法运算:

[[email protected]
~]# expr $a * $a              //*

在操作系统中身为特殊字符,\遮掩字符的区别平常含义

expr: syntax error

[[email protected]
~]# expr $a \* $a

1000000

[[email protected]
~]# expr 2 / 1      //除法

2

[[email protected]
~]# expr 2 – 1        //减法

1

[[email protected]
~]# expr 2 % 1                //取余

0

职责变量:

0-9           常用的为1-玖

透过脚本来看些地点变量:

[[email protected]
shellscripts]# cat a.sh

#!/bin/bash

echo $1

echo $2

echo $3

echo $0

[[email protected]
shellscripts]# a.sh a b c d e

a

b

c

/shellscripts/a.sh           //$0打印的是脚本笨的名字

 

[[email protected]
shellscripts]# a.sh 1 2

3

[[email protected]
shellscripts]# a.sh 2 3

5

[[email protected]
shellscripts]# cat a.sh

#!/bin/bash

echo `expr $1 + $2`             //$一和$贰代表了二个职位变量

[[email protected]
shellscripts]#

 

预约义变量

$#  : 一声令下行中地方参数的个数

$*  : 享有地方参数的剧情

$?  :
上一条命令实行后赶回的景况,当状态为0时意味着平常,非0表示实践卓殊或出错。

$$  : 当前所在进度的进程号

$!  :  后台运行的结尾3个经过号

$0  :  时下施行的进程/进度名

剧本的正规化书写:

#!/bin/bash

#Date : 2014-5-28

#Author : Create by meng       //脚本的开山

#Mail :~~                                   //邮件地址

#Func (do):this is useradd user script.            //脚本的功能

#V1.一                  //脚本的本子

echo “hello,world!”            //前边的才是本子的情节

 

作品版权:

 

字符串比较

 格式 [ 字符串1 = 字符串2 ]

      [ 字符串1 != 字符串2 ]

      [ -z 字符串 ]

 

常用的测试操作符

  =:字符串内容一样

 !=:字符串内容不等同,!号表示相反的意趣

  -z:字符内容为空

#read -p “input your name: ”  name

root

#echo $name

#[ $name != “root”] && echo “name is erro”

##read -p “input your name: ”  name

zhangsan

#[ $name != “root”] && echo “name is erro”

#echo $name

小说版权:

 

逻辑测试

   格式:[表达式1]   操作符  [表达式2]

  常用的测试操作符

   -a 或&&:逻辑与,“而且”的意思

  #前后五个表明式都创立是整个测试结果才为真,不然为假

   (前边真则试行前面)

   -o或||:逻辑或,可能的意思

   #操作符两边至少多少个为真时,结果为真,不然结果为假

    (前边假则施行前边)

   !:逻辑否

  #当钦赐条件不成立刻,重回结果为真

 

     if条件语句   –单分支

当“条件创建“时执行相应的操作

         if  标准测试命令               if
磁盘已用空间>4/5

                 then 一声令下种类   ==》      then 报警

           fi             

应用案例:

  壹旦/boot分区的上空利用超越八成,输出报告警方新闻

  #!/bin/bash

 RATE=`df |awk’NR==4{print int($5)}’`

 if [$RATE -gt 80]

  then

  echo “warning,DISK is full!”

  if

 

 

                 if条件语句–双拨出

当“条件建设构造”、“条件不创设”时进行分化的操作

 

if 条件测试命令                if 330陆端口是或不是在监听状态

 then 命令系列1         ==》      then mysqld 劳务已运营

 else 指令系列2                    else 启动mysqld服务

fi                   

 

引用案例:

看清vsftp是或不是在运营。若已运行则输出提醒音信,不然重新起动vsftp服务

#!/bin/bash

service vsftp status &>/dev/null

 if [ $? -eq 0 ]

then

 echo “vsftp service is running”

 else

  /etc/init.d/vsftp restart

 fi

 

设若/boot分区的上空应用超越十分八,输出警报音信。大家来写个本子

 

#vi a.sh

#!/bin/bash

#a.sh

NUM=`df | awk ‘NR==5{print int($5)}’`

if

[ $NUM -gt 80 ]

then

 echo “Warning,DISK is full!”

if

 

awk的附加扩大

 

[[email protected]
~]# cat /etc/passwd | grep bash | awk -F: ‘{print ($1)}’

root

lenovo

[[email protected]
www.ca88.com,~]# ^C

作品版权:

 

for循环语句                            for  收件人  in
邮件地址列表

基于变量的不通值,重复实施一组命令操作   ==》                do

for 变量名  in 取值列表                       发邮件    

do                                        done

一声令下种类

done

 

#!/bin/bash

for TM in a b c d e

do

echo $TM

sleep 1

done

~                                                                                                                                
                                

双重测试钦赐的规则,只要条件建构则往往试行相应的吩咐操作

 

while 指令或表达式          while 可用内部存储器<十0mb

do             ==》do

     一声令下列表      获得可用内部存款和储蓄器数

done                    done

小说版权:

 

多种分支语句

[email protected]
~]# cat a.sh

#!/bin/bash

#a.sh

case $1 in

start)

      echo “start….”

           ;;

stop)

      echo “stop……”

      ;;

restart)

      echo “restart……..”

      ;;

laod)

     echo “laod…….”

      ;;

status)

      echo “start…..”

      echo “stop……”

      ;;

esac

 

[[email protected]
~]# ./a.sh start

start….

[[email protected]
~]# ./a.sh stop

stop……

[[email protected]
~]#

[[email protected]
~]# cat a.sh

#!/bin/bash

#a.sh

read -p “input:” NUM

case “$NUM” in

[a-z]|[A-Z])

      echo “it is english”

      ;;

[0-9])

      echo “it is shuzi”

      ;;

*)

      echo “………”

      ;;

esac

[[email protected]
~]#

 

[[email protected]
~]# ./a.sh

input:2

it is shuzi

[[email protected]
~]# ./a.sh

input:a

it is english

[[email protected]
~]# ./a.sh @

input:@

………

[[email protected]
~]# ./a.sh

input:#

………

[[email protected]
~]#

 

      shift迁移语句

用来迁移地点变量,将$一~$九依次向左传递

 

[[email protected]
~]# ./a.sh 10 20

The sum is: 30

[[email protected]
~]# cat a.sh

#!/bin/bash

#a.sh

Result=0

while [ $# -gt 0 ]

      do

Result=`expr $Result + $1`

      shift

      done

      echo “The sum is: $Result”

[[email protected]
~]#

 

 

break语句

 

用以跳出当前的循环体,实践循环体后的讲话。

 

函数的施用

 

[[email protected]
~]# ./c.sh

46

55

[[email protected]
~]# cat c.sh

#!/bin/bash

#c.sh

adder(){

echo `expr $1 + $2`

}

 

adder 12 34

adder 22 33

[[email protected]
~]# ./c.sh

46

55

[[email protected]
~]#

 

 

注明:以上文化全来自与自学shell编制程序总括回看

 

作品版权: …

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图