• Shell编程实战


    为什么要学习Shell编程

    Shell脚本语言是实现Linux/Unix系统管理及自动化运维所必须的重要工具,Linux系统的底层以及基础应用软件的核心大都涉及Shell脚本的内容。

    一个合格的Linux系统管理员都必须熟练编写Shell脚本语言,从而提升运维人员的工作效率,减少不必要的重复性工作。

    学习Shell所需的基础知识

    熟练使用VIm编辑器,熟悉SSH终端等配置

    在Linux下开发shell脚本用的最多的就是vim编辑器,熟练使用vim可以使得shell脚本开发事半功倍!

    有一定的Linux命令基础,熟练掌握80个命令以上

    shell和其他脚本语言不同,如python,Shell缺少可以直接使用的外部函数库,因此Linux系统的命令就可以当做Shell的函数库!

    熟悉常见Linux服务部署,优化,分析与排错

    学习Shell直接的目的是在工作中对系统以及服务进行自动化管理,因此如果不熟悉服务操作,使用shell也就没有意义了

    什么是Shell

    Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,处理操作系统的输出结果,然后反馈给用户。

    Shell是一个命令解释器,它的作用是解释并执行用户输入的命令和程序等,用户每输入一条命令,Shell解释器就执行一条,存在一种交互的方式。

    从开机准备输入用户名和密码,到登录成功,所有的操作都是Shell解释并执行的。

    什么是Shell脚本

    当命令或者程序语句不是在命令行中执行,而是通过一个程序文件来执行时,这个程序就称作Shell脚本。

    一个简单的Shell脚本

    清除/var/log下的messages日志文件

    把所有命令放入一个文件,堆积起来后就是一个脚本文件!注意文件的可执行权限,与用户身份

    #清除脚本日志
    cd /var/log
    cat /dev/null > messages
    echo "Logs cleaned up . done"

    Shell脚本语言的种类

    Shell脚本语言是弱类型语言(无须定义变量的类型即可使用)
    在Linux中有两大Shell,一是Bourne shell,二是C shell
    我们需要知道的就是标准的Bourne Again shell(bash)所取代
    查看CentOS 7系统的Shell

    其他的脚本语言

    php
    Perl
    Python

    语言选择

    Shell脚本语言优势在于处理系统底层的业务,基于linux命令处理也是最快的,常用语开发自动化安装,监控报警,软件启动等脚本。

    第一个Shell脚本与hello world

    脚本开头

    一个规范的脚本文件会在第一行指出由哪个程序来执行脚本的内容,必须位于第一行!!!如果你不加默认也会交给bash解释,良好的编程习惯,最好加上开头解释器语言标识
    #
    !/bin/bash
    #!/usr/bin/env python

    执行Shell脚本的方式

    bash 脚本名
    sh    脚本名
    此方法是脚本没有可执行权限时,或者文件头没指定解释器时用的方法

    path/scriptName
    ./scriptName
    此方法需要脚本有可执行权限,chmod +x scriptName

    source scriptName
    . scriptName
    加载并执行脚本文件中的命令和语句
    [root@oldboy_python /tmp 11:10:08]#sh test.sh
    chaoge nb
    [root@oldboy_python /tmp 11:10:18]#cat test.sh
    #!/bin/bash
    echo 'chaoge nb'
    [root@oldboy_python /tmp 11:10:21]#. test.sh
    chaoge nb
    [root@oldboy_python /tmp 11:10:33]#source  test.sh
    chaoge nb
    #添加可执行权限给test.sh
    chmod +x test.sh
    ./test.sh

     变量

    环境变量一般指的是export内置命令导出的变量,用于定义SHell的运行环境。
    Shell通过环境变量来确定命令提示符,也就是超哥前面说的PS1变量
    环境变量可以在命令行中设置和创建,但是用户退出命令行时变量值就会丢失,因此可以写入/etc/profile文件中,每次用户登录时,变量都会被初始化!
    环境变量名字均大写,用env查看

    设置登录的提示

    [root@oldboy_python ~ 11:21:51]#cat /etc/motd
    'welcome chaoge bakcome~~~~~~~~~'

    yudanL:~ yuchao$ ssh root@192.168.11.11
    Last failed login: Wed Aug 29 11:20:20 CST 2018 from 111.231.199.24 on ssh:notty
    There were 25 failed login attempts since the last successful login.
    Last login: Wed Aug 29 10:45:51 2018 from 223.72.74.11
    'welcome chaoge bakcome~~~~~~~~~`'

    定义变量

    变量定义的注意点

    • 变量名和等号之间不能有空格
    • 命名只能用英文字母,数字,下划线,首个字符不能用数字
    • 不能用标点符号
    • 不能用关键字
    name='chaoge'
    echo $name
    echo ${name} #帮助解释器识别变量的边界
    #变量重新赋值
    name='chaogenb'

    设置只读变量

    [root@oldboy_python ~ 11:29:31]#readonly name
    [root@oldboy_python ~ 11:30:27]#name='chaogenb3'
    -bash: name: 只读变量

    删除变量

    unset name

    变量类型

    • 局部变量 在脚本或命令中定义,仅在当前shell有效
    • 环境变量 所有的程序,shell程序都能访问环境变量
    • shell变量 特殊变量 既有环境变量 又有局部变量

    字符串

    字符串可以用单引号,也可以双引号,也可以没引号

    [root@oldboy_python ~ 11:42:42]#addr='shahe'
    [root@oldboy_python ~ 11:44:55]#echo $addr
    shahe

    单引号的任何字符串都会原样输出,单引号字符串中的变量无效

    单引号字符串不能出现单一的单引号,转义符也不可用,可用作字符串拼接

    双引号

    双引号里可以用变量

    双引号可以有转义符

    [root@oldboy_python ~ 11:45:01]#addr='changpingshahe'
    [root@oldboy_python ~ 11:48:06]#name='yuchao'
    [root@oldboy_python ~ 11:49:00]#message="Hello,${name},Your addr is "${addr}" "
    [root@oldboy_python ~ 11:50:05]#echo $message
    Hello,yuchao,Your addr is "changpingshahe"

     获取字符串长度

    [root@oldboy_python ~ 13:36:35]#str='abc'
    [root@oldboy_python ~ 13:36:49]#echo ${#str}
    3

    切片操作

    左闭又开规则

    [root@oldboy_python ~ 13:39:45]#str='I am chaoge,hello world!'
    #取出0和10索引的字符
    [root@oldboy_python ~ 13:40:42]#echo ${str:0:11}
    I am chaoge

    查找字符索引

    [root@oldboy_python ~ 13:45:02]#str='I am chaoge,hello world!'
    [root@oldboy_python ~ 13:46:20]#echo `expr index "$str" e`
    11
    
    
    
  • 相关阅读:
    jeecg团队招新人(5人)
    编程之美2.14 求数组的子数组之和的最大值
    使用VS连接SQLServe时提示未能载入文件或程序集“System.Data.OracleClient, Version=2.0.0.0, Culture=neutral, PublicKey
    Drupal 7.31 SQL注入漏洞利用具体解释及EXP
    linux下mysql开启慢查询
    答大二学生:坚持正确方向,改变学习方式
    JavaWeb-10(会话技术之session&JSP)
    Java内存区域分析
    Linux系统编程——进程间通信:命名管道(FIFO)
    学科、专业目录_各类名单_中国学位与研究生教育信息网
  • 原文地址:https://www.cnblogs.com/pyyu/p/9552661.html
Copyright © 2020-2023  润新知