自动化运维

shell:命令解释器

shell位于操作系统和应用程序之间,解释对应命令至对应位置

分类:

  • 图形化界面:桌面
  • 命令行

编写与执行

#! /bin/bash

/bin/bash filename.sh

# 不需要有可执行权限,建议文件路径写完整
bash /bin/bash script_name 或 /bin/bash /root/script_name
# 脚本需要有可执行权限
/bin/bash script_name 或 ./script_name
# 当前环境下执行
source script_name 或 . script_name

注释

除第一行外,其他使用#

多行注释:

:<# !可以替换为@?abc等

变量

  • 普通变量:
    • a = 值 # 值为整体,无特殊符号
    • a = '值' # 看到什么输出什么,不解析值范围可解析内容
    • a = "值" # 如果值范围有可解析内容,优先执行
  • 命令变量
    • a = `命令`
      • a = $(命令) # 先获取命令值
  • 全局变量
    • env 显示全局变量
    • a = 值 # 设置普通变量为全局变量 export a
    • export a=值
  • 查看和取消
    • $变量名
    • "$变量名"
    • ${变量名}
    • "${变量名}"
    • # 取消 unset 变量名
  • 内置变量
    • $0 获取当前执行shell文件名称
    • $n (1…9) 获取命令行参数
    • $# 获取命令行中参数的总个数
    • $? 获取上一个指令的返回值(0为成功,非0为失败)

字符串截取

${变量名:起始位置:截取长度}

file = 112lkjlj234234

${file:0:5} 从第一个字符开始,截取5个字符(0可以省略)

${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符

获取默认值

${变量名:-默认值} 如果变量有值,则取变量值,没有则取默认值

${变量名:+默认值} 无论变量是否有值,强制使用默认值

测试语句

条件成立,返回0,不成立,返回1

  • test 条件表达式
  • [ 条件表达式 ]

文件表达式

  • -f 判断后边输入的是否是一个文件

    [ -f file.sh ]

  • -d 判断输入是否是一个目录

    [ -d Desktop ]

  • -x 判断输入是否有执行权限

    [ -x file.sh ]

数值操作符

-eq等于 -gt大于 -lt小于 -ne不等于

字符串比较

== !=

计算表达式

  • $(( 计算表达式 )) 只能用+-*/和()运算符(包含调用变量),并且只能用于整数运算
  • let 计算表达式

重定向符号

> 覆盖方式写入

>> 追加方式写入

后台展示符号

& 追加此符号可使程序后台运行

fg 调出后台程序(T挂起状态)

全部信息符号 2>&1

1: 正确输出信息

2: 错误输出信息

eg:

bash file.sh 2>> log.log  1>> log.log
# 类同
bash file.sh >> log.log 2>&1

标准输入:CPU,MEM, 键盘,扫描仪,文件

标准输出:显示器

错误输出:终端显示文件

linux垃圾桶

/dev/null

grep

grep [参数][关键字] <文件名>

grep aaa test.txt

参数:

-c 只输出匹配行的技术

grep -c aaa test.txt

-n 显示匹配行及行号

grep -n bbb test.txt

-v 显示不包含匹配文本的所有行

grep -v ccc test.txt

精确定位错误代码

grep -nr [错误关键字] *

grep -nr error_message * 代表任意字符

sed(行文件编辑工具)

sed [ 参数 ] `<匹配条件> [ 动作 ]` [ 文件名 ]

参数:

-i 表示对文件进行编辑(参数为空,表示演示操作,不对实际文件进行操作)(mac 版本中需要在参数后添加任意,例:-i ' '

动作参数:

-a 在匹配到的内容下一行增加内容

-i 在匹配到的内容上一行增加内容

-d 删除匹配到的内容

-s 替换匹配到的内容

替换命令:

sed -i [ 替换命令 ][ 文件名 ]

替换示例s:

sed '[ 行号 ]s#原内容#替换内容#[ 列号 ]' (# 可以更换为其他特殊字符:!@/等)(行号省略,代表所有行;列号省略代表第一列(列号g 代表所有列))

增加示例-i:(选定行的上一行增加)

sed -i '行号i\增加的内容' 文件名 多行范围(1~2):sed -i '行号1,行号2i\增加的内容' 文件名

增加示例-a:(选定行的下一行增加)

sed -i '行号a\增加的内容' 文件名 多行范围(1~3):sed -i '行号1,行号3a\增加的内容' 文件名

删除示例-d:

sed -i '行号d' 文件名 多行范围(1~3):sed -i '行号1,行号3d' 文件名

awk 文档编辑工具

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

参数:

-F 指定行分隔符(文本中内容)

动作:

print 显示内容

$0 显示当前行内容

$n 显示当前行的第n列内容,如果存在多个$n,它们之间使用逗号, 隔开

常见内置变量:

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

NR 指定显示行的行号

NF 输出 最后一列的内容

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

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

awk '{print $1, $3}' test.txt

awk '{print $0}' test.txt 打印所有行内容

指定行:

指定隔离分隔符,查看内容

admin-1@ubuntu:~$ awk -F ':' '{print $1,$7}' test.txt 

设置显示分隔符,显示内容

admin-1@ubuntu:~$ awk 'BEGIN{OFS=":"} {print NR,$0}' awk.txt 

1:nihao awk awk awk
2:nihao awk awk awk

find命令

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

参数详解

-name 按照文件名查找文件。

find /root -name *.py

-perm 按照文件权限来查找文件。

-user 按照文件属主来查找文件。

-group 按照文件所属的组来查找文件。

-type 查找某一类型的文件,

find /root/ -type d -name '*.py' (配合-name使用)

诸如:

b - 块设备文件

d - 目录

c - 字符设备文件

p - 管道文件

l - 符号链接文件

f - 普通文件。

-size n :[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。

-depth :在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

-mindepth n :在查找文件时,查找当前目录中的第n层目录的文件,然后再在其子目录中查找。

! : 表示取反

if语句

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

case语句

case 变量名 in
# 变量名可以使用$1等传参方式1)
      指令1
         ;;
   值2)
      指令2
         ;;
   值3)
      指令3
         ;;
   *)
   # 条件*代表任意或者没有,不能放在首位
      指令4
         ;;
esac

for语句

forin 列表
do
   执行语句
done

例:

#!/bin/bash
# for语句的使用示例
for i in $(ls /root)
do
  echo "${i}"
done

while语句

while 条件
do
   执行语句
done

例:

#!/bin/bash
# while的示例
a=1
while [ "${a}" -lt 5 ] 
do
   echo "${a}"
   a=$((a+1))
done

until语句

until 条件
# 只要条件不满足,就会循环
do
   执行语句
done

例:

#!/bin/bash
# until的示例
a=1
until [ "${a}" -eq 5 ] 
do
   echo "${a}"
   a=$((a+1))
done

函数

函数名(){
    函数体 $n
}

调用

函数名 参数

代码发布

压缩和解压

压缩:tar zcvf file_name

解压:tar xvf file_name

z 指定压缩文件的格式为 tar.gz

c 表示压缩

v 显示详细过程

f 指定压缩文件

x 解压

查看压缩包文件: zcat cfile_name

SCP

本地推送到远程:

scp python.tar.gz [email protected]:/root/

远端文件拉取到本地:

scp [email protected]:/root/python.tar.gz ./

SFTP

sftp [email protected]

put file_name

get file_name

备份(使用时间戳)

date [option]

参数:

%F 显示日期格式: %Y-%m-%d date +%F

%T 显示时间格式: %H:%M:%S date +%T

连续格式(无连接符): date +%Y%m%d

复制备份:cp file_name ./file_name-$(date +%Y%m%d%H%M%S)

移动备份:mv file_name ./file_name-$(date +%Y%m%d%H%M%S)

部署环境

  • 创建基础目录

    mkdir /data/{server, logs, backup, softs, virtual, scriptes, codes} -p

    (服务, 日志, 备份, 软件, 虚拟环境, 脚本,代码)

    touch {3.. 5} 创建3 ,4, 5连续文件

  • 主机网络环境

    • 主机间免密认证

      生成密钥对: ssh-keygen -t rsa

      密钥目录:/root/.ssh/

      私钥:id_rsa 公钥id_rsa.pub

      编辑认证文件: 将公钥放置于服务器端~/.ssh/authorized_keys

      配置ssh文件: /etc/ssh/sshd_config

      AuthorizedKeysFile %h/.ssh/authorized_keys

      重启ssh /etc/init.d/ssh restart

  • 虚拟环境安装

    • wget http://www.....

    使用python-venv 创建:python3 -m venv ven_name

    激活: cd 至 虚拟环境下bin source ./activate

  • nginx

    • pcre 关联软件安装

    检查: nginx/sbin/nginx -t

    开启: /nginx/sbin/nginx

    关闭: /nginx/sbin/nginx -s strop

    重启: `/nginx/sbin/nginx -s reload

    server{
        loaction / {
        proxy_pass http://127.0.0.1:8000;
        }
    }

快速查看端口pid

lsof -Pti :8000

快速杀死端口 kill $(lsof -Pti :8000)

查看端口服务:netstat -tnulp

远程执行

ssh user_name@ip "执行命令"

锁文件

if [ -f "${PID_FILE}" ]
then
    err_msg
else
    main
fi

脚本调试

-n 检查脚本中语法错误

-v 先显示脚本内容,然后执行脚本,将结果输出,如果有错误,将错误输出

-x 将执行的每一条命令和结果反馈

你可能感兴趣的:(shell)