运维shell

作用

项目部署 项目监控

什么是shell

shell是一个程序,/bin/bash/,是一个命令解释器所有linux命令都由他来执行,打开终端就进入了 shell的交互式命令

运行方式

  • bash *.sh

  • 更改可执行权限后使用./*.sh来执行

  • shource *.sh

语法

  • 没有缩进要求,缩进是没有意义的

  • 注释使用#

  • 双引号""内嵌入变量是解释变量

  • 单引号''内写什么,就是什么,不会解释变量

  • shource不会开启新的进程来执行脚本,可以跟当前窗口共享进程,以及变量所以变量可以使用普通变量

  • 反引号&&$() 内嵌命令将命令执行之后的结果写进变量

  • 变量的使用

     # 设 变量名为 name 且有值 调取变量方式如下
     echo $name
     echo ${name)
     echo "$name"
     echo "${name}" #规范写法
  • 测试语句(判断)

    利用text[]来结合内置变量$?来进行判断语句

     #方法1
     text 2 = 2 # 条件前后必须加空格
     $?
     #方法2
     [ 1 = 2 ] # `[]`内前后追加空格
     $?

$?结果0为真 1为假

变量

  • 本地变量

    在当前系统的某个环境下生效的变量作用范围小

    • 普通变量

      只在当前命令窗口环境下才可以调用

     name=langwang  # 注意的是shell脚本是没有pep8的代码风格要求所以不需要加任何空格,加空格就会报错
     echo $name # $变量名 来使用本地变量,变量是没有类型的而且不能加入空格
     # 变量默认值  
     # a=1
     echo ${a-123} # 变量a如果有内容,那么就输出a的变量值
     # 变量a如果没有内容,那么就输出默认的内容,也就是123
     b=18
     echo ${b+22} #无论变量a是否有内容,都输出默认值,也就是22
  • 命令变量

 ml=`pwd` # 只是在当前环境下执行命令(给命令起了一个别名)
 ml=$(pwd) #与上写法想同
  • 全局变量

    当前shell以及其派生出来的子shell中都有效的变量。

    在当前以及子进程shell窗口都能加载全局变量

     env #查看全局变量
     name=xiao
     export name
     echo $name
     # 简写形式
     export age=112

    任何窗口下都可以使用的变量,全局变量永久有效

     sudo vim /etc/profile  #将变量写入这个文件即可实现在全局使用
     source /etc/profile
  • shell内置变量

    可以直接拿过来使用实现某种具体的功能

     $0  # 获取当前shell脚本文件名
     ${n}  # 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9就要用大括号括起来${10}
     $#  # 获取当前shell命令行中参数的总个数
     $?  # 获取执行上一个指令的返回值(0为成功,非0为失败)

字符串操作

  • 精确截取

 file='hello world'
 ${file:0:5} # 从第1个字符开始,截取5个字符
 ${file::5} # 从第1个字符开始,截取5个字符
 ${file:5:5} # 从第6个字符开始,截取5个字符
 ${file:5} # 从第6个字符开始,截取后面所有的字符
 ${file:0-5} # 从倒数第5个字符开始,截取后面所有的字符
 ${file:0-6:3} # 从倒数第6个字符开始,截取之后的3个字符

条件表达式

&& :且,命令1 && 命令2 命令1执行成功才会执行命令2 如果命令1 失败 则命令2不会执行

||: 或,命令1 || 命令2 如果命令1执行成功,那么命令2不执行 如果命令1执行失败,那么命令2执行

  • 文件运算符

-f 判断是否是一个文件

-d判断是否为一个文件夹(目录)

-e判断文件或者目录是否存在

-x判断是否可执行

-r判断文件可读权限

-w判断文件可写权限

  • 字符串比较运算符

-z string 如果 string长度为零,则为真

-nstring 如果string 长度不为零,则为真

string1= string2 如果 string1与 string2相同,则为真

string1 != string2 如果 string1与 string2不同,则为真

  • 算术比较运算符

-eq等于

-ne不等于

-lt小于

-le小于等于

-gt大于

-ge大于等于

  • 计算表达式

$(())双括号内放计算表达式,只能加减乘除的整数运算

let表达式必须是一个整体,中间不能出现空格等特殊字符

 age=10
 echo $((age-8))
 2
 i=2
 let i=age-i
 echo $i
 8

常见符号

  • 重定向符号

    • >覆盖右侧 文件内容

       ls > a.txt #将ls输出结果覆盖写入a.txt
    • >>追加到右侧文件内容

     ls -alh >> a.txt  # 将文件输出结果追加写入

    只把正确结果写入,如果想要把错误结果写入在>前加2,默认不写为1

     bash xxx.sh 1> ak.txt 2> err.txt
     bash xxx.sh 1> a.text > &1  #正确错误都写入a.text
  • 管道符

    • |

      命令1 | 命令2

      管道符左侧命令1 执行后的结果,传递给管道符右侧的命令2使用

  • 其他

    • 后台展示符号 &

      就是将一个命令从前台转到后台执行

      引用

       ping www.baidu.com &
       ping www.baidu.com > /edv/null 2>&1 & # 正确错误的结果都丢进垃圾桶
  • 常用命令

    • grep

      • grep [参数] <文件名> [-r]#文件目录要加-r

         grep -n aa xxx.txt # 查找txt文件中的aa 并显示行号
         -n #显示行号
         -i #忽略大小写
         -v #不包含文件的所有行
    • find

      • find [路径] [参数] [关键字]

         -name # 查找文件名
         -type # 查找文件类型 下面是支持的常见文件类型
         -b # 块设备文件
         -d # 目录
         -c # 字符设备文件
         -p # 管道文件
         -l # 符号链接文件
         -f # 普通文件

      sed命令

      • 行文件编辑工具

      sed [参数] 条件 [动作] [文件名]

      参数 参数为空 表示显示更改效果,不对文件进行编辑 -i 表示对文件进行编辑更改不会显示效果 条件 '/关键字/' 隔离符号可以为#``@``!根据具体情况进行使用 动作 a 匹配内容下一行增加内容 i 匹配内容上一行增加内容 d 删除匹配内容 s 替换匹配内容 *以上的动作 必须在-i参数下使用

      # 假设有文件123.txt其内容为
       # hello sed sed sed
       # hello sed sed sed
       sed "s#sed#SED#" 123.txt # 每一行匹配的第一个小写替换为大写,只是对修改进行展示,并不会对文件进行修改
       # 输出为
       # hello SED sed sed
       # hello SED sed sed
       sed "s#sed#SED#g" 123.txt # 匹配的小写全部替换为大写,只是对修改进行展示,并不会对文件进行修改
       # 输出为
       # hello SED SED SED
       # hello SED SED SED
       sed "1s#sed#SED#" 123.txt # 对第一行第一个匹配的小写sed替换为大写,只是对修改进行展示,并不会对文件进行修改
       # 输出为
       # hello SED sed sed
       # hello sed sed sed
         sed "2s#sed#SED#2" 123.txt # 对第二行第二个匹配的小写替换为大写,只是对修改进行展示,并不会对文件进行修改
       # 输出为
       # hello SED SED SED
       # hello SED SED SED
       sed "a#hello" 123.txt # 对所有行进行增加,对修改进行展示,并不会对文件进行修改
       # 输出为
       #hello sed sed sed
       #hello
       #hello sed sed sed
       #hello
       sed "2a#hello2" 123.txt # 对所有行进行增加,对修改进行展示,并不会对文件进行修改
       # 输出为
       #hello sed sed sed
       #hello2
       #hello
       #hello sed sed sed
       #hello

    不一一列举了

  • awk命令

    awk [参数] '[动作]' [文件名]

    参数

    -F 指定分隔符号,默认为空格

    -v 设置变量

    -f 指定运行的awk脚本

    动作

    print 显示内容

    $0 显示所有行列内容

    $n 显示当前行第n列内容

    常见内置变量

    FILENAME 当前输入文件的文件名,该变量是只读的

    NR 指定显示行的行号

    NF 输出最后一列的内容

    OFS 输出格式的列分隔符,缺省是空格

    FS 输入文件的列分融符,缺省是连续的空格和Tab

    基本用法

    一段文本:cat log.txt

     2 this is a test
     3 Are you like awk
     This's a test
     10 There are orange,apple,mongo
     awk ‘{[pattern] action}’ {filenames} 
     # 行匹配语句 awk ” 只能用单引号

    实例:

     # 每行按空格或TAB分割(默认情况),输出文本中的1、4项
     $ awk '{print $1,$4}' log.txt
     ---------------------------------------------
     2 a
     3 like
     This's
     10 orange,apple,mongo
     ---------------------------------------------
     # 正则格式化输出
     $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
     ---------------------------------------------
     2       a
     3       like
     This's
     10       orange,apple,mongo
     ----------------------------------------------
     $ awk '{print FILENAME} log.txt'
     -----------------------------------------------
     log.txt
     log.txt
     log.txt
     log.txt
     awk -F
     #-F相当于内置变量FS, 指定分割字符

    实例:

     $  awk -F, '{print $1,$2}'   log.txt
     ---------------------------------------------
     2 this
     3 Are you like awk
     ​
     # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
     $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
     ---------------------------------------------
     2 this
     3 Are
     awk -v #设置变量

    实例:

     $ awk -va=1 '{print $1,$1+a}' log.txt
     ---------------------------------------------
     2 3
     3 4
     This's 1
     10 11
     $ awk -va=1 '{print $1,$(1+a)}' log.txt
     ---------------------------------------------
     2 this
     3 Are
     This's a
     10 There
     $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
     ---------------------------------------------
     2 3 2s
     3 4 3s
     This's 1 This'ss
     10 11 10s

    流程控制语句

    语法格式

     if [ 条件]
     then
      指令
     elif [ 条件2 ]
     then
      指令
     else
      指令
     fi

    case选择语句

     read  -p "输入性别
     ​

    循环语句

    for循环

    实例:

     #将当前文件夹下的所有文件拷贝到bak
     for file in $(ls)
     do
     echo "文件:$file"
     cp "$file" bak/"${file}-baK"
     done

    while循环

     count =0
     while [ $count -le 5]
     do
     echo "count: $count"
     let count=count+1
     done

    函数/方法

     函数名(){
      函数体
     }

    实例

     echo "文件名:$0  参数个数:$# 第一个参数:$1"
     hanshu(){
     echo "这是一个函数"
     }
     echo "文件名:$0 参数个数:$# 第一个参数:$1"
     hanshu z x c#调用
     --------------------------------------------------------------------
     bash xxx.sh a s d#运行上面这些脚本
     ---------------------------------------------------------------------
     文件名:xxx.sh 参数个数:3 第一个参数:a
     文件名:xxx.sh 参数个数:3 第一个参数:z

自动化运维Shell入门的更多相关文章

  1. saltstack自动化运维快速入门

    saltstack自动化运维快速入门 关于saltstack 这个软件是干啥的 我这里就不介绍了 只是简单的说下是干啥的 网上的说法是 它是func的强化版本+ puppet的精简版 关于puppet ...

  2. 自动化运维-ansible入门篇

    1.ansible配置 什么是Ansible IT自动化工具 依赖于现有的操作系统凭证来访问控制远程机器 简单易用.安全可靠 Ansible可以完成哪些任务 配置系统 开发软件 编排高级的IT任务 A ...

  3. [Linux]Ansible自动化运维① - 入门知识

    目录 一.Ansible 概述 1.1 Ansible 是什么 1.2 Ansible 优势 1.3 Ansible 特性 二.Ansible 入门 2.1 Ansible 架构 2.2 Ansibl ...

  4. 自动化运维—tomcat服务起停(mysql+shell+django+bootstrap+jquery)

    项目简介: 项目介绍:自动化运维是未来的趋势,最近学了不少东西,正好通过这个小项目把这些学的东西串起来,练练手. 基础架构: 服务器端:web框架-Django 前端:html css jQuery ...

  5. 简单的自动化运维工具(shell+except+whiptail+功能模块化函数+循环)

    简单的自动化运维工具(shell+except+whiptail+功能模块化函数+循环) http://www.cnblogs.com/M18-BlankBox/p/5881700.html

  6. 自动化运维:(1)认识 Shell

    目录 (一)运维是什么? (二)什么是 Shell? (三)Shell的分类 (四)Shell脚本 (五)Shell的变量 (六)表达式 (七)Linux常见符号 (八)常见命令 (一)自动化运维是什 ...

  7. Linux Shell交互式自动化运维程序

    Expect是Linux操作系统下的一个用来处理交互操作,系统默认是没有安装expect库,所以执行expect会提示找不到命令,需要手动安装,其它安装也比较简单,可以通过二进制源码包编译配置进行安装 ...

  8. 自动化运维工具之Puppet基础入门

    一.简介 puppet是什么?它能做什么? puppet是一个IT基础设施自动化运维工具,它能够帮助系统管理员管理基础设施的整个生命周期:比如,安装服务,提供配置文件,启动服务等等一系列操作:基于pu ...

  9. Linux运维工程师入门的10大实用工具

    说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几方面,这样入门就基本没问题了. 工具如下: 1.Linux系统基础 这个不用说了,是基础中的基础,连这 ...

随机推荐

  1. 【JavaScript性能优化】------理解Script标签的加载和执行

    1.script标签是如何加载的?当浏览器遇到一个 < script>标签时,浏览器会停下来,运行JavaScript代码,然后再继续解析.翻译页面.同样的事情发生在使用 src 属性加载 ...

  2. 学习contiki需要知道的一些概念和注意事项

    概念: 1.宏:所谓宏,就是一些命令组织在一起,作为一个单独命令完成一个特定任务.Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作 ...

  3. 这么简单的 Redis 面试题都不懂,怎么拿offer?

    来源:mp.weixin.qq.com/s/daBkliC8dAT_zYyoLiS7WA 随着系统访问量的提高,复杂度的提升,响应性能成为一个重点的关注点.而缓存的使用成为一个重点.redis 作为缓 ...

  4. 二、spring的IoC

    IoC的基本认识 Inversion of Control:控制反转,就是将对象的创建权反转交给spring IoC的好处 传统方式的程序编写,底层的实现切换了,需要修改源代码 使用spring之后, ...

  5. ORM:Chloe

    ORM的一种:Chloe注意实体类模板特色:多表连接 利用chloe实现对各表的增删查改的管理,判断现有物料是否能够支持生产规模. 一开始报错: IQuery<ProductionPlans&g ...

  6. OAuth授权登录

    一.写在前面 日常生活中,我们经常看到到一个网站时,需要登录的时候,都提供了第三方的登录,也就是说你可以使用你的微信,QQ,微博等账号进行授权登录.那么这个认证登录的东西到底是什么呢? 微信授权登录页 ...

  7. UILabel颜色逐渐变化

    @interface UIViewController () @property (weak, nonatomic) IBOutlet UIView *backView; //空间是用storyBoa ...

  8. for循环(C语言型)举例

  9. Codeforces 1195E OpenStreetMap 单调队列套单调队列

    题意:给你一个n * m的矩阵,问所有的a * b的子矩阵的最小的元素的和是多少.题目给出了矩阵中的数的数据生成器. 思路:如果这个问题是1维的,即求所有区间的最小元素的和,用单调队列O(n)就可以做 ...

  10. sqoop 数据导入hive

    一. sqoop: mysql->hive sqoop import -m 1 --hive-import --connect "jdbc:mysql://127.0.0.1:3306 ...