第1章 shell基础

读书目录

Shell编程基础篇-上,Shell编程基础篇-

centos   shell脚本编程1 正则  shell脚本结构  read命令  date命令的用法
 shell中的逻辑判断  if 判断文件、目录属性  shell数组简单用法 $( ) 和${ }
和$(( )) 与  sh -n  sh -x  sh -v 第三十五节课

1.1 什么是shell

Shell是一个下令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并拍卖千丝万缕的操作系统的出口结果,输出显示器重临给用户。

  • 1.1 前言
  • 1.2
    脚本书写规范
  • 1.3
    shell脚本的施行
  • 1.4
    Shell的变量
  • 1.5 特殊变量
  • 1.6
    定义变量的主意
  • 1.7 变量的子串
  • 1.8
    变量的数值计算
  • 1.9 补充表达
  • 1.9.1 参考文献

1.1 前言

 

1.1.1 shell对话方式

互动的点子:从键盘输入命令,通过/bin/bash的解析,可以登时收获Shell的答复,一问一答的法门

非交互式:shell脚本 

回来顶部

1.1.1 为何学Shell

Shell脚本语言是达成Linux/UNIX系统管理及自动化运维所要求的重点工具,
Linux/UNIX系统的尾部及基础运用软件的着力大都涉及Shell脚本的始末。每个合格
的Linux系统管理员或运维工程师,都亟待可以熟知地编写Shell脚本语言,并可以阅
读系统及各样软件附带的Shell脚本内容。只有如此才能升级运维人士的工作功用,适
应曰益复杂的做事条件,减弱不须求的重复工作,从而为私家的职场发展奠定较好的基本功

留神:脚本写到一行最好用分号; 

1.2 为何接纳shell编程

用作一个通关的运维人士必须控制一种或一种以上的脚本语言,shell编程则是贯彻Linux/UNIX系统管理及自动化运维所不可或缺的严重性工具,能够把繁琐重复的吩咐写到shell脚本中实践,节约时间,有效的增强运维人士的工作功能,减弱不需求的重新工作时间。

1.1 前言

1.1.2 什么是shell

Shell是一个指令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理千头万绪的操作系统的输出结果,输出屏幕再次回到给用户。

那种对话情势可以是:

互动的办法:从键盘输入命令,通过/bin/bash的辨析,可以立时赢得Shell的作答

[[email protected] ~]# ls            
anaconda-ks.cfg  
[[email protected] ~]# echo ls |bash 
anaconda-ks.cfg   

非交互的措施: 脚本

澳门金沙国际 1

if ls /tmp/sdfsdf >/dev/null 2>&1 ;then echo ok;else echo notok; fi

1.3 系统中的shell

linux系统暗许shell是bash

[root@zeq ~]# cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh  

1.1.1 为啥学Shell

Shell脚本语言是兑现Linux/UNIX系统管理及自动化运维所必不可少的严重性工具, Linux/UNIX系统的底部及基础运用软件的主旨大都涉及Shell脚本的情节。每一种合格 的Linux系统管理员或运维工程师,都亟待可以熟知地编写Shell脚本语言,并可以阅 读系统及各个软件附带的Shell脚本内容。惟有这么才能升级运维人士的工作效能,适 应曰益复杂的办事条件,减弱不要求的双重工作,从而为私有的职场发展奠定较好的基本功

1.1.3 什么是Shell脚本

  命令、变量和流程控制语句等有机的结缘起来

        
shell脚本擅长处理纯文本类型的数量,而linux中,大概所有的配置文件,日志,都以纯文本类型文件

 

第2章 变量

1.1.2 什么是shell

Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理千头万绪的操作系统的出口结果,输出显示屏重临给用户。

那种对话方式得以是:

互相的艺术:从键盘输入命令,通过/bin/bash的解析,可以马上得到Shell的作答

[root@clsn ~]# ls            
anaconda-ks.cfg  
[root@clsn ~]# echo ls |bash 
anaconda-ks.cfg   

非交互的办法: 脚本

澳门金沙国际 2

1.1.4 脚本语言的项目

一、编译型语言

定义:指用专用的编译器,针对一定的操作平台(操作系统)将某种高级语言源代码三次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令、及相应的格式),这一个进度叫做编译(./configure 
make makeinstall
);编译好的可执行性文件(.exe),可在相对应的平台上运行(移植性差,但运行作用高)。。

良好的编译型语言有, C语言、C++等。

除此以外,Java语言是一门很特殊的言语,Java程序必要开展编译步骤,但并不会转移特定平台的二进制机器码,它编译后生成的是一种与平台无关的字节码文件(*.class)(移植性好的因由),那种字节码自然无法被平台一向实施,运行时索要由解释器解释成相应平台的二进制机器码文件;一大半人觉着Java是一种编译型语言,但大家说Java即是编译型语言,也是解释型语言也并从未错。

二、解释型语言

定义:指用专门解释器对源程序逐行解释成特定平台的机器码并及时实施的语言;也等于把编译型语言的编译链接进程混到一起还要到位的。

解释型语言执行作用较低,且不可以脱离解释器运行,但它的跨平台型相比较易于,只需提供一定解释器即可。

大规模的解释型语言有, Python(同时是脚本语言)与Ruby等。

三、脚本语言

定义:为了裁减古板的编写-编译-链接-运行(edit-compile-link-run)进程而创办的电脑编程语言。

特点:程序代码即是最终的实践文书,只是这一个进程须求解释器的插足,所以说脚本语言与解释型语言有很大的牵连。脚本语言平时是被诠释实施的,而且程序是文件文件。

一级的脚本语言有,JavaScript,Python,shell等。

任何常用的脚本语句种类

PHP是网页程序,也是脚本语言。是一款更专注于web页面开发(前端展示)的脚本语言,例如:Dedecms,discuz。PHP程序也足以处理系统日志,配置文件等,php也可以调用系统命令。

Perl脚本语言。比shell脚本强大很多,语法灵活、复杂,完成方式很多,不易读,团队通力合营困难,但仍不失为很好的脚本语言,存世大批量的次第软件。MHA高可用Perl写的

Python,不但可以做脚本程序支付,也得以兑现web程序以及软件的付出。近两年越来越多的营业所都会需求会Python。

Shell脚本与php/perl/python语言的分别和优势?

shell脚本的优势在于处理操作系统底层的事情
(linux系统内部的运用都以shell脚本完毕)因为有大气的linux系统命令为它做支撑。2000多少个指令都以shell脚本编程的强有力支撑,尤其是grep、awk、sed等。例如:一键软件设置、优化、监控告警脚本,常规的事务使用,shell开发更简约疾速,符合运维的概括、易用、高效原则.

  PHP、Python优势在于付出运维工具以及web界面的管理工具,web业务的开发等。处理一键软件安装、优化,报警脚本。常规工作的运用等php/python也是可以达成的。但是付出作用和错综复杂比用shell就差很多了。

系统环境表达

[[email protected] scripts]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[[email protected] scripts]# uname -r
3.10.0-693.el7.x86_64
[[email protected] scripts]# getenforce 
Disabled
[[email protected] scripts]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

种种协会语句后边都得以加分号表示语句的利落,可是分多行来书写不会加其他分号特别美观

2.1 什么是变量

x+y=20     x=10  y=? 未知数(变量)

一个未知数,随时可以变更的量叫变量

1.1.3 什么是Shell脚本

  命令、变量和流程控制语句等有机的构成起来

        
shell脚本擅长处理纯文本类型的数目,而linux中,大致所有的配备文件,日志,都是纯文本类型文件

1.1.5 系统中的shell

查阅系统中的命解释器

[[email protected] ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

常用操作系统的默许shell

1.Linux是Bourne Again shell(bash)

2.Solaris和FreeBSD缺省的是Bourne shell(sh)

3.AIX下是Korn Shell(ksh)

4.HP-UX缺省的是POSIX shell(sh)

[[email protected] ~]# echo $SHELL
/bin/bash

bash版本

[[email protected] scripts]# bash -version
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html>

这是自由软件,您可以自由地更改和重新发布。
在法律允许的范围内没有担保. 

bash 破壳漏洞

使用 命令 env x='() { :;}; echo be careful' bash -c "echo this is a test"
如果返回结果为一行,则为正常,
 [[email protected] ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
 this is a test

#解决办法 升级当前的bash版本
 yum install update bash

sh与bash 的关系

[[email protected] ~]#  ll /bin/sh
lrwxrwxrwx. 1 root root 4 11月 13 11:15 /bin/sh -> bash

/bin与 /user/bin 的关系

[[email protected] ~]# ll /bin -d
lrwxrwxrwx. 1 root root 7 11月 13 11:15 /bin -> usr/bin
#!/bin/bash
cd /etc/ ;
for a in `ls /etc/` ;
do  
if [ -d /etc/$a ]  ;
then
ls -d /etc/$a ;
fi ;
done ;

2.2 变量的归类

1.1.4 脚本语言的类型

一、编译型语言

定义:指用专用的编译器,针对一定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令、及相应的格式),那几个历程叫做编译(./configure 
make
makeinstall );编译好的可执行性文件(.exe),可在相呼应的阳台上运行(移植性差,但运行功能高)。。

超级的编译型语言有, C语言、C++等。

别的,Java语言是一门很相当的语言,Java程序须要展开编译步骤,但并不会生成特定平台的二进制机器码,它编译后生成的是一种与平台无关的字节码文件(*.class)(移植性好的由来),这种字节码自然不可以被平台一向执行,运行时须要由解释器解释成对应平台的二进制机器码文件;大部分人认为Java是一种编译型语言,但大家说Java即是编译型语言,也是解释型语言也并没有错。

二、解释型语言

定义:指用专门解释器对源程序逐行解释成特定平台的机器码并立时施行的言语;相当于把编译型语言的编译链接进程混到一起还要做到的。

解释型语言执行功用较低,且不能够脱离解释器运行,但它的跨平台型相比较便于,只需提供特定解释器即可。

广大的解释型语言有, Python(同时是脚本语言)与Ruby等。

三、脚本语言

定义:为了裁减古板的编排-编译-链接-运行(edit-compile-link-run)进程而创建的统计机编程语言。

特点:程序代码即是最后的施行文书,只是这几个进度要求解释器的加入,所以说脚本语言与解释型语言有很大的联系。脚本语言经常是被分解施行的,而且程序是文本文件。

拔尖的脚本语言有,JavaScript,Python,shell等。

其余常用的脚本语句种类

PHP是网页程序,也是脚本语言。是一款更令人瞩目于web页面开发(前端呈现)的脚本语言,例如:Dedecms,discuz。PHP程序也能够拍卖系统日志,配置文件等,php也得以调用系统命令。

Perl脚本语言。比shell脚本强大很多,语法灵活、复杂,完成情势很多,不易读,团队通力合营困难,但仍不失为很好的脚本语言,存世巨量的次第软件。MHA高可用Perl写的

Python,不但可以做脚本程序支付,也能够完结web程序以及软件的支出。近两年更为多的小卖部都会必要会Python。

Shell脚本与php/perl/python语言的分化和优势?

shell脚本的优势在于处理操作系统底层的事务 (linux系统内部的施用都以shell脚本落成)因为有大气的linux系统命令为它做支撑。2000多少个指令都以shell脚本编程的强劲支撑,特别是grep、awk、sed等。例如:一键软件安装、优化、监控告警脚本,常规的业务应用,shell开发更不难高效,符合运维的粗略、易用、高效原则.

  PHP、Python优势在于付出运维工具以及web界面的管理工具,web业务的付出等。处理一键软件设置、优化,报警脚本。常规工作的施用等php/python也是可以不辱职分的。但是付出功能和复杂性比用shell就差很多了。

系统环境认证

澳门金沙国际 3

[root@clsn scripts]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
[root@clsn scripts]# uname -r
3.10.0-693.el7.x86_64
[root@clsn scripts]# getenforce 
Disabled
[root@clsn scripts]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

澳门金沙国际 4

1.2 脚本书写规范

对比

2.2.1 普通变量(局部变量)

只好在现阶段条件下使用,可以通过export命令临时把普通变量变为环境变量使用

[root@zeq ~]# ip=10.0.0.201     给变量赋值(把数据存放到变量中)

[root@zeq ~]# echo $ip

10.0.0.201

1.1.5 系统中的shell

查阅系统中的命解释器

澳门金沙国际 5

[root@clsn ~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

澳门金沙国际 6

常用操作系统的默许shell

1.Linux是Bourne Again shell(bash)

2.Solaris和FreeBSD缺省的是Bourne shell(sh)

3.AIX下是Korn Shell(ksh)

4.HP-UX缺省的是POSIX shell(sh)

[root@clsn ~]# echo $SHELL
/bin/bash

bash版本

澳门金沙国际 7

[root@clsn scripts]# bash -version
GNU bash, 版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高 <http://gnu.org/licenses/gpl.html>

这是自由软件,您可以自由地更改和重新发布。
在法律允许的范围内没有担保. 

澳门金沙国际 8

bash 破壳漏洞

澳门金沙国际 9

使用 命令 env x='() { :;}; echo be careful' bash -c "echo this is a test"
如果返回结果为一行,则为正常,
 [root@clsn ~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
 this is a test

#解决办法 升级当前的bash版本
 yum install update bash

澳门金沙国际 10

sh与bash 的关系

[root@clsn ~]#  ll /bin/sh
lrwxrwxrwx. 1 root root 4 11月 13 11:15 /bin/sh -> bash

/bin与 /user/bin 的关系

[root@clsn ~]# ll /bin -d
lrwxrwxrwx. 1 root root 7 11月 13 11:15 /bin -> usr/bin

回到顶部

1.2.1 脚本统一存放目录

[[email protected] ~]# mkdir -p /server/scripts/
[[email protected] ~]# cd /server/scripts/
#!/bin/bash
cd /etc/
for a in `ls /etc/`
do  
if [ -d /etc/$a ]  
then
ls -d /etc/$a
fi
done 

2.2.2 环境变量(全局变量)

1.大写

2.连串定义的

3.在大部位置可以使用

1.2 脚本书写规范

1.2.2 拔取解释器

留意格式 ↓

内部始发的”#!”字符又叫做幻数,在实施bash脚本的时候,内核会依据”#!”后的解释器来规定该用那些程序解释那几个本子中的内容。

[[email protected] scripts]# head -1 /etc/init.d/*
==> /etc/init.d/functions <==
# -*-Shell-script-*-

==> /etc/init.d/netconsole <==
#!/bin/bash

==> /etc/init.d/network <==
#! /bin/bash

 

2.2.3 特殊变量

$1   $2   $数字        $后数字是几意味着shell脚本第几个参数

$#                           shell脚本中参数的个数

                               判断脚本的参数个数

$?                          上一个下令的推行结果(重回值)

                              0             执行科学

澳门金沙国际,                              非0           执行破产

$0                          脚本文件名

1.2.1 脚本统一存放目录

[root@clsn ~]# mkdir -p /server/scripts/
[root@clsn ~]# cd /server/scripts/

1.2.3 编辑脚本使用vim

接纳 .vimrc 文件,可以迅速的变迁初叶的注释音讯

[[email protected] scripts]# cat  ~/.vimrc 
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"

func SetTitle()
    if expand("%:e") == 'sh'
        call setline(1,"#!/bin/bash")
        call setline(2, "##############################################################")
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: clsn")
        call setline(6, "# Organization: http://blog.znix.top")
        call setline(7, "# Created Time : ".strftime("%F %T"))
        call setline(8, "# Description:")
        call setline(9, "##############################################################")
        call setline(10, "")
    endif
endfunc

动用后的功能

[[email protected] scripts]# cat  scripts_test.sh 
#!/bin/bash
##############################################################
# File Name: scripts_test.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-04 11:39:57
# Description:  First scripts file
##############################################################

在Shell脚本中,跟在#背后的内容表示注释。注释部分不会被实施,仅给人看。注释可以自成一行,也足以跟在命令前边,与命令同行。要养成写注释的习惯,方便自身与外人。

不过不要中文注释,因为在不一致字符集的系统会油可是生乱码。(字符集为zh_CN.UTF-8,为中文)。

 

第3章 shell脚本的书写规范

1.2.2 接纳解释器

注意格式 ↓

内部始发的”#!”字符又叫做幻数,在进行bash脚本的时候,内核会依照”#!”后的解释器来确定该用那多少个程序解释这一个剧本中的内容。

澳门金沙国际 11

[root@clsn scripts]# head -1 /etc/init.d/*
==> /etc/init.d/functions <==
# -*-Shell-script-*-

==> /etc/init.d/netconsole <==
#!/bin/bash

==> /etc/init.d/network <==
#! /bin/bash

澳门金沙国际 12

1.2.4 文件名正式

         名字要有意义,并且末了以 .sh 为止

 

3.1.1 脚本存放地点

为了防止脚本乱放,统一存放在/server/scripts/中

始建目录

[root@zeq ~]# mkdir -p /server/scripts/

[root@zeq ~]# cd /server/scripts/

1.2.3 编辑脚本使用vim

选取 .vimrc 文件,可以迅速的扭转起首的诠释讯息

澳门金沙国际 13

[root@clsn scripts]# cat  ~/.vimrc 
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"

func SetTitle()
    if expand("%:e") == 'sh'
        call setline(1,"#!/bin/bash")
        call setline(2, "##############################################################")
        call setline(3, "# File Name: ".expand("%"))
        call setline(4, "# Version: V1.0")
        call setline(5, "# Author: clsn")
        call setline(6, "# Organization: http://blog.znix.top")
        call setline(7, "# Created Time : ".strftime("%F %T"))
        call setline(8, "# Description:")
        call setline(9, "##############################################################")
        call setline(10, "")
    endif
endfunc

澳门金沙国际 14

拔取后的机能

澳门金沙国际 15

[root@clsn scripts]# cat  scripts_test.sh 
#!/bin/bash
##############################################################
# File Name: scripts_test.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-04 11:39:57
# Description:  First scripts file
##############################################################

澳门金沙国际 16

在Shell脚本中,跟在#末端的始末表示注释。注释部分不会被执行,仅给人看。注释可以自成一行,也得以跟在指令后边,与命令同行。要养成写注释的习惯,方便温馨与旁人。

极端不要汉语注释,因为在差异字符集的系统会师世乱码。(字符集为zh_CN.UTF-8,为中文)。

1.2.5 开发的科班和习惯小结

1) 放在统一的目录

2) 脚本以.sh为伸张名

3) 初叶指定脚本解释器。

4) 起首加版本版权等新闻,可布署~/.vimrc文件自动抬高。

5) 脚本不要用中文注释,尽量用英文表明。

6) 代码书写美好习惯

  a、成对的始末一遍性写出来,避免遗漏,如[  ]、’ ‘、” “等

  b、[  ]两端要有空格,先输入[  ],退格,输入2个空格,再退格写。

  c、流程控制语句三次书写完,再添加内容。(if 条件 ; then  内容;fi)ddd

  d、通过缩进让代码易读。

  f、脚本中的引号都以英文状态下的引号,其余字符也是英文状态。

上半节课
正则
shell脚本结构
date命令的用法

3.1.2 脚本编辑使用vim

1.2.4 文件名正式

         名字要有含义,并且最后以 .sh 为止

1.3 shell脚本的实施

 

3.1.3 拔取解释器

在进行bash脚本的时候,内核会依照”#!”后的解释器来确定该用这一个程序解释这些剧本中的内容。

[root@zeq ~]# vim /server/scripts/cal.sh    

#!/bin/bash

1.2.5 开发的科班和习惯小结

1) 放在统一的目录

2) 脚本以.sh为扩充名

3) 初阶指定脚本解释器。

4) 先河加版本版权等新闻,可安排~/.vimrc文件自动抬高。

5) 脚本不要用普通话注释,尽量用英文注解。

6) 代码书写美好习惯

  a、成对的内容五遍性写出来,防止遗漏,如[  ]、’ ‘、” “等

  b、[  ]两端要有空格,先输入[  ],退格,输入2个空格,再退格写。

  c、流程控制语句三回书写完,再添加内容。(if 条件 ; then  内容;fi)ddd

  d、通过缩进让代码易读。

  f、脚本中的引号都是英文状态下的引号,其余字符也是英文状态。

回到顶部

1.3.1 执行脚本的办法

sh/bash   scripts.sh 
chown +x   ./scripts.sh  && ./scripts.sh  
source scripts.sh
. (空格) scripts.sh
cat oldboyedu.sh |bash  # 效率较低

*source 与 . (点) 的作用***

soucre命令

[[email protected] ~]# help source  |head -2
source: source 文件名 [参数]
    在当前 shell 中执行一个文件中的命令。

. (点)

[[email protected] scripts]# help . |head -2
.: . 文件名 [参数]
    在当前 shell 中执行一个文件中的命令。

下半节课
shell中的逻辑判断
if 判断文件、目录属性
shell数组简单用法
sh -n sh -x  sh -v 
$( ) 和${ } 和$(( ))

3.1.4 文件名书写

文件名称一定要有意义,方便探望是干嘛用的本子,并且以.sh结尾

1.3 shell脚本的履行

1.3.2 sh 于 source的区别

澳门金沙国际 17

[[email protected] scripts]# sh  clsn_test.sh 
Hello World!
[[email protected] scripts]# echo $clsn
#  sh  新建一个Shell窗口(新建一个进程)执行一个文件中的命令。

[[email protected] scripts]# source clsn_test.sh 
Hello World!
[[email protected] scripts]# echo $clsn
Hello World!

面试题:

问sh test.sh后echo $user再次来到的结果__空_ ?

[[email protected] scripts]# cat test.sh 
#!/bin/bash
user=`whoami`

 

3.1.5 书写脚本的科班和习惯

1、  放在统一目录下,方便寻找

2、  书写脚本要用vim编辑,

  批量剔除

  批量充实

  1.进入批量编辑方式(可视块)esc下ctrl+v

  2.拔取 批量扩展的限量

  3.按 shift + i 进行改动

  4.按esc 退出等等

3、 脚本文件名称以.sh为止

4、 脚本伊始一定要指定解释器

5、
脚本中#表示注释,#后的始末不会执行,不用的授命等能够用#声明掉,脚本中尽量不要出现中文注释防止出现因字符集分歧暴发乱码

6、 代码符号书写规范

     1.成对的号子一定要都写出来再添加内容,幸免遗忘漏写;如 “” ”
[]等

     2.流程控制语句四次书写完,再添加内容;(if 条件 ; then  内容;fi)

       3.书写的代码符号都是英文输入法格式

       4.透过缩进让代码易读

1.3.1 执行脚本的情势

sh/bash   scripts.sh 
chown +x   ./scripts.sh  && ./scripts.sh  
source scripts.sh
. (空格) scripts.sh
cat oldboyedu.sh |bash  # 效率较低

*source 与 . (点) 的作用***

soucre命令

[root@clsn ~]# help source  |head -2
source: source 文件名 [参数]
    在当前 shell 中执行一个文件中的命令。

. (点)

[root@clsn scripts]# help . |head -2
.: . 文件名 [参数]
    在当前 shell 中执行一个文件中的命令。

1.4 Shell的变量

 

第4章 shell练习

书写一个计算器脚本

1.3.2 sh 于 source的区别

澳门金沙国际 18

澳门金沙国际 19

[root@clsn scripts]# sh  clsn_test.sh 
Hello World!
[root@clsn scripts]# echo $clsn
#  sh  新建一个Shell窗口(新建一个进程)执行一个文件中的命令。

[root@clsn scripts]# source clsn_test.sh 
Hello World!
[root@clsn scripts]# echo $clsn
Hello World!

澳门金沙国际 20

面试题:

问sh test.sh后echo $user重返的结果__空_ ?

[root@oldboy scripts]# cat test.sh 
#!/bin/bash
user=`whoami`

回到顶部

1.4.1 什么是变量

变量可以分为两类:环境变量(全局变量)和一般性变量(局地变量)

  环境变量也可称为全局变量,可以在开立他们的Shell及其派生出来的任意子进程shell中运用,环境变量又可分为自定义环境变量和Bash内置的环境变量

  一般说来变量也可称为局地变量,只可以在创制他们的Shell函数或Shell脚本中采取。普通变量一般是由开发者用户支出脚本程序时创立的。

         独特变量

内容大致:

4.1 数字总括办法

[root@zeq ~]# awk  'BEGIN{print 1/2}'

0.5

1.4 Shell的变量

1.4.2 环境变量

使用 env/declare/shell中的逻辑判断,Shell编程基础篇。set/export -p
命令查看系统中的环境变量,那多个指令的的出口形式稍有例外。

[[email protected] scripts]# env
XDG_SESSION_ID=1
HOSTNAME=clsn
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.0.1 5537 22
SSH_TTY=/dev/pts/0
USER=root
~~~

         输出一个系统中的 环境变量

[[email protected] ~]# echo $LANG
zh_CN.UTF-8
  1. shell脚本是哪些
    它是一种脚本语言,并非编程语言
    可以采用部分逻辑判断、循环等语法
    可以自定义子函数
    是系统命令的会聚
    shell脚本可以落成自动化运维,大大伸张大家的工作作用
    正则
    .:任意一个字符
    *:结合星号前边的标志,a* 0个或七个a
    +:grep不得以一直,加大E 或然egrep 大概脱义符号 grep ‘a\+’
    一个或多少个a
    ?:0个或多个a
    .*:贪婪匹配
    ():匹配,然后替换
    (ab){2,4}: 出现2到4次ab
    [^:]+:非冒号先河的一个或多少个
    ([^:]+)(:.*:)([^:]+) 匹配多段
    sed -r ‘s/([^:]+)(:.*:)([^:]+) /\3\2\1/’ /etc/passwd
    awk -F ‘:’ ‘{print $7}’ /etc/passwd

4.1.1 命令行中的变量 放在awk中行使

awk -v变量=赋值       变量名称本身定义

[root@zeq ~]# awk -vnum1=10  -vnum2=20 'BEGIN{print num1/num2 }'    这里变量为num1和num2

0.5

1.4.1 什么是变量

变量可以分为两类:环境变量(全局变量)和日常变量(局地变量)

  环境变量也可称为全局变量,可以在开立他们的Shell及其派生出来的任意子进度shell中利用,环境变量又可分为自定义环境变量和Bash内置的环境变量

  数见不鲜变量也可称之为局地变量,只好在开创他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户支出脚本程序时创设的。

         奇异变量

1.4.3 普通变量

地面变量在用户眼下的Shell生存期的台本中应用。例如,本地变量OLDBOY取值为bingbing,那个值在用户目前Shell生存期中有含义。如若在Shell中启动另一个进度或剥离,本地变量值将船到江心补漏迟       

概念普通变量实践

[[email protected] ~]# a=1
[[email protected] ~]# b='2'
[[email protected] ~]# c="3"
[[email protected] ~]# echo "$a"
1
[[email protected] ~]# echo "$b"
2
[[email protected] ~]# echo "${c}"

升迁:$变量名代表输出变量,可以用$c和${c}三种用法

统计:一而再普通字符串内容赋值给变量,不管用怎么样引号大概不用引号,它的始末是何等,打印变量就输出什么

 

4.1.2 书写脚本总括10与20的加减乘除

[root@zeq]# vim cal.sh

#!/bin/bash



n1=10

n2=20



awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

履行脚本

[root@zeq /server/scripts]# sh cal.sh

30

-10

200

0.5

1.4.2 环境变量

使用 env/declare/set/export
-p
 命令查看系统中的环境变量,那多个指令的的出口格局稍有例外。

澳门金沙国际 21

[root@clsn scripts]# env
XDG_SESSION_ID=1
HOSTNAME=clsn
TERM=linux
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.0.0.1 5537 22
SSH_TTY=/dev/pts/0
USER=root
~~~

澳门金沙国际 22

         输出一个连串中的 环境变量

[root@clsn ~]# echo $LANG
zh_CN.UTF-8

1.4.4 export命令

[[email protected] ~]# help export 
export: export [-fn] [名称[=值] ...] 或 export -p
为 shell 变量设定导出属性。

标记每个 NAME 名称为自动导出到后续命令执行的环境。如果提供了 VALUE
则导出前将 VALUE 作为赋值。

*export命令的印证***

脚下shell窗口及子shell窗口生效

在新开的shell窗口不会卓有效能,生效须要写入配置文件

# 定义变量

[[email protected] scripts]# CSLN=clsn
[[email protected] scripts]# export CSLN1=1

# 当前窗口查看

[[email protected] scripts]# echo $CSLN
clsn
[[email protected] scripts]# echo $CSLN1
1

# 编写测试脚本

[[email protected] scripts]# vim quanju.sh 
#!/bin/bash
echo $CSLN
echo $CSLN1

# 使用sh执行

[[email protected] scripts]# sh  quanju.sh 

1

# 使用source 执行

[[email protected] scripts]# source quanju.sh 
clsn
1

 

4.1.3 定义特殊变量 通过命令行传递参数格局开展计算

[root@zeq /server/scripts]# vim  cal.sh

#!/bin/bash



n1=$1          第一个参数

n2=$2          第二个参数



awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

 执行脚本

[root@zeq /server/scripts]# sh cal.sh 10 20       后面要跟上两个参数才能执行成功,参数之前加空格

30

-10

200

0.5

1.4.3 普通变量

地方变量在用户目前的Shell生存期的本子中选用。例如,本地变量OLDBOY取值为bingbing,这几个值在用户日前Shell生存期中有含义。即便在Shell中启动另一个经过或退出,本地变量值将船到江心补漏迟       

概念普通变量实践

澳门金沙国际 23

[root@clsn ~]# a=1
[root@clsn ~]# b='2'
[root@clsn ~]# c="3"
[root@clsn ~]# echo "$a"
1
[root@clsn ~]# echo "$b"
2
[root@clsn ~]# echo "${c}"

澳门金沙国际 24

提示:$变量名代表输出变量,能够用$c和${c}二种用法

统计:两次三番普通字符串内容赋值给变量,不管用哪些引号大概不用引号,它的内容是何等,打印变量就输出什么

1.4.5 环境变量相关布置文件

/etc/proflie

/etc/bashrc

~/.bashrc

~/.bash_profile

/etc/proflie.d/  # 目录

*四文书读取顺序(CentOS6和7都一样)*

① /etc/profile

② ~/.bash_profile

③ ~/.bashrc

④ /etc/bashrc

澳门金沙国际 25

文本读取过程示意图

表明四文本读取顺序的点子

sed -i '1a echo "$(date +%T-%s) /etc/profile1" >>/tmp/clsn' /etc/profile
sed -i '$a echo "$(date +%T-%s) /etc/profile2" >>/tmp/clsn' /etc/profile
sed -i '1a echo "$(date +%T-%s) /etc/bashrc1" >>/tmp/clsn' /etc/bashrc
sed -i '$a echo "$(date +%T-%s) /etc/bashrc2" >>/tmp/clsn' /etc/bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bashrc1" >>/tmp/clsn' ~/.bashrc
sed -i '$a echo "$(date +%T-%s) ~/.bashrc2" >>/tmp/clsn' ~/.bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bash_profile1" >>/tmp/clsn' ~/.bash_profile
sed -i '$a echo "$(date +%T-%s) ~/.bash_profile2" >>/tmp/clsn' ~/.bash_profile
  1. shell脚本结构以及执行措施以及命名规则
    开班行指定bash路径: #! /bin/bash
    以#千帆竞发的行作为解释表明
    本子的名字以.sh结尾,用于区分那是一个shell脚本
    实施措施有二种:chmod +x 1.sh; ./1.sh 倘使没有实施权限可以 bash 1.sh
    bash -x 1.sh 足以查阅脚本执行过程
    shell的变量和函数命名无法有横杠,只好是大小写字母、 下划线、 数字  例如
     check-service(){} 错误 check_service(){} 正确

4.2 通过read 交互式

read交互式赋予变量内容

read -p “提醒音讯:”  变量名字

read -p “提醒消息:”  p

推行之后会把输入的音讯寄存在变量中

[root@zeq /server/scripts]# read -p "input num1:" n1

input num1:zeq

[root@zeq /server/scripts]# echo $n1

zeq

1.4.4 export命令

[root@clsn ~]# help export 
export: export [-fn] [名称[=值] ...] 或 export -p
为 shell 变量设定导出属性。

标记每个 NAME 名称为自动导出到后续命令执行的环境。如果提供了 VALUE
则导出前将 VALUE 作为赋值。

*export一声令下的辨证***

时下shell窗口及子shell窗口生效

在新开的shell窗口不会生效,生效须求写入配置文件

# 定义变量

[root@clsn scripts]# CSLN=clsn
[root@clsn scripts]# export CSLN1=1

# 当前窗口查看

[root@clsn scripts]# echo $CSLN
clsn
[root@clsn scripts]# echo $CSLN1
1

# 编写测试脚本

[root@clsn scripts]# vim quanju.sh 
#!/bin/bash
echo $CSLN
echo $CSLN1

# 使用sh执行

[root@clsn scripts]# sh  quanju.sh 

1

# 使用source 执行

[root@clsn scripts]# source quanju.sh 
clsn
1

1.4.6 环境变量的知识小结

ü 变量名平常要大写。

ü 变量能够在自己的Shell及子Shell中运用。

ü 常用export来定义环境变量。

ü 执行env暗中同意可以突显所有的环境变量名称及相应的值。

ü 输出时用“$变量名”,撤销时用“unset变量名”。

ü 书写crond定时义务时要留心,脚本要用到的环境变量最好先在所实施的Shell脚本中再度定义。

ü 如若期待环境变量永久生效,则足以将其位于用户环境变量文件或全局环境变量文件里。

 

4.2.1 通过read命令已毕 n1 n2赋值 举办测算

[root@zeq /server/scripts]# vim cal.read.sh

#!/bin/bash



read -p "input num1,num2:" n1 n2     一条命令直接定义两个变量



awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

施行脚本

[root@zeq /server/scripts]# sh cal.read.sh

input num1,num2:10 20         随便输入两个数值,中间要有空格

30

-10

200

0.5 

1.4.5 环境变量相关陈设文件

/etc/proflie

/etc/bashrc

~/.bashrc

~/.bash_profile

/etc/proflie.d/  # 目录

*四文本读取顺序(CentOS6和7都一样)*

① /etc/profile

② ~/.bash_profile

③ ~/.bashrc

④ /etc/bashrc

澳门金沙国际 26

文件读取进程示意图

表明四文本读取顺序的不二法门

澳门金沙国际 27

sed -i '1a echo "$(date +%T-%s) /etc/profile1" >>/tmp/clsn' /etc/profile
sed -i '$a echo "$(date +%T-%s) /etc/profile2" >>/tmp/clsn' /etc/profile
sed -i '1a echo "$(date +%T-%s) /etc/bashrc1" >>/tmp/clsn' /etc/bashrc
sed -i '$a echo "$(date +%T-%s) /etc/bashrc2" >>/tmp/clsn' /etc/bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bashrc1" >>/tmp/clsn' ~/.bashrc
sed -i '$a echo "$(date +%T-%s) ~/.bashrc2" >>/tmp/clsn' ~/.bashrc
sed -i '1a echo "$(date +%T-%s) ~/.bash_profile1" >>/tmp/clsn' ~/.bash_profile
sed -i '$a echo "$(date +%T-%s) ~/.bash_profile2" >>/tmp/clsn' ~/.bash_profile

澳门金沙国际 28

1.4.7 变量中引号的利用

除非在变量的值中有空格的时候,会使用引号。

单引号与双引号的界别在于,是还是不是可以分析特殊符号。

[[email protected] ~]# name=znix
[[email protected] ~]# name2='clsn'
[[email protected] ~]# name3="http://blog.znix.top"
[[email protected] ~]# echo $name
znix
[[email protected] ~]# echo $name2
clsn
[[email protected] ~]# echo $name3
http://blog.znix.top
[[email protected] ~]# name4='cl sn'
[[email protected] ~]# echo $name4
cl sn
[[email protected] ~]# name5="cl sn"
[[email protected] ~]# echo $name5
cl sn
[[email protected] ~]# name6='cl sn $PWD'
[[email protected] ~]# echo $name6
cl sn $PWD
[[email protected] ~]# name6="cl sn $PWD"
[[email protected] ~]# echo $name6
cl sn /root

 

4.3 条件表达式  if

1.4.6 环境变量的文化小结

ü 变量名平日要大写。

ü 变量可以在自我的Shell及子Shell中选择。

ü 常用export来定义环境变量。

ü 执行env暗许可以体现所有的环境变量名称及相应的值。

ü 输出时用“$变量名”,打消时用“unset变量名”。

ü 书写crond定时职责时要留意,脚本要用到的环境变量最好先在所执行的Shell脚本中重新定义。

ü 即使希望环境变量永久生效,则可以将其位于用户环境变量文件或全局环境变量文件里。

1.4.8 普通变量的渴求

1)    
内容是纯数字、简单的连年字符(内容中不带任何空格)时,定义时得以不加任何引号,例如:

a.ClsnAge=22

b.NETWORKING=yes

2)    
没有万分情状时,字符串一律用双引号定义赋值,尤其是三个字符串中间有空格时,例如:

a.NFSD_MODULE=”no load”

b.MyName=”Oldboy is a handsome boy.”

3)    
当变量里的故事情节必要原样输出时,要用单引号(M),那样的需求极少,例如:

a.OLDBOY_NAME=’OLDBOY’

变量使用反引号赋值

[[email protected] scripts]# time=`date`
[[email protected] scripts]# echo $time
2017年 12月 05日 星期二 09:02:06 CST

[[email protected] scripts]# file=`ls`
[[email protected] scripts]# echo $file
clsn_test.sh panduan.sh quanju.sh yhk.sh

使用${}

打印变量的时候幸免出现“金硬汉新著”的标题

[[email protected] scripts]# time=`date`
[[email protected] scripts]# echo $time_day

[[email protected] scripts]# echo ${time}_day
2017年 12月 05日 星期二 09:02:06 CST_day
[[email protected] scripts]# echo $time-day
2017年 12月 05日 星期二 09:02:06 CST-day

编排脚本测试${}

 # 使用脚本测试
 [[email protected] scripts]# vim bianliang.sh 
 #!/bin/bash
 #############################################################
 # File Name: bianliang.sh
 # Version: V1.0
 # Author: clsn
 # Organization: http://blog.znix.top
 # Created Time : 2017-12-05 09:10:29
 # Description:
 #############################################################

 time=`date`
 echo $timeday
 echo ${time}day

 [[email protected] scripts]# sh  bianliang.sh 

 2017年 12月 05日 星期二 09:11:19 CSTday
  1. 学会date命令的用法
    命令格式:date [参数]… [+格式]
    慎选参数:
    -d<字符串>
     彰显字符串所指的日子与时光。字符串前后必须抬高双引号。
    -s<字符串>
     依据字符串来安装系统日期与时光。字符串前后必须抬高双引号。

4.3.1 判断目录、文件是还是不是存在

[ -d /data ]

[ -f /data ]          

瞩目格式:[空格-f /data空格]   []内部两端必须有空格,中间写内容

[root@zeq /server/scripts]# [ -d /data ]

[root@zeq /server/scripts]# echo $?                 $?特殊变量,0代表执行正确,非0执行失败

0

[root@zeq /server/scripts]# [ -d /data123 ]

[root@zeq /server/scripts]# echo $?

1

1.4.7 变量中引号的利用

除非在变量的值中有空格的时候,会采纳引号。

单引号与双引号的分别在于,是还是不是可以分析特殊符号。

澳门金沙国际 29

[root@clsn ~]# name=znix
[root@clsn ~]# name2='clsn'
[root@clsn ~]# name3="http://blog.znix.top"
[root@clsn ~]# echo $name
znix
[root@clsn ~]# echo $name2
clsn
[root@clsn ~]# echo $name3
http://blog.znix.top
[root@clsn ~]# name4='cl sn'
[root@clsn ~]# echo $name4
cl sn
[root@clsn ~]# name5="cl sn"
[root@clsn ~]# echo $name5
cl sn
[root@clsn ~]# name6='cl sn $PWD'
[root@clsn ~]# echo $name6
cl sn $PWD
[root@clsn ~]# name6="cl sn $PWD"
[root@clsn ~]# echo $name6
cl sn /root

澳门金沙国际 30

1.4.9 定义变量名技巧

1. 变量名只可以为字母、数字或下划线,只好以字母或下划线初始。

2. 变量名的定义要有一定的正儿八经,并且要见名知意。

示例:

ClsnAge=22       #<==各个单词的首字母大写的写法

clsn_age=22      #<==单词之间用”_”的写法

clsnAgeSex=man 
 #<==驼峰语法:第四个单词的首字母小写,其他单词首字母大写

CLSNAGE=22       #<==单词全大写的写法

3. 貌似的变量定义、赋值常用双引号;不难再三再四的字符串可以不加引号;希望原样输出时利用单引号。

4. 希望变量的始末是命令的剖析结果时,要用反引号”,只怕用$()把命令括起来再赋值。

专注:如若有空格须求用双引号引起来:date +”%Y%m%d %H%M”  不用双引号date
+%Y%m%d-%H%M
CST:中国时区,新加坡时间
EST :北部标准时间
date +%Y-%m-%d, date +%y-%m-%d 年月日
大Y 四位年 小y两位年 小m月 大M分钟 小d天 小h月 大H小时 大S秒
小s时间戳(大Y 四位年 小m月 小d天 大H小时 大M分钟 大S秒 )
date +%H:%M:%S = date +%T 时间
date +%Y-%m-%d = date +%F 年月日
date +”%Y-%m-%d %H:%M:%S” 2016-01-20 10:36:47 双引号引起来
date +%w 星期几
date +%W 第几周
date +%s 时间戳
date -d @1434248742 反推时间戳,时间戳是1434248742
date -d “+1day” +”%Y-%m-%d”一天后
date -d “-1day” +”%Y-%m-%d”一天前
date -d “-1month” +”%Y-%m-%d”一月前
date -d “-1min” +”%Y-%m-%d %H:%M:%S”一分钟前
date -d “-1year” +”%Y-%m-%d” 一年前
date -d “-1weak” +”%Y-%m-%d” 一个礼拜前
两部分
先是部分-d “-1weak”
其次有的+”%Y-%m-%d”

4.3.2 比大小

-eq         equal         ==

-ne     not equal         !=

-gt     great than        >

-ge     great equal       >=

-lt     less  than        <

-le     less  equal       <=

1.4.8 普通变量的渴求

1)     内容是纯数字、不难的连天字符(内容中不带任何空格)时,定义时得以不加任何引号,例如:

a.ClsnAge=22

b.NETWORKING=yes

2)     没有例外处境时,字符串一律用双引号定义赋值,特别是多少个字符串中间有空格时,例如:

a.NFSD_MODULE=”no load”

b.MyName=”Oldboy is a handsome boy.”

3)     当变量里的情节要求原样输出时,要用单引号(M),这样的必要极少,例如:

a.OLDBOY_NAME=’OLDBOY’

变量使用反引号赋值

澳门金沙国际 31

[root@clsn scripts]# time=`date`
[root@clsn scripts]# echo $time
2017年 12月 05日 星期二 09:02:06 CST

[root@clsn scripts]# file=`ls`
[root@clsn scripts]# echo $file
clsn_test.sh panduan.sh quanju.sh yhk.sh

澳门金沙国际 32

使用${}

打印变量的时候幸免出现“Louis Cha新著”的标题

澳门金沙国际 33

[root@clsn scripts]# time=`date`
[root@clsn scripts]# echo $time_day

[root@clsn scripts]# echo ${time}_day
2017年 12月 05日 星期二 09:02:06 CST_day
[root@clsn scripts]# echo $time-day
2017年 12月 05日 星期二 09:02:06 CST-day

澳门金沙国际 34

编纂脚本测试${}

澳门金沙国际 35

 # 使用脚本测试
 [root@clsn scripts]# vim bianliang.sh 
 #!/bin/bash
 #############################################################
 # File Name: bianliang.sh
 # Version: V1.0
 # Author: clsn
 # Organization: http://blog.znix.top
 # Created Time : 2017-12-05 09:10:29
 # Description:
 #############################################################

 time=`date`
 echo $timeday
 echo ${time}day

 [root@clsn scripts]# sh  bianliang.sh 

 2017年 12月 05日 星期二 09:11:19 CSTday

澳门金沙国际 36

1.5 特殊变量

 

4.3.3 比大小举例

[root@zeq /server/scripts]# [ 10 -eq 10 ]

[root@zeq /server/scripts]# echo $?                

0

[root@zeq /server/scripts]# [ 10 -gt 10 ]

[root@zeq /server/scripts]# echo $?

1

[root@zeq /server/scripts]# [ 10 -ge 10 ]

[root@zeq /server/scripts]# echo $?

0

1.4.9 定义变量名技巧

1. 变量名只可以为字母、数字或下划线,只好以字母或下划线开首。

2. 变量名的概念要有一定的正规,并且要见名知意。

示例:

ClsnAge=22       #<==每一种单词的首字母大写的写法

clsn_age=22      #<==单词之间用”_”的写法

clsnAgeSex=man 
 #<==驼峰语法:第二个单词的首字母小写,其他单词首字母大写

CLSNAGE=22       #<==单词全大写的写法

3. 形似的变量定义、赋值常用双引号;简单接二连三的字符串可以不加引号;希望原样输出时采取单引号。

4. 希望变量的始末是命令的分析结果时,要用反引号”,只怕用$()把命令括起来再赋值。

重返顶部

1.5.1 地方变量

常用的超常规地方参数表达

位置变量

作用说明

$0

获取当前执行的shell脚本的文件名,如果执行脚本带路径那么就包括脚本路径。

$n

获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9用大括号括起来{10},参数以空格隔开。

$#

获取当前执行的shell脚本后面接的参数的总个数

$*

获取当前shell的所有传参的参数,不加引号同[email protected];如果给$*加上双引号,例如: “$*”,则表示将所有的参数视为单个字符串,相当于“$1$2$3”。

[email protected]

获取当前shell的所有传参的参数,不加引号同$*;如果给[email protected]加上双引号,例如: “[email protected]”,则表示将所有参数视为不同的独立字符串,相当于“$1” “$2” “$3” “……”,这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。

当“$*”和“[email protected]”都加双引号时,两者有区别,都不加双引号时,两者无区别。

*$0,$1.$2 ~ 参数实践***

[[email protected] scripts]# vim chanshu.sh
#!/bin/bash
############################################################# 
# File Name: chanshu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:39:16
# Description:
############################################################# 

echo $0
echo "第一个参数:" $1
echo "第二个参数:" $2
echo "第11个参数:" ${11}
[[email protected] scripts]# sh chanshu.sh
chanshu.sh
第一个参数:
第二个参数:
第11个参数:
[[email protected] scripts]# sh chanshu.sh 1 2 3 4 5 6 7 8 9 10 11 
chanshu.sh
第一个参数: 1
第二个参数: 2
第11个参数: 11

*$# 参数实践***

[[email protected] scripts]# vim chanshu.sh
#############################################################
# File Name: chanshu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:39:16
# Description:
#############################################################


echo $0
echo "第一个参数:" $1
echo "第二个参数:" $2
echo "第10个参数:" ${10}
echo "第11个参数:" ${11}
echo "参数个数:" $#



[[email protected] scripts]# sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112
chanshu.sh
第一个参数: 55
第二个参数: 2
第10个参数: 10
第11个参数: 11
参数个数: 12

$\ 参数实践***

[[email protected] scripts]# vim chanshu.sh
#############################################################
# File Name: chanshu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:39:16
# Description:
#############################################################

echo $0
echo "第一个参数:" $1
echo "第二个参数:" $2
echo "第10个参数:" ${10}
echo "第11个参数:" ${11}
echo "参数个数:" $#
echo "参数:" $*
"chanshu.sh" 18L, 456C 已写入                                  
[[email protected] scripts]# sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112
chanshu.sh
第一个参数: 55
第二个参数: 2
第10个参数: 10
第11个参数: 11
参数个数: 12
参数: 55 2 3 4 5 6 7 8 9 10 11 112

$\
[email protected]
相比实践*

[[email protected] scripts]# set -- "I am" handsome boy..
[[email protected] scripts]# echo $1
I am
[[email protected] scripts]# echo $2
handsome
[[email protected] scripts]# echo $3
boy..
[[email protected] scripts]# echo $*
I am handsome boy..
[[email protected] scripts]# echo [email protected]
I am handsome boy..

[[email protected] scripts]# for i in $*;do echo $i ;done
I
am
handsome
boy..
[[email protected] scripts]# for i in [email protected];do echo $i ;done
I
am
handsome
boy..
[[email protected] scripts]# for i in "[email protected]";do echo $i ;done
I am
handsome
boy..
[[email protected] scripts]# for i in "$*";do echo $i ;done
I am handsome boy..

 

4.3.4 if单分支格式脚本

格式: if [ 条件 ];then

        命令

fi

 

1、判断脚本的参数个数,假诺不是2则提示请输入三个数字

[root@zeq /server/scripts]# cat pan.sh

#!/bin/bash



if [ $# -ne 2 ];then

   echo "输入两个数字"

fi

2、 给计算器(参数传递)扩大一个原则

看清脚本的参数个数,

倘诺不是2则

指示请输入三个数字

[root@zeq /server/scripts]# cat cal.sh

#!/bin/bash



n1=$1

n2=$2



if [ $# -ne 2 ];then

   echo "USAGE: $0 num1 num2"                                  $0文件名

   exit                                                        exit  退出的意思

fi





awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1+num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1-num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1*num2 }'

awk -vnum1=$n1  -vnum2=$n2 'BEGIN{print num1/num2 }'

3、执行脚本

[root@zeq /server/scripts]# sh  cal.sh

USAGE: cal.sh num1 num2

[root@zeq /server/scripts]# sh  cal.sh 120 20

140

100

2400

6

1.5 特殊变量

1.5.2 进度状态变量

Shell进度的尤其状态变量表达

位置变量

作用说明

$?

获取执行上一个指令的执行状态返回值(0为成功,非零为失败),这个变量最常用

$$

获取当前执行的Shell脚本的进程号(PID),这个变量不常用,了解即可

$!

获取上一个在后台工作的进程的进程号(PID),这个变量不常用,了解即可

$_

获取在此之前执行的命令或脚本的最后一个参数,这个变量不常用,了解即可

进度参数实践

[[email protected] scripts]# echo $?
0
[[email protected] scripts]# echo $$
1368
[[email protected] scripts]# echo $!

[[email protected] scripts]# echo $_
echo
  1. shell脚本中的变量
    当脚本中拔取某个字符串较频仍并且字符串长度相当长时就应当利用变量代替
    选拔条件语句时,平日使用变量 if [ $a -gt 1 ]; then … ; fi
    引用某个命令的结果时,用变量替代 n=`wc -l 1.txt`或者 n=$(wc -l
    1.txt)
    写和用户交互的本申时,变量也是必备的 read -p “Input a number: ” n;
    echo $n 假诺没写那些n,可以一贯利用全局变量$REPLY
    停放变量 $0, $1, $2… $0代表脚本本身,$1 第三个参数,$2 第一个 ….
    $#:表示参数个数或最后一个参数
    $* 所有参数列表。如”$*”用「”」括起来的事态、以”$1 $2 …
    $n”的款式出口所有参数。
    $@
    :表示以空格分隔的持有输入参数恐怕有所函数参数所有参数列表。如”$@”用「”」括起来的气象、以”$1″
    “$2” … “$n” 的方式出口所有参数。
    $$:当前shell进程的pid
    $!:后台运行的终极一个经过的pid
    $- 使用Set命令设定的Flag一览

4.3.5 if双分支格式脚本

格式: if [ 条件 ];then

        命令

             else

          命令

fi

 

1、comp.sh输入三个数字:

 1.如果n1大于n2

 输出 n1 > n2

 2.如果n1不大于n2

 输出 n1 <= n2

[root@zeq /server/scripts]# cat  comp.sh

#!/bin/bash



n1=$1

n2=$2



if [ $n1 -gt $n2 ];then

   echo "$n1 > $n2"

else

   echo "$n1 <= $n2"

fi

2、执行脚本

[root@zeq /server/scripts]# sh comp.sh 10 20

10 <= 20

[root@zeq /server/scripts]# sh comp.sh 10 10

10 <= 10

[root@zeq /server/scripts]# sh comp.sh 100 10

100 > 10

1.5.1 地方变量

常用的异样位置参数表达

义务变量

效益表明

$0

取得当前施行的shell脚本的公文名,尽管推行脚本带路径那么就包涵剧本路径。

$n

收获当前履行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文书名,倘若n大于9用大括号括起来{10},参数以空格隔开。

$#

获取当前推行的shell脚本前边接的参数的总个数

$*

拿到当前shell的有所传参的参数,不加引号同$@;倘使给$*丰盛双引号,例如: “$*”,则意味着将富有的参数视为单个字符串,约等于“112$3”。

$@

收获当前shell的具备传参的参数,不加引号同$*;要是给$@加上双引号,例如: “$@”,则意味将享有参数视为不相同的独立字符串,也等于“$1” “$2” “$3” “……”,那是将参数传递给任何程序的极品情势,因为她会保留所有内嵌在各类参数里的任何空白。

当“$*”和“$@”都加双引号时,两者有分别,都不加双引号时,两者无分裂。

*0,0,1.$2 ~ 参数实践***

澳门金沙国际 37

[root@clsn scripts]# vim chanshu.sh
#!/bin/bash
############################################################# 
# File Name: chanshu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:39:16
# Description:
############################################################# 

echo $0
echo "第一个参数:" $1
echo "第二个参数:" $2
echo "第11个参数:" ${11}
[root@clsn scripts]# sh chanshu.sh
chanshu.sh
第一个参数:
第二个参数:
第11个参数:
[root@clsn scripts]# sh chanshu.sh 1 2 3 4 5 6 7 8 9 10 11 
chanshu.sh
第一个参数: 1
第二个参数: 2
第11个参数: 11

澳门金沙国际 38

*$# 参数实践***

澳门金沙国际 39

[root@clsn scripts]# vim chanshu.sh
#############################################################
# File Name: chanshu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:39:16
# Description:
#############################################################


echo $0
echo "第一个参数:" $1
echo "第二个参数:" $2
echo "第10个参数:" ${10}
echo "第11个参数:" ${11}
echo "参数个数:" $#



[root@clsn scripts]# sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112
chanshu.sh
第一个参数: 55
第二个参数: 2
第10个参数: 10
第11个参数: 11
参数个数: 12

澳门金沙国际 40

$\ 参数实践***

澳门金沙国际 41

[root@clsn scripts]# vim chanshu.sh
#############################################################
# File Name: chanshu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:39:16
# Description:
#############################################################

echo $0
echo "第一个参数:" $1
echo "第二个参数:" $2
echo "第10个参数:" ${10}
echo "第11个参数:" ${11}
echo "参数个数:" $#
echo "参数:" $*
"chanshu.sh" 18L, 456C 已写入                                  
[root@clsn scripts]# sh chanshu.sh 55 2 3 4 5 6 7 8 9 10 11 112
chanshu.sh
第一个参数: 55
第二个参数: 2
第10个参数: 10
第11个参数: 11
参数个数: 12
参数: 55 2 3 4 5 6 7 8 9 10 11 112

澳门金沙国际 42

$\ 与 $@ 相比实践*

澳门金沙国际 43

[root@clsn scripts]# set -- "I am" handsome boy..
[root@clsn scripts]# echo $1
I am
[root@clsn scripts]# echo $2
handsome
[root@clsn scripts]# echo $3
boy..
[root@clsn scripts]# echo $*
I am handsome boy..
[root@clsn scripts]# echo $@
I am handsome boy..

[root@clsn scripts]# for i in $*;do echo $i ;done
I
am
handsome
boy..
[root@clsn scripts]# for i in $@;do echo $i ;done
I
am
handsome
boy..
[root@clsn scripts]# for i in "$@";do echo $i ;done
I am
handsome
boy..
[root@clsn scripts]# for i in "$*";do echo $i ;done
I am handsome boy..

澳门金沙国际 44

1.5.3 echo参数表达

参数

参数说明

-n

不要追加换行

-e

启用下列反斜杠转义的解释

-E

显式地抑制对于反斜杠转义的解释

`echo’ 对下列反斜杠字符进行转义:

\n

换行

\r

回车

\t

横向制表符

\b

退格

\v

纵向制表符

\c

抑制更多的输出

数学运算a=1;b=2; c=$(($a+$b))恐怕$[$a+$b]
变量的效能域和属性 :readonly 、local

1.5.2 进程状态变量

Shell进程的奇异状态变量表达

位置变量

作用说明

$?

获取执行上一个指令的执行状态返回值(0为成功,非零为失败),这个变量最常用

$$

获取当前执行的Shell脚本的进程号(PID),这个变量不常用,了解即可

$!

获取上一个在后台工作的进程的进程号(PID),这个变量不常用,了解即可

$_

获取在此之前执行的命令或脚本的最后一个参数,这个变量不常用,了解即可

经过参数实践

澳门金沙国际 45

[root@clsn scripts]# echo $?
0
[root@clsn scripts]# echo $$
1368
[root@clsn scripts]# echo $!

[root@clsn scripts]# echo $_
echo

澳门金沙国际 46

1.6 定义变量的法子

 

1.5.3 echo参数表明

参数

参数表达

-n

并非增加换行

-e

启用下列反斜杠转义的说明

-E

显式地幸免对于反斜杠转义的解释

`echo’ 对下列反斜杠字符进行转义:

\n

换行

\r

回车

\t

横向制表符

\b

退格

\v

纵向制表符

\c

遏制越多的输出

回来顶部

1.6.1 三种概念变量的艺术

  1、间接赋值

  2、传参 (传递参数)

  3、交互式设置变量,使用read命令

 

1.6 定义变量的法门

1.6.2 read命令表明

在命令行中使用

[[email protected] scripts]# read
132
[[email protected] scripts]# echo $REPLY 
132
[[email protected] scripts]# read clsn 
456
[[email protected] scripts]# echo $clsn
456
[[email protected] scripts]# echo $REPLY 
132

在剧本中利用

[[email protected] scripts]# vim clsn_test.sh 
#!/bin/bash
read -p '请输入:'  clsn

echo $clsn

实践结果

[[email protected] scripts]# sh clsn_test.sh 
请输入:clsn_znix
clsn_znix

read命令的支援表达

[[email protected] scripts]# read --help
-bash: read: --: 无效选项
read: 用法:read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [-s不显示终端的任何输入] [名称 ...]

 

1.6.1 三种概念变量的主意

  1、直接赋值

  2、传参 (传递参数)

  3、交互式设置变量,使用read命令

1.6.3 定义方法实践

一直赋值方法

[[email protected] scripts]# vim bianliang.sh
# File Name: bianliang.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:10:29
# Description:
##############################################################
name=CLSN
age=22
sex=Man
hobby=`ls`
ethFile=/etc/sysconfig/network-scripts/ifcfg-eth0

echo $hobby
ls $ethFile
[[email protected] scripts]# sh  bianliang.sh
bianliang.sh chanshu.sh clsn.sh clsn_test.sh panduan.sh quanju.sh xiugaizhuji.sh yhk.sh
/etc/sysconfig/network-scripts/ifcfg-eth0

*传参 (传送参数)***

[[email protected] scripts]# vim bianliang.sh
##############################################################
# File Name: bianliang.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:10:29
# Description:
##############################################################
name=CLSN
age=22
sex=Man
hobby=$1
ethFile=$2

echo $hobby
ls $ethFile
[[email protected] scripts]# sh  bianliang.sh  clsn /etc/hostname 
clsn
/etc/hostname

交互式设置变量 read

[[email protected] scripts]# vim yhk.sh 
#!/bin/bash
##############################################################
# File Name: yhk.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-04 17:01:44
# Description:
##############################################################
read -p  "请输入你的银行卡号:"  Yhk
read -s -p  "请输入密码:" miMa
echo
echo "你的银行卡号:"  $Yhk
echo "你的密码为:" $miMa
# 测试结果
[[email protected] scripts]# sh  yhk.sh 
请输入你的银行卡号:123456
请输入密码:
你的银行卡号: 123456
你的密码为: 123456
  1. shell中的逻辑判断
    格式1:if 条件 ; then 语句; fi
    格式2:if 条件; then 语句; else 语句; fi
    格式3:if …; then … ;elif …; then …; else …; fi
    格式4:if 命令;then 语句;fi
    逻辑判断表明式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10
    ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=)
    注意各市都是空格 方括号两边也有空格 if [ 1 == 1 ] then xx fi
    可以运用 && || 结合七个原则 -a也代表&&,-o也意味着||
    冒号代表真 if : then xx fi

1.6.2 read命令表明

在命令行中使用

澳门金沙国际 47

[root@clsn scripts]# read
132
[root@clsn scripts]# echo $REPLY 
132
[root@clsn scripts]# read clsn 
456
[root@clsn scripts]# echo $clsn
456
[root@clsn scripts]# echo $REPLY 
132

澳门金沙国际 48

在本子中选择

[root@clsn scripts]# vim clsn_test.sh 
#!/bin/bash
read -p '请输入:'  clsn

echo $clsn

实施结果

[root@clsn scripts]# sh clsn_test.sh 
请输入:clsn_znix
clsn_znix

read命令的帮扶表明

[root@clsn scripts]# read --help
-bash: read: --: 无效选项
read: 用法:read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [-s不显示终端的任何输入] [名称 ...]

1.6.4 写一个交互脚本,达成可以定义主机名及IP地址

剧本内容

[[email protected] scripts]# cat xiugaizhuji.sh 
#!/bin/bash
#############################################################
# File Name: jiaohu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 10:55:42
# Description:
#############################################################

ethFile=/etc/sysconfig/network-scripts/ifcfg-eth[01]
Now_eth=`hostname -I|awk -F "[. ]+" '{print $4}'`

read -p "请输入主机名:" Hostname
read -p "请输入IP地址的主机位:" HostIP

hostnamectl set-hostname  $Hostname

sed  -i "s#${Now_eth}#${HostIP}#g" $ethFile 

read -p "是否重启服务器:{yes/no}"  REboot

if [ $REboot == yes ]
then 
   echo "系统将在10秒后重启!"
   shutdown -r  10 
else
   echo "请稍后手动重启系统!"
fi

本子测试结果

[[email protected] scripts]# sh xiugaizhuji.sh
请输入主机名:clsn
请输入IP地址的主机位:180
是否重启服务器:{yes/no}yes
系统将在10秒后重启!
[[email protected] scripts]# sh xiugaizhuji.sh
请输入主机名:clsn
请输入IP地址的主机位:180
是否重启服务器:{yes/no}no
请稍后手动重启!

用八个括号可以防止使用lt,gt
if (($a<3)); then echo ok;else echo nook;fi
if (($a>3)); then echo ok;else echo nook;fi

1.6.3 定义方法实践

直接赋值方法

澳门金沙国际 49

[root@clsn scripts]# vim bianliang.sh
# File Name: bianliang.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:10:29
# Description:
##############################################################
name=CLSN
age=22
sex=Man
hobby=`ls`
ethFile=/etc/sysconfig/network-scripts/ifcfg-eth0

echo $hobby
ls $ethFile
[root@clsn scripts]# sh  bianliang.sh
bianliang.sh chanshu.sh clsn.sh clsn_test.sh panduan.sh quanju.sh xiugaizhuji.sh yhk.sh
/etc/sysconfig/network-scripts/ifcfg-eth0

澳门金沙国际 50

*传参 (传送参数)***

澳门金沙国际 51

[root@clsn scripts]# vim bianliang.sh
##############################################################
# File Name: bianliang.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 09:10:29
# Description:
##############################################################
name=CLSN
age=22
sex=Man
hobby=$1
ethFile=$2

echo $hobby
ls $ethFile
[root@clsn scripts]# sh  bianliang.sh  clsn /etc/hostname 
clsn
/etc/hostname

澳门金沙国际 52

交互式设置变量 read

澳门金沙国际 53

[root@clsn scripts]# vim yhk.sh 
#!/bin/bash
##############################################################
# File Name: yhk.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-04 17:01:44
# Description:
##############################################################
read -p  "请输入你的银行卡号:"  Yhk
read -s -p  "请输入密码:" miMa
echo
echo "你的银行卡号:"  $Yhk
echo "你的密码为:" $miMa
# 测试结果
[root@clsn scripts]# sh  yhk.sh 
请输入你的银行卡号:123456
请输入密码:
你的银行卡号: 123456
你的密码为: 123456

澳门金沙国际 54

1.7 变量的子串

 

1.6.4 写一个并行脚本,完毕能够定义主机名及IP地址

本子内容

澳门金沙国际 55

[root@clsn scripts]# cat xiugaizhuji.sh 
#!/bin/bash
#############################################################
# File Name: jiaohu.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 10:55:42
# Description:
#############################################################

ethFile=/etc/sysconfig/network-scripts/ifcfg-eth[01]
Now_eth=`hostname -I|awk -F "[. ]+" '{print $4}'`

read -p "请输入主机名:" Hostname
read -p "请输入IP地址的主机位:" HostIP

hostnamectl set-hostname  $Hostname

sed  -i "s#${Now_eth}#${HostIP}#g" $ethFile 

read -p "是否重启服务器:{yes/no}"  REboot

if [ $REboot == yes ]
then 
   echo "系统将在10秒后重启!"
   shutdown -r  10 
else
   echo "请稍后手动重启系统!"
fi

澳门金沙国际 56

剧本测试结果

澳门金沙国际 57

[root@clsn scripts]# sh xiugaizhuji.sh
请输入主机名:clsn
请输入IP地址的主机位:180
是否重启服务器:{yes/no}yes
系统将在10秒后重启!
[root@clsn scripts]# sh xiugaizhuji.sh
请输入主机名:clsn
请输入IP地址的主机位:180
是否重启服务器:{yes/no}no
请稍后手动重启!

澳门金沙国际 58

回到顶部

1.7.1 变量子串表达

表达式

说明

${parameter}

返回变量$parameter的内容

${#parameter}

返回变内容的长度(按字符),也适用于特殊变量

${parameterioffset}

在变量${parameter}中,从位置offset之后开始提取子串到结尾

${parameter:offset:length}

在变量${parameter}中,从位置offset之后开始提取长度为length的子串

${parameter#word}

从变量${parameter}开头开始删除最短匹配的word子串

${parameter##word}

从变量${parameter}开头开始删除最长匹配的word子串

${parameter%word}

从变量${parameter}结尾开始删除最短匹配的word子串

${parameter%%word}

从变量${parameter}结尾开始删除最长匹配的word子串

${parameter/pattem/string}

使用string代替第一个匹配的pattern

${parameter//pattem/string}

使用string代替所有匹配的pattern

算算变赋值的尺寸

[[email protected] scripts]# clsn=http://blog.znix.top
[[email protected] scripts]# echo ${clsn} |wc -L 
20
[[email protected] scripts]# echo ${#clsn} 
20
[[email protected] scripts]# time echo ${clsn} |wc -L 
20

real    0m0.002s
user    0m0.002s
sys    0m0.000s
[[email protected] scripts]# time echo ${#clsn} 
20

real    0m0.000s
user    0m0.000s
sys    0m0.000s

截取变量中的字符

[[email protected] scripts]# clsn=abcABC123ABCabc
[[email protected] scripts]# echo ${clsn#abc}
ABC123ABCabc
[[email protected] scripts]# echo ${clsn##abc}
ABC123ABCabc
[[email protected] scripts]# echo ${clsn%abc}
abcABC123ABC
[[email protected] scripts]# echo ${clsn%%abc}
abcABC123ABC
[[email protected] scripts]# echo ${clsn#a*c}
ABC123ABCabc
[[email protected] scripts]# echo ${clsn##a*c}

[[email protected] scripts]# echo ${clsn%a*c}
abcABC123ABC
[[email protected] scripts]# echo ${clsn%%a*c}

[[email protected] scripts]# echo ${clsn#a*C}
123ABCabc
[[email protected] scripts]# echo ${clsn#a*C}
123ABCabc
[[email protected] scripts]# echo ${clsn##a*C}
abc
[[email protected] scripts]# echo ${clsn%a*c}
abcABC123ABC
[[email protected] scripts]# echo ${clsn%A*c}
abcABC123
[[email protected] scripts]# echo ${clsn%%A*c}
abc

轮换变量内容

[[email protected] scripts]# echo $clsn
abcABC123ABCabc
[[email protected] scripts]# echo ${clsn/abc/clsn}
clsnABC123ABCabc
[[email protected] scripts]# echo ${clsn//abc/clsn}
clsnABC123ABCclsn

至于上述匹配删除的计算

#意味着从幵头删除匹配最短。

##代表从先导删除匹配最长。

%表示从最终删除匹配最短。

%%代表从最后删除匹配最长。

a*c表示出色的突符串,*代表分外所有,a*c匹配开端为a、中间为私下五个字符、结尾为c的字符串。

a*C表示十分的字符串,*意味着非常所有,a*C匹配开始为a、中间为随机几个字符、结尾为C的字符串。

有关替换的下结论

一个“/”表示替换匹配的第-个字符串。

八个“/”表示替换匹配的具备字符串。

字符串比较用(==)和(!=) ,不能用-eq和 -ne
if [ “s” == “e” ]; then echo 1 ;fi
if [ “s” != “e” ]; then echo 1 ;fi

1.7 变量的子串

1.7.2 Shell的超常规扩大变量说明

表达式

说明

${parameter:-word}

如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值用途.如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常

${parameter:=word}

如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用用途:基本同上一个${parameter>word},但该变量又额外给parameter变量赋值了

${parameter:?word}

如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。用途:用于捕捉由于变量未定义而导致的错误,并退出程序

${parameter:+word}

如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值

奇异变量实践

剧本内容

[[email protected] scripts]# cat  clsn.sh 
#!/bin/bash
#############################################################
# File Name: clsn.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 12:13:38
# Description:
#############################################################
dir=
echo ${dir:-/tmp}
echo ${dir}
echo ${dir:=/mnt}
echo ${dir}
dir2= (空格)
echo ${dir2-/tmp}
echo ${dir2}
echo ${dir2:-/tmp}
echo ${dir2}
echo ${dir2=/mnt}
echo ${dir2}

测试结果

[[email protected] scripts]# sh clsn.sh 
/tmp

/mnt
/mnt


/tmp

从那之后shell中的变量就都介绍完了

 

1.7.1 变量子串表明

表达式

说明

${parameter}

返回变量$parameter的内容

${#parameter}

返回变内容的长度(按字符),也适用于特殊变量

${parameterioffset}

在变量${parameter}中,从位置offset之后开始提取子串到结尾

${parameter:offset:length}

在变量${parameter}中,从位置offset之后开始提取长度为length的子串

${parameter#word}

从变量${parameter}开头开始删除最短匹配的word子串

${parameter##word}

从变量${parameter}开头开始删除最长匹配的word子串

${parameter%word}

从变量${parameter}结尾开始删除最短匹配的word子串

${parameter%%word}

从变量${parameter}结尾开始删除最长匹配的word子串

${parameter/pattem/string}

使用string代替第一个匹配的pattern

${parameter//pattem/string}

使用string代替所有匹配的pattern

总结变赋值的长度

澳门金沙国际 59

[root@clsn scripts]# clsn=http://blog.znix.top
[root@clsn scripts]# echo ${clsn} |wc -L 
20
[root@clsn scripts]# echo ${#clsn} 
20
[root@clsn scripts]# time echo ${clsn} |wc -L 
20

real    0m0.002s
user    0m0.002s
sys    0m0.000s
[root@clsn scripts]# time echo ${#clsn} 
20

real    0m0.000s
user    0m0.000s
sys    0m0.000s

澳门金沙国际 60

截取变量中的字符

澳门金沙国际 61

[root@clsn scripts]# clsn=abcABC123ABCabc
[root@clsn scripts]# echo ${clsn#abc}
ABC123ABCabc
[root@clsn scripts]# echo ${clsn##abc}
ABC123ABCabc
[root@clsn scripts]# echo ${clsn%abc}
abcABC123ABC
[root@clsn scripts]# echo ${clsn%%abc}
abcABC123ABC
[root@clsn scripts]# echo ${clsn#a*c}
ABC123ABCabc
[root@clsn scripts]# echo ${clsn##a*c}

[root@clsn scripts]# echo ${clsn%a*c}
abcABC123ABC
[root@clsn scripts]# echo ${clsn%%a*c}

[root@clsn scripts]# echo ${clsn#a*C}
123ABCabc
[root@clsn scripts]# echo ${clsn#a*C}
123ABCabc
[root@clsn scripts]# echo ${clsn##a*C}
abc
[root@clsn scripts]# echo ${clsn%a*c}
abcABC123ABC
[root@clsn scripts]# echo ${clsn%A*c}
abcABC123
[root@clsn scripts]# echo ${clsn%%A*c}
abc

澳门金沙国际 62

轮换变量内容

[root@clsn scripts]# echo $clsn
abcABC123ABCabc
[root@clsn scripts]# echo ${clsn/abc/clsn}
clsnABC123ABCabc
[root@clsn scripts]# echo ${clsn//abc/clsn}
clsnABC123ABCclsn

至于上述匹配删除的下结论

#代表从幵头删除匹配最短。

##表示从初步删除匹配最长。

%表示从最后删除匹配最短。

%%代表从最后删除匹配最长。

a*c表示格外的突符串,*意味着很是所有,a*c匹配开始为a、中间为随机八个字符、结尾为c的字符串。

a*C表示优良的字符串,*代表出色所有,a*C匹配初阶为a、中间为私自多少个字符、结尾为C的字符串。

关于替换的统计

一个“/”表示替换匹配的第-个字符串。

七个“/”表示替换匹配的兼具字符串。

1.8 变量的数值总括

if:
格式:注意[]两边都有空格 逻辑操作符两边也要留空格
#!/bin/bash
if [ 1 == 2 ]
then
echo true;
elif [ 1 == 3 ] ;then
echo false;
else
echo error;
fi

1.7.2 Shell的特有增加变量表达

表达式

说明

${parameter:-word}

如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值用途.如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常

${parameter:=word}

如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用用途:基本同上一个${parameter>word},但该变量又额外给parameter变量赋值了

${parameter:?word}

如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。用途:用于捕捉由于变量未定义而导致的错误,并退出程序

${parameter:+word}

如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值

新鲜变量实践

本子内容

澳门金沙国际 63

[root@clsn scripts]# cat  clsn.sh 
#!/bin/bash
#############################################################
# File Name: clsn.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-05 12:13:38
# Description:
#############################################################
dir=
echo ${dir:-/tmp}
echo ${dir}
echo ${dir:=/mnt}
echo ${dir}
dir2= (空格)
echo ${dir2-/tmp}
echo ${dir2}
echo ${dir2:-/tmp}
echo ${dir2}
echo ${dir2=/mnt}
echo ${dir2}

澳门金沙国际 64

测试结果

澳门金沙国际 65

[root@clsn scripts]# sh clsn.sh 
/tmp

/mnt
/mnt


/tmp

澳门金沙国际 66

由来shell中的变量就都介绍完了

重返顶部

1.8.1 仅援助整数的运算

echo $((数学运算表达式))

# 形式一
[[email protected] scripts]# echo $((1 + 1))
2
[[email protected] scripts]# echo $((2*7-3/6+5))
19
# 形式二
[[email protected] scripts]# ((clsn=2*8))
[[email protected] scripts]# echo $clsn
16
# 形式三
[[email protected] scripts]# znix=$((2*7-3/6+5))
[[email protected] scripts]# echo $znix
19

拉开产物(主要)

i++ 自增1

i– 自减1

++i

–i

         示例:

[[email protected] scripts]# i=1
[[email protected] scripts]# echo $((i++))
1
[[email protected] scripts]# echo $((i++))
2
[[email protected] scripts]# echo $((i--))
3
[[email protected] scripts]# echo $((i--))
2
[[email protected] scripts]# echo $((i--))
1
[[email protected] scripts]# echo $((++i))
1
[[email protected] scripts]# echo $((++i))
2
[[email protected] scripts]# echo $((++i))
3
[[email protected] scripts]# echo $((--i))
2
[[email protected] scripts]# echo $((--i))
1
[[email protected] scripts]# echo $((--i))
0

记念方法:++,–

变量a在前,表达式的值为a,然后a自增或自减,变量a在符号后,表明式值自增或自减,然后a值自增或自减。

let命令

[[email protected] scripts]# i=1
[[email protected] scripts]# i=i+1
[[email protected] scripts]# echo $i
i+1

[[email protected] scripts]# i=1
[[email protected] scripts]# let i=i+1
[[email protected] scripts]# echo $i
2

expr 命令

1.整数乘除

2.判定扩张名

3.判断输入是不是为整数,非整数重返值为2

4.乘除变量的尺寸

[[email protected] scripts]# expr 1+1
1+1
[[email protected] scripts]# expr 1 + 1
2
[[email protected] scripts]# expr 1 * 1
expr: 语法错误
[[email protected] scripts]# expr 1 \* 1
1

非整数再次回到值为2 示例:

[[email protected] scripts]# expr 1 + 1 
2
[[email protected] scripts]# echo $?
0
[[email protected] scripts]# expr -1 + 1 
0
[[email protected] scripts]# echo $?
1
[[email protected] scripts]# expr a + 1 
expr: 非整数参数
[[email protected]clsn scripts]# echo $?
2

$[]运算符

[[email protected] scripts]# echo $[1+2]
3
[[email protected] scripts]# echo $[1-2]
-1
[[email protected] scripts]# echo $[1*2]
2
[[email protected] scripts]# echo $[1/2]
0

typeset命令进行演算

[[email protected] scripts]# typeset -i A=2017 B=2018
[[email protected] scripts]# A=A+B
[[email protected] scripts]# echo $A
4035

> gt
< lt
>= ge
<= le
== eq
!= ne

1.8 变量的数值计算

1.8.2 可以开展小数运算的授命

bc    命令

# 安装 bc  依赖于base源
[[email protected] scripts]# yum -y install bc

  交互形式测试bc命令

[[email protected] scripts]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 
1+1
2
[[email protected] scripts]# echo 1+1.1|bc
2.1

免交互情势测试bc命令

[[email protected] scripts]# echo 'scale=6;1/3'|bc
.333333

python 命令

[[email protected] scripts]#  file `which yum `
/usr/bin/yum: Python script, ASCII text executable
[[email protected] scripts]# python 
>>> import os
>>> os.system('df -h')
>>> 1+1.1
2.1
>>>exit()

awk 命令

[[email protected] ~]# echo "7.7 3.8"|awk '{print ($1-$2)}'
3.9
[[email protected] ~]# echo "358 113"|awk '{print ($1-3)/$2}'
3.14159
[[email protected] ~]# echo "3 9"|awk '{print ($1+3)*$2}'
54
[[email protected] scripts]# awk BEGIN'{print 1.2+3.3}'
4.5

 
if 命令 
认清的功底
1、有再次来到值 每一种命令都有重回值
2、有科学的再次回到值 0是真 非0是假 echo $?

1.8.1 仅帮衬整数的运算

echo $((数学运算表明式))

澳门金沙国际 67

# 形式一
[root@clsn scripts]# echo $((1 + 1))
2
[root@clsn scripts]# echo $((2*7-3/6+5))
19
# 形式二
[root@clsn scripts]# ((clsn=2*8))
[root@clsn scripts]# echo $clsn
16
# 形式三
[root@clsn scripts]# znix=$((2*7-3/6+5))
[root@clsn scripts]# echo $znix
19

澳门金沙国际 68

延长产物(紧要)

i++ 自增1

i– 自减1

++i

–i

         示例:

澳门金沙国际 69

[root@clsn scripts]# i=1
[root@clsn scripts]# echo $((i++))
1
[root@clsn scripts]# echo $((i++))
2
[root@clsn scripts]# echo $((i--))
3
[root@clsn scripts]# echo $((i--))
2
[root@clsn scripts]# echo $((i--))
1
[root@clsn scripts]# echo $((++i))
1
[root@clsn scripts]# echo $((++i))
2
[root@clsn scripts]# echo $((++i))
3
[root@clsn scripts]# echo $((--i))
2
[root@clsn scripts]# echo $((--i))
1
[root@clsn scripts]# echo $((--i))
0

澳门金沙国际 70

纪念方法:++,–

变量a在前,表明式的值为a,然后a自增或自减,变量a在符号后,表明式值自增或自减,然后a值自增或自减。

let命令

澳门金沙国际 71

[root@clsn scripts]# i=1
[root@clsn scripts]# i=i+1
[root@clsn scripts]# echo $i
i+1

[root@clsn scripts]# i=1
[root@clsn scripts]# let i=i+1
[root@clsn scripts]# echo $i
2

澳门金沙国际 72

expr 命令

1.平头划算

2.判断扩充名

3.判定输入是还是不是为整数,非整数重回值为2

4.划算变量的尺寸

澳门金沙国际 73

[root@clsn scripts]# expr 1+1
1+1
[root@clsn scripts]# expr 1 + 1
2
[root@clsn scripts]# expr 1 * 1
expr: 语法错误
[root@clsn scripts]# expr 1 \* 1
1

澳门金沙国际 74

非整数重返值为2 演示:

澳门金沙国际 75

[root@clsn scripts]# expr 1 + 1 
2
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# expr -1 + 1 
0
[root@clsn scripts]# echo $?
1
[root@clsn scripts]# expr a + 1 
expr: 非整数参数
[root@clsn scripts]# echo $?
2

澳门金沙国际 76

$[]运算符

澳门金沙国际 77

[root@clsn scripts]# echo $[1+2]
3
[root@clsn scripts]# echo $[1-2]
-1
[root@clsn scripts]# echo $[1*2]
2
[root@clsn scripts]# echo $[1/2]
0

澳门金沙国际 78

typeset命令进行演算

[root@clsn scripts]# typeset -i A=2017 B=2018
[root@clsn scripts]# A=A+B
[root@clsn scripts]# echo $A
4035

1.8.3 运算相关磨炼题

留神,if 命令不可以加中括号  ,if [ 命令 ]是错的

1.8.2 可以进行小数运算的一声令下

bc    命令

# 安装 bc  依赖于base源
[root@clsn scripts]# yum -y install bc

  交互格局测试bc命令

澳门金沙国际 79

[root@clsn scripts]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. 
1+1
2
[root@clsn scripts]# echo 1+1.1|bc
2.1

澳门金沙国际 80

免交互格局测试bc命令

[root@clsn scripts]# echo 'scale=6;1/3'|bc
.333333

python 命令

澳门金沙国际 81

[root@clsn scripts]#  file `which yum `
/usr/bin/yum: Python script, ASCII text executable
[root@clsn scripts]# python 
>>> import os
>>> os.system('df -h')
>>> 1+1.1
2.1
>>>exit()

澳门金沙国际 82

awk 命令

澳门金沙国际 83

[root@clsn ~]# echo "7.7 3.8"|awk '{print ($1-$2)}'
3.9
[root@clsn ~]# echo "358 113"|awk '{print ($1-3)/$2}'
3.14159
[root@clsn ~]# echo "3 9"|awk '{print ($1+3)*$2}'
54
[root@backup scripts]# awk BEGIN'{print 1.2+3.3}'
4.5

澳门金沙国际 84

1.8.3.1 【磨练题】完成一个加减乘除等效率的总括器

落成脚本:

[[email protected] scripts]# cat jishuanqi.sh 
#!/bin/bash
#############################################################
# File Name: jishuanqi.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 08:57:13
# Description:
#############################################################

read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b


echo $a + $b =$(($a+$b))
echo $a - $b =$(($a-$b))
echo $a \* $b =$(($a*$b))
echo $a / $b =$(($a/$b))

*         本子执行进度:*

[[email protected] scripts]# sh jishuanqi.sh 
请输入第一个整数:12
请输入第二个整数:12
12 + 12 =24
12 - 12 =0
12 * 12 =144
12 / 12 =1

简洁方法

[ro[email protected] scripts]# vim jishuanqi2.sh 
#!/bin/bash
#############################################################
# File Name: jishuanqi2.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 15:02:41
# Description:
#############################################################
echo $(($1))

*         本子执行进度:*

[[email protected] scripts]# sh jishuanqi2.sh  1+1
2
[[email protected] scripts]# sh jishuanqi2.sh  1*9
9

例子

1.8.3 运算相关磨练题

1.8.3.2 【陶冶题】打印结果1+2+3+4+5+6+7+8+9+10=55

剧本内容

[[email protected] scripts]# vim yunshuan.sh
#!/bin/bash
#############################################################
# File Name: yunshuan.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 09:40:31
# Description:
#############################################################

Num=`seq -s + 1 10`
echo  $Num=$(($Num))

剧本执行结果

[[email protected] scripts]# sh  yunshuan.sh
1+2+3+4+5+6+7+8+9+10=55
if  ping -c 1 192.168.1.106 >/dev/null 2>&1 ; then echo 1; else echo 2; fi

if sed -i 's/i/gg/g' sed.txt
if /bin/true ;
grep -q 避免输出

1.8.3.1 【陶冶题】达成一个加减乘除等效能的总计器

一路顺风脚本:

澳门金沙国际 85

[root@clsn scripts]# cat jishuanqi.sh 
#!/bin/bash
#############################################################
# File Name: jishuanqi.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 08:57:13
# Description:
#############################################################

read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b


echo $a + $b =$(($a+$b))
echo $a - $b =$(($a-$b))
echo $a \* $b =$(($a*$b))
echo $a / $b =$(($a/$b))

澳门金沙国际 86

*         脚本实施进程:*

澳门金沙国际 87

[root@clsn scripts]# sh jishuanqi.sh 
请输入第一个整数:12
请输入第二个整数:12
12 + 12 =24
12 - 12 =0
12 * 12 =144
12 / 12 =1

澳门金沙国际 88

切中时弊方法

澳门金沙国际 89

[root@clsn scripts]# vim jishuanqi2.sh 
#!/bin/bash
#############################################################
# File Name: jishuanqi2.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 15:02:41
# Description:
#############################################################
echo $(($1))

澳门金沙国际 90

*         脚本实施进度:*

[root@clsn scripts]# sh jishuanqi2.sh  1+1
2
[root@clsn scripts]# sh jishuanqi2.sh  1*9
9

1.9 补充表达

shell脚本中批量声明的办法

<<'EOF'
文件内容
EOF
   或
   使用 exit可以注释其之后的所有内容(类似注释,实质为不执行后面的内容)

 

1.8.3.2 【练习题】打印结果1+2+3+4+5+6+7+8+9+10=55

剧本内容

澳门金沙国际 91

[root@clsn scripts]# vim yunshuan.sh
#!/bin/bash
#############################################################
# File Name: yunshuan.sh
# Version: V1.0
# Author: clsn
# Organization: http://blog.znix.top
# Created Time : 2017-12-06 09:40:31
# Description:
#############################################################

Num=`seq -s + 1 10`
echo  $Num=$(($Num))

澳门金沙国际 92

剧本执行结果

[root@clsn scripts]# sh  yunshuan.sh
1+2+3+4+5+6+7+8+9+10=55

回来顶部

1.9.1 参考文献

  本文出自“惨绿少年”,欢迎转发,转发请评释出处!

 

1.1 前言
1.1.1 为啥学 Shell Shell 脚本语言是兑现 Linux/UNIX
系统管理及自动化运维所必需的要紧工具,…

if [$a -lt 10] && [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -a $a -gt 1]; then echo ok;fi

1.9 补充表达

shell脚本中批量评释的办法

<<'EOF'
文件内容
EOF
   或
   使用 exit可以注释其之后的所有内容(类似注释,实质为不执行后面的内容)

回去顶部

if [$a -lt 10] || [$a -gt 1]; then echo ok;fi
或者
if [$a -lt 10 -o $a -gt 1]; then echo ok;fi

1.9.1 参考文献

  本文出自“惨绿少年”,欢迎转发,转发请评释出处!

exit重返码 exit 1 ,那么echo $? 就会浮现1

 

  1. if 判断文件、目录属性
    [ -f file ]判断是或不是是普通文书,且存在 [ ! -f file ]
    [ -d file ] 判断是不是是目录,且存在 [ ! -d file ]
    [ -e file ] 判断文件或目录是还是不是存在 [ ! -e file ]
    [ -r file ] 判断文件是不是可读 [ ! -r file ]
    [ -w file ] 判断文件是还是不是可写 [ ! -w file ]
    [ -x file ] 判断文件是还是不是可实施 [ ! -x file ]
    [ -z $a ] 判断变量是还是不是为空 [ ! -z  ]

if 简化写法
[ -f 2.sh ] && echo “2.sh exits”

[ ! -f 2.sh ] || echo “2.sh exits”

 

 

示例1

read -p  xx  n  ,n只是一个变量名,你可以用x,y,z
#!/bin/bash
read -p “input a number” n
n2=`echo $n|grep -E ‘[^0-9]’|wc -l`

if [ $n2 == 1 ]
then
echo ” not a nubmer”
exit 1
fi

n1=$[$n%2]

if [ $n1 == 0 ]
then
echo “even”
else
echo “odd”
fi

示例2
#据悉指令的回到值 echo $? echo $n|grep -q ‘[^0-9]’ 0是真 非0是假 
(if netstat -lnp |grep -Eq ‘:80’   精确匹配 有重回值是0
无再次回到值是假)
#!/bin/bash
read -p “input a number” n
#n2=`echo $n|grep -E ‘[^0-9]’|wc -l`
if echo $n|grep -q ‘[^0-9]’
then
echo ” not a nubmer”
exit 1
fi

n1=$[$n%2]

if [ $n1 == 0 ]
then
echo “even”
else
echo “odd”
fi

示例2
#依据指令的回到值 echo $? echo $n|grep -q ‘[^0-9]’ 0是真 非0是假
#!/bin/bash
read -p “input a number” n
#n2=`echo $n|grep -E ‘[^0-9]’|wc -l`
if echo $n|grep -q ‘[^0-9]’
then
echo ” not a nubmer”
exit 1
fi

n1=$[$n%2]

if [ $n1 == 0 ]
then
echo “even”
else
echo “odd”
fi

示例3
[root@steven ~]# if ls /tmp/sdfsdf >/dev/null 2>&1 ;then echo
ok;else echo notok; fi
notok
[root@steven ~]# if [ $? == 0 ] ;then echo ok;else echo notok; fi
ok

示例4
exec表示前面的授命的输出都重定向到/tmp/$d.log
#!/bin/bash
d=`date +%F`
exec >/tmp/$d.log 2>&1
echo “begin at `date`”
ls /tmp/sdfsdfcd
cd /sdfsdf
echo “end at `date`”

 


推而广之阅读

 

附 表:
[ -a FILE ]  借使 FILE 存在则为真。  
[ -b FILE ]  若是 FILE 存在且是一个块卓越文件则为真。  
[ -c FILE ]  如果 FILE 存在且是一个字尤其文件则为真。  
[ -d FILE ]  假若 FILE 存在且是一个目录则为真。  
[ -e FILE ]  借使 FILE 存在则为真。  
[ -f FILE ]  假若 FILE 存在且是一个常见文书则为真。  
[ -g FILE ] 假使 FILE 存在且早已设置了SGID则为真。 [ -h FILE ]  倘使FILE 存在且是一个符号连接则为真。  
[ -k FILE ]  若是 FILE 存在且早已设置了粘制位则为真。  
[ -p FILE ]  假若 FILE 存在且是一个名字管道(F借使O)则为真。  
[ -r FILE ]  若是 FILE 存在且是可读的则为真。  
[ -s FILE ]  如若 FILE 存在且大小不为0则为真。  
[ -t FD ]  假使文件讲述符 FD 打开且指向一个极端则为真。  
[ -u FILE ]  即便 FILE 存在且设置了SUID (set user ID)则为真。  
[ -w FILE ]  如果 FILE 假如 FILE 存在且是可写的则为真。  
[ -x FILE ]  假设 FILE 存在且是可举行的则为真。  
[ -O FILE ]  如若 FILE 存在且属有成效户ID则为真。  
[ -G FILE ]  要是 FILE 存在且属有作用户组则为真。  
[ -L FILE ]  即使 FILE 存在且是一个标志连接则为真。  
[ -N FILE ]  如果 FILE 存在 and has been mod如果ied since it was last
read则为真。  
[ -S FILE ]  如若 FILE 存在且是一个套接字则为真。  
[ FILE1 -nt FILE2 ]  如果 FILE1 has been changed more recently than
FILE2, or 如果 FILE1 exists and FILE2 does not则为真。  
[ FILE1 -ot FILE2 ]  如果 FILE1 比 FILE2 要老, 恐怕 FILE2 存在且 FILE1
不存在则为真。  
[ FILE1 -ef FILE2 ]  如果 FILE1 和 FILE2
指向相同的配备和节点号则为真。  
[ -o OPTIONNAME ]  借使 shell选项 “OPTIONNAME” 开启则为真。  
[ -z STRING ]  “STRING” 的长短为零则为真。  
[ -n STRING ] or [ STRING ]  “STRING” 的尺寸为非零 non-zero则为真。
 
[ STRING1 == STRING2 ]  若是2个字符串相同。 “=” may be used instead of
“==” for strict POSIX compliance则为真。  
[ STRING1 != STRING2 ]  尽管字符串不等于则为真。
[ STRING1 < STRING2 ]  如果 “STRING1” sorts before “STRING2”
lexicographically in the current locale则为真。  
[ STRING1 > STRING2 ]  如果 “STRING1” sorts after “STRING2”
lexicographically in the current locale则为真。  
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge. These
arithmetic binary operators return true if “ARG1” is equal to, not equal
to, less than, less than or equal to, greater than, or greater than or
equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

 


 

sh -x 调试shell脚本

sh -x 11.sh 
+ '[' 1 -eq 1 ']'
+ eco 1
11.sh: line 4: eco: command not found

 

sh -n  检查shell脚本语法

sh -n 11.sh

 

sh -v  显示任何shell脚本并实施

sh -v 11.sh 
#!/bin/bash
if [ 1 -eq 1 ]
then 
eco 1
else
echo 2
fi
11.sh: line 4: eco: command not found

偶然使用-v选项会越来越直观望到shell脚本的语法错误

 

 

sh -c
启动一个子经过,执行字符串里的一声令下,字符串前面的参数作为字符串里发令的参数

sh -c 'ls /tmp'
或
sh -c 'ls ' /tmp

 

 


$( ) 和${ } 和$(( )) 与差在哪 

$( ) 引用结果

${ }变量累加

$(( )) 整数运算

 

a=sss
b=${a}123
echo $b
sss123
c=$(wc -l /etc/passwd|awk ‘{print $1}’)
echo $c
38
y=$((5+c))
echo $y
43

n=$(wc -l 1.txt)

 


shell数组简单用法

1.数组概念, 一对括号表示是数组,数组成分用“空格”符号分割开。

# a=(1 2 3 4 5)
# echo $a
1

  1. 数组读取
    # echo ${#a[@]} //获取数组的因素个数
    # echo ${a[2]}
    //读取数组中的某一个成分,数标从0开头,a[0]是率先个要素
    # echo ${a[*]} //那样会打印整个数组的要素,恐怕选拔 echo ${a[@]}

  2. 数组赋值
    # a[1]=100

# echo ${a[*]} 
1 100 3 4 5

# a[5]=100 
# echo ${a[*]}
1 100 3 4 5 100

直接通过 数组名[下标]
就足以对其展开引用赋值,如若下标不存在,自动添加新一个数组成分

  1. 数组的删除
    # a=(1 2 3 4 5)
    # unset a
    # echo ${a[*]}

# a=(1 2 3 4 5)
# unset a[1] 
# echo ${a[*]} 
1 3 4 5
# echo ${#a[*]}
4

  1. 数组分片
    # a=(`seq 1 5`)
    # echo ${a[@]:0:3}
    1 2 3
    # echo ${a[@]:1:4}
    2 3 4 5

  2. 数组替换,可以echo替换,也可以一向赋值
    # a=(1 2 3 4 5) 
    # echo ${a[@]/3/100}
    1 2 100 4 5
    # echo ${a[@]}
    1 2 3 4 5
    # a=(${a[@]/3/100}) 
    # echo ${a[@]} 
    1 2 100 4 5

 


 

SHELL变量名必须听从下边规律

1、第二个假名必须为字母a-zA-Z

2、中间不或然有空格,可以用下划线_

3、不能够应用标点符号

4、不可以用bash关键字(可用help命令查看是或不是保留首要字)


 

read命令

read命令
接受专业输入或其余文件讲述符的输入,得到输入后,read命令将数据放入一个正经变量中

运用read读取文件时,每一次调用read命令都会读取文件中的“一行”文本。当文件没有可读的行时,read命令以非零状态退出

示例

while read myline
do
echo "line: $myline"
done < /tmp/myfile.txt

cat /tmp/myfile.txt | while read myline
do
echo "line: $myline"
done

/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib,move $srcdir | while read file
do
for ip in $dstip
do
rsync -avH --port=873 --progress --delete --exclude-from=$excludedir $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir
echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1
done

read -p "input a number" n  或read  n  #监听终端的标准输入

自然也可以用for循环和sed -n “”p 读取文件的每行文本

  


shell变量

在shell中有3种变量:系统变量,环境变量和用户变量,其中系统变量在对参数判断和指令重临值判断时会使用,环境变量重假设在程序运行时需要
readonly

local

declare

此外,尽管在赋值后不希望改变变量,使其类似于常数,则足以行使readonly命令将其设为只读。
//先赋值,再设置只读
#a=good
#readonly a
//或然直接在赋值时设置只读
#readonly a=good
那儿若用unset命令重置变量a可能对a重新赋值,则会时有暴发错误。
#unset a
-bash: a: readonly variable
#a=Good
-bash: a: readonly variable

除此以外,shell的变量暗中认同是全局意义的,借使急需在一定范围内见效,则须要加上local限制。例如local
a将设置a为一些变量。
Tar_Cd()
{
    local FileName=$1
    local DirName=$2
}

数字和数组的扬言
暗中认同的赋值是对字符串赋值,例如执行如下脚本,就会意识这些剧本并没有利用5和6相加输出“11”,而是输出“5+6”。
#!/bin/bash
a=5
b=6
c=$a+$b
echo $c

假如要对数字或数组进行宣示,则要declare命令,例如上例改成如下形式,即可正常进行加减。

#!/bin/bash
declare -i a=5
declare -i b=6
declare -i c=$a+$b
echo $c

declare接济的评释类型如下。使用“- 类型”开启,“+ 类型”关闭。
(1)i:定义整数integer
(2)a:定义数组array
(3)f:定义函数function
(4)r:定义为只读readonly
(5)x:定义为经过环境输出变量

诸如对声明数组变量的办法如下。
#!/bin/bash
declare -a arr=(a b c )

 


linux下岁月戳转换 date

 

shell中收获时间戳的章程为:date -d “$current提姆e” +%s

$ date -d @1337743485671 “+%c”
Sun 28 May 44361 12:41:11 PM CST

只要要将一个日子转为时间戳,方式如下:

1、拿到当前时刻

currentTime=`date “+%Y-%m-%d %H:%M:%S”`

2、将日期转为时间戳

currentTimeStamp=`date -d “$currentTime” +%s `
echo $currentTimeStamp

3.字符串转换为时间戳可以如此做:

date -d “2010-10-18 00:00:00” +%s

输出形如:

1287331200

里头,-d参数表示展现指定的字符串所代表的年月,+%s表示输出时间戳。

4.而时间戳转换为字符串可以这么做:

date -d @1287331200

输出形如:

Mon Oct 18 00:00:00 CST 2010

 


Shell脚本8种字符串截取方法总括

那篇小说主要介绍了Shell脚本8种字符串截取方法总计,每一个方法给出了实例代码和操作结果,一目领悟,须求的对象可以参照下

 

echo ${var *  *  * }
#    匹配左侧第一   留右  从左边起
## 匹配右侧最终     留右  从左边起
%   匹配左边第一    留左  从左侧起
%% 匹配左边最终     留左  从左侧起

星号表示要刨除的字符
var#  * // 
删除左边字符,保留右侧字符。
var## * /
var%   /  *
var%%  /  *

Linux 的字符串截取很有用。有多种情势。
假诺有变量 var=

  1. # 号截取,删除左侧字符,保留左边字符。

    var=
    echo ${var#*//}

里面 var 是变量名,# 号是运算符,*// 代表从左边伊始删除首个 //
号及左侧的保有字符
即删除 http://
结果是 :www.aaa.com/123.htm

  1. ## 号截取,删除右侧字符,保留左边字符。

    var=
    echo ${var##*/}

##*/ 表示从左边开首删除最终(最右面)一个 / 号及左侧的具备字符
即删除
结果是 123.htm

  1. %号截取,删除右侧字符,保留左手字符

    var=
    echo ${var%/*}

%/* 表示从左侧开始,删除第三个 / 号及左边的字符
结果是:

  1. %% 号截取,删除右侧字符,保留左手字符

    var=
    echo ${var%%/*}

%%/* 表示从左侧开首,删除最终(最右侧)一个 / 号及左侧的字符
结果是:http:

  1. 封存/打印从左边第多少个字符开首,及字符的个数

    var=
    echo ${var:0:5}

其间的 0 表示左边第二个字符起头打印,5 代表字符的总个数。
结果是:http:

  1. 从右边第多少个字符初叶,一直到截至。

    var=
    echo ${var:7}

其中的 7 表示左边第8个字符伊始,一直到竣工。
结果是 :www.aaa.com/123.htm

  1. 从左侧第几个字符先导,及字符的个数

    var=
    echo ${var:0-7:3}

个中的 0-7 表示右侧算起第多个字符开端,3 表示字符的个数。
结果是:123

  1. 从左边第几个字符开端,平素到完工。

    var=
    echo ${var:0-7}

表示从右边第多少个字符先河,平昔到完工。
结果是:123.htm
注:(左侧的首先个字符是用 0 表示,右侧的率先个字符用 0-1 表示)

 


花括号批量创建文件或目录

mkdir -p man/mm{1..6} 1..6 中间肯定即使两点 !!!!!!
ll
total 24
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm1
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm2
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm3
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm4
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm5
drwxr-xr-x 2 root root 4096 Apr 11 08:41 mm6

 

 

f

相关文章