快捷搜索:

您的位置:澳门新葡4473网站 > 新闻社区 > Shell编程基础篇-上

Shell编程基础篇-上

发布时间:2019-11-08 09:13编辑:新闻社区浏览(181)

    第1章 shell基础

    阅读目录

    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 shell对话情势

    互相的点子:从键盘输入命令,通过/bin/bash的解析,能够致时拿到Shell的回答,来者不拒的秘诀

    非交互作用式:shell脚本 

    回到最上端

    1.2 为啥使用shell编制程序

    用作多个通过海关的运维职员必得调控黄金年代种或黄金时代种以上的脚本语言,shell编制程序则是落实Linux/UNIX系统管理及自动化运转所必备的显要工具,能够把繁缛重复的通令写到shell脚本中奉行,节约时间,有效的拉长运行人士的工效,减弱不供给的重新工时。

    1.1 前言

    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脚本内容。独有这样技能进级运营职员的工效,适 应曰益复杂的劳作条件,降低不供给的双重职业,进而为私有的职场发展奠定较好的幼功

    第2章 变量

    1.1.2 什么是shell

    Shell是一个指令解释器,它在操作系统的最外层,担负间接与顾客对话,把顾客的输入解释给操作系统,并管理百废待举的操作系统的输出结果,输出荧屏重回给客户。

    这种对话情势能够是:

    彼此之间的措施:从键盘输入命令,通过/bin/bash的解析,能够立时赢得Shell的答疑

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

    非人机联作的方法: 脚本

    图片 1

    2.1 什么是变量

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

    叁个未确定的数,任何时候能够改动的量叫变量

    1.1.3 什么是Shell脚本

      命令、变量和流程序调控制语句等有机的咬合起来

             shell脚本擅长管理纯文本类型的多寡,而linux中,差不离具备的配备文件,日志,都以纯文本类型文件

    2.2 变量的归类

    1.1.4 脚本语言的品种

    意气风发、编写翻译型语言

    定义:指用专项使用的编写翻译器,针对一定的操作平台(操作系统卡塔尔国将某种高端语言源代码一遍性翻译成可被硬件平台直接运转的二进制机器码(具有操作数,指令、及相应的格式卡塔尔,这几个历程叫做编译(./configure  make makeinstall 卡塔 尔(阿拉伯语:قطر‎;编写翻译好的可推行性文件(.exe卡塔 尔(阿拉伯语:قطر‎,可在相呼应的阳台上运营(移植性差,但运转功能高卡塔尔。。

    突出的编译型语言有, C语言、C++等。

    除此以外,Java语言是一门很独特的语言,Java程序供给进行编写翻译步骤,但并不会转移特定平台的二进制机器码,它编写翻译后生成的是生龙活虎种与平台非亲非故的字节码文件(*.class卡塔 尔(英语:State of Qatar)(移植性好的来由卡塔尔,这种字节码自然无法被平台直接实施,运维时索要由解释器解释成对应平台的二进制机器码文件;大相当多人感到Java是风度翩翩种编写翻译型语言,但大家说Java便是编写翻译型语言,也是解释型语言也并不曾错。

    二、解释型语言

    定义:指用专门解释器对源程序逐行解释成特定平台的机器码并即刻实行的言语;也正是把编写翻译型语言的编写翻译链接进度混到一起同临时候产生的。

    解释型语言施行功用十分低,且无法脱离解释器运维,但它的跨平台型比较轻松,只需提供特定解释器就能够。

    大面积的解释型语言有, Python(同一时候是脚本语言卡塔 尔(阿拉伯语:قطر‎与Ruby等。

    三、脚本语言

    定义:为了缩小守旧的编写制定-编译-链接-运维(edit-compile-link-run卡塔尔进程而创立的微管理机编制程序语言。

    特点:程序代码正是最后的执行文书,只是这些进度必要解释器的参加,所以说脚本语言与解释型语言有相当的大的关系。脚本语言平日是被解释施行的,並且程序是文本文件。

    非凡的脚本语言有,JavaScript,Python,shell等。

    别的常用的脚本语句连串

    PHP是网页程序,也是脚本语言。是风流倜傥款更注意于web页面开垦(前端体现卡塔 尔(阿拉伯语:قطر‎的脚本语言,举例:德德cms,discuz。PHP程序也足以拍卖系统日志,配置文件等,php也能够调用系统命令。

    Perl脚本语言。比shell脚本强大超多,语法灵活、复杂,达成方式非常多,不易读,团队合作困难,但仍不失为很好的脚本语言,存世一大波的先后软件。MHA高可用Perl写的

    Python,不但能够做脚本程序支付,也得以完成web程序以至软件的成本。近三年更为多的商城都会必要会Python。

    Shell脚本与php/perl/python语言的不同和优势?

    shell脚本的优势在于处理操作系统底层的工作 (linux系统内部的使用都是shell脚本实现卡塔尔因为有大气的linux系统命令为它做支撑。二〇〇二两个指令都以shell脚本编制程序的强盛扶植,特别是grep、awk、sed等。比方:生龙活虎键软件安装、优化、监察和控制告急脚本,常规的政工应用,shell开拓更简便便捷,相符运营的简便、易用、高效原则.

      PHP、Python优势在于付出运转为工人身份具以至web分界面包车型大巴管理工科具,web业务的支付等。处理一键软件安装、优化,报告急察方脚本。常规职业的采纳等php/python也是能够一挥而就的。可是付出效能和复杂性比用shell就差超多了。

    系统境况表明

    图片 2

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

    图片 3

    2.2.1 普通变量(局地变量卡塔尔国

    只好在眼下条件下利用,能够通过export命令有时把通常变量变为情况变量使用

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

    1.1.5 系统中的shell

    翻开系统中的命解释器

    图片 4

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

    图片 5

    常用操作系统的默许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版本

    图片 6

    [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>
    
    这是自由软件,您可以自由地更改和重新发布。
    在法律允许的范围内没有担保. 
    

    图片 7

    bash 破壳漏洞

    图片 8

    使用 命令 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
    

    图片 9

    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
    

    回去顶端

    2.2.2 遇到变量(全局变量卡塔 尔(英语:State of Qatar)

    1.大写

    2.系统定义的

    3.在大好些个地点能够选拔

    1.2 脚本书写标准

    2.2.3 特殊变量

    $1   $2   $数字        $后数字是几象征shell脚本第多少个参数

    $#                           shell脚本中参数的个数

                                   判别脚本的参数个数

    $?                          上二个指令的实施结果(重返值卡塔 尔(阿拉伯语:قطر‎

                                  0             实行科学

                                  非0           实践倒闭

    $0                          脚本文件名

    1.2.1 脚本统大器晚成存放目录

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

    第3章 shell脚本的书写标准

    1.2.2 选拔解释器

    小心格式 ↓

    其间始发的"#!"字符又叫做幻数,在实施bash脚本的时候,内核会依据"#!"后的解释器来分明该用那二个程序解释那么些剧本中的内容。

    图片 10

    [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
    

    图片 11

    3.1.1 脚本寄放地点

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

    创造目录

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

    1.2.3 编辑脚本使用vim

    选取 .vimrc 文件,能够火速的变换开首的注释音讯

    图片 12

    [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
    

    图片 13

    利用后的作用

    图片 14

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

    图片 15

    在Shell脚本中,跟在#末端的剧情表示注释。注释部分不会被推行,仅给人看。注释能够自成生机勃勃行,也能够跟在指令后边,与命令同行。要养成写注释的习贯,方便温馨与客人。

    Infiniti不用中文注释,因为在不相同字符集的种类会冒出乱码。(字符集为zh_CN.UTF-8,为中文)。

    3.1.2 脚本编辑使用vim

    1.2.4 文件名专门的学业

             名字要有意义,并且最终以 .sh 甘休

    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、脚本中的引号都以罗马尼亚(România卡塔 尔(英语:State of Qatar)语状态下的引号,其余字符也是意国语状态。

    回来顶端

    3.1.4 文件名书写

    文件名称应当要有含义,方便探访是干嘛用的剧本,并且以.sh结尾

    1.3 shell脚本的执行

    3.1.5 书写脚本的正经八百和习贯

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

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

      批量剔除

      批量充实

      1.步入批量编辑格局(可视块卡塔 尔(英语:State of Qatar)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 中执行一个文件中的命令。
    

    第4章 shell练习

    挥洒壹个总结器脚本

    1.3.2 sh 于 source的区别

    图片 16

    图片 17

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

    图片 18

    面试题:

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

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

    回到顶端

    4.1 数字总计方法

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

    1.4 Shell的变量

    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脚本中应用。普通变量日常是由开辟者顾客支付脚本程序时成立的。

             杰出变量

    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 命令查看系统中的情状变量,那七个指令的的出口情势稍有不相同。

    图片 19

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

    图片 20

             输出贰个系统中的 情况变量

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

    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中运营另二个进度或退出,本地变量值将对事情未有什么帮助       

    概念普通变量实行

    图片 21

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

    图片 22

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

    小结:一而再三回九转普通字符串内容赋值给变量,不管用怎么着引号恐怕不用引号,它的从头到尾的经过是怎么着,打印变量就输出什么

    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
    

    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

    图片 23

    文本读取进程暗中提示图

    表明四文件读取顺序的艺术

    图片 24

    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
    

    图片 25

    4.3 条件表达式  if

    1.4.6 遭遇变量的学识小结

    ü 变量名经常要大写。

    ü 变量能够在本身的Shell及子Shell中接纳。

    ü 常用export来定义遭逢变量。

    ü 实行env默许能够体现全数的境遇变量名称及相应的值。

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

    ü 书写crond定期职务时要当心,脚本要用到的遇到变量最棒先在所实行的Shell脚本中另行定义。

    ü 假诺指望情况变量恒久生效,则能够将其位于客商情形变量文件或全局景况变量文件里。

    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 变量中引号的行使

    独有在变量的值中有空格的时候,会接纳引号。

    单引号与双引号的区分在于,是或不是能够解析特殊符号。

    图片 26

    [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
    

    图片 27

    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'

    变量使用反引号赋值

    图片 28

    [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
    

    图片 29

    使用${}

    打字与印刷变量的时候制止现身“金庸(Louis-Cha卡塔 尔(英语:State of Qatar)新著”的问题

    图片 30

    [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
    

    图片 31

    编纂脚本测验${}

    图片 32

     # 使用脚本测试
     [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
    

    图片 33

    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. 希望变量的内容是命令的深入分析结果时,要用反引号'',可能用$()把命令括起来再赋值。

    回来顶上部分

    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、 给总括器(参数字传送递卡塔 尔(英语:State of Qatar)扩大二个条件

    认清脚本的参数个数,

    设若不是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 特殊变量

    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 ~ 参数施行***

    图片 34

    [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
    

    图片 35

    *$# 参数施行***

    图片 36

    [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
    

    图片 37

    $ 参数施行***

    图片 38

    [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
    

    图片 39

    $ 与 $@ 相比推行*

    图片 40

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

    图片 41

    1.5.2 进度状态变量

    Shell进度的例外状态变量表达

    位置变量

    作用说明

    $?

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

    $$

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

    $!

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

    $_

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

    过程参数执行

    图片 42

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

    图片 43

    1.5.3 echo参数表明

    参数

    参数表明

    -n

    毫不扩大换行

    -e

    启用下列反斜杠转义的批注

    -E

    显式地禁绝对于反斜杠转义的分解

    `echo' 对下列反斜杠字符实行转义:

    n

    换行

    r

    回车

    t

    横向制表符

    b

    退格

    v

    纵向制表符

    c

    遏制越来越多的出口

    归来最上端

    1.6 定义变量的法门

    1.6.1 二种概念变量的措施

      1、直接赋值

      2、传参 (传递参数)

      3、人机联作式设置变量,使用read命令

    1.6.2 read命令表明

    在命令行中使用

    图片 44

    [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
    

    图片 45

    在剧本中利用

    [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.3 定义方法施行

    直接赋值方法

    图片 46

    [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
    

    图片 47

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

    图片 48

    [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
    

    图片 49

    人机联作式设置变量 read

    图片 50

    [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
    

    图片 51

    1.6.4 写多个互为脚本,完结能够定义主机名及IP地址

    剧本内容

    图片 52

    [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
    

    图片 53

    剧本测量试验结果

    图片 54

    [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
    请稍后手动重启!
    

    图片 55

    回到顶端

    1.7 变量的子串

    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

    计算变赋值的尺寸

    图片 56

    [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
    

    图片 57

    截取变量中的字符

    图片 58

    [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
    

    图片 59

    交替变量内容

    [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.7.2 Shell的诡异增添变量表达

    表达式

    说明

    ${parameter:-word}

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

    ${parameter:=word}

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

    ${parameter:?word}

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

    ${parameter:+word}

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

    奇怪变量实践

    本子内容

    图片 60

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

    图片 61

    测量试验结果

    图片 62

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

    图片 63

    时至明天shell中的变量就都介绍完了

    归来顶端

    1.8 变量的数值计算

    1.8.1 仅扶助整数的运算

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

    图片 64

    # 形式一
    [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
    

    图片 65

    延伸成品(首要)

    i++ 自增1

    i-- 自减1

    ++i

    --i

             示例:

    图片 66

    [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
    

    图片 67

    记得方法:++,--

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

    let命令

    图片 68

    [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
    

    图片 69

    expr 命令

    1.大背头构思

    2.论断扩充名

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

    4.酌量变量的长度

    图片 70

    [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
    

    图片 71

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

    图片 72

    [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
    

    图片 73

    $[]运算符

    图片 74

    [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
    

    图片 75

    typeset命令举行演算

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

    1.8.2 能够拓宽小数运算的通令

    bc    命令

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

      交互作用方式测验bc命令

    图片 76

    [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
    

    图片 77

    免人机联作方式测验bc命令

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

    python 命令

    图片 78

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

    图片 79

    awk 命令

    图片 80

    [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
    

    图片 81

    1.8.3 运算相关演练题

    1.8.3.1 【练习题】达成三个加减乘除等成效的总括器

    落成脚本:

    图片 82

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

    图片 83

    *         脚本施行进程:*

    图片 84

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

    图片 85

    简洁方法

    图片 86

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

    图片 87

    *         脚本实行进程:*

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

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

    本子内容

    图片 88

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

    图片 89

    本子实践结果

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

    归来最上部

    1.9 补充表明

    shell脚本中批量讲明的章程

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

    归来顶上部分

    1.9.1 参谋文献

      本文出自“惨绿少年”,应接转发,转发请声明出处!

    本文由澳门新葡4473网站发布于新闻社区,转载请注明出处:Shell编程基础篇-上

    关键词: