Linux 脚本运维总结之Shell script

1. 本地变量和环境变量

变量类型 定义形式 声明位置 显示命令 作用域
本地变量 VARNAME=value 命令行或shell脚本 set (显示所有变量) 本用户,本进程
环境变量 export VARNAME=value ~/.bash_profile (当前登陆用户有效)/etc/profile (所有登陆用户有效) env(仅显示环境变量) 所有用户所有进程

2. 脚本调试

  • 法一
#!/bin/bash -x
  • 法二
set -x
要调试的几行代码
set +x

3. 退出状态

exit n    # n=0正常,n!=0出错,n~[0-255]

脚本中没有exit命令则以最后一条命令的退出码为整个脚本的退出码

$?    上一条命令的退出码

4. 变量连接

Linux把${}中的变量视作一个整体。${}会将其后的内容连接处理。

BABY="cerana"    注意赋值的=号前后不要留白,否则变量将被当做shell命令执行,而后边的内容解释为参数。

BABY_svn="hello"

echo ${BABY}_svn    显示 cerana_svn
echo ${BABY}:babala    显示cerana:babala
echo ${BABY_svn}    显示 hello

5. shell script中的常用命令

:与true语句功能相同,产生测试结果为真的结果
如:
while :
do
    ......
done

echo -n "Enter your name: "    -n不输出换行符
read name    将控制台输入赋给变量name
或者
read -p "Enter your name: " name

expr 整数运算
expr 1 + 1
expr 1 - 1
expr 3 \* 4
expr 3 / 4  为0,是整除
echo 2^3 | bc 指数运算
expr "abc" = "Abc" 返回0
expr "abc" = "abc" 返回1
echo "scale=2;1.2*7.8" | bc  scale控制小数位数
echo "scale=2;13/2" | bc

n=1
let n+=3  支持+=, -=, *=, /=, %=

6. 数值常数

0 开头表示八进制数
0x或者0X 开通表示十六进制数

7. 命令替换

` ... ` 或者$( ... )

8. test语句

test expression
[ expression ]  注意方括号内部前后要留白
[[ expression ]] 注意方括号内部前后要留白(扩展形式)

9. 文件测试

测试语句 描述
-e file 给定的文件存在
-r file 给定的文件存在,且当前用户可读
-w file 给定的文件存在,且当前用户可写
-x file 给定的文件存在,且当前用户可执行
-s file 给定的文件存在,且文件非空
-f file 给定的文件存在,且为普通文件
-d file 给定的文件存在,且是一个目录
-L file 给定的文件存在,且是一个符号链接
-c file 给定的文件存在,且是一个字符特殊文件
-b file 给定的文件存在,且是一个块特殊文件
-p file 给定的文件存在,且是一个命名管道文件
BACKUPDIR=/data/backup
[ -d ${BACKUPDIR} ] || mkdir -p ${BACKUPDIR}
[ ! -d ${BACKUPDIR}/bin ] && rm -rf ${BACKUPDIR}/bin

10. 字符串测试

测试语句 描述
-z str 给定的字符串长度为0,字符串要加双引号
-n str 给定的字符串长度不为0,字符串要加双引号
s1=s2 字符串相等
s1!=s2 字符串不等
s1<s2 字符串比较
s1>s2 字符串比较

11. 数值比较

测试语句 描述
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

12. 逻辑运算

测试语句 描述
( ) 组合
! exp
-a 或 &&
-o 或 ││

13. 函数

function fname(){
    cmd;
    [return 数值;]  如果不加此句则将最后一条命令的执行结果作为退出码
}

例子

#!/bin/bash 

function traverse(){
    dir=$(echo $1 | sed "s|\/$||")

    for file in `ls $dir`
    do
        if [ -d $dir"/"$file ]
        then
            traverse $dir"/"$file
        else
            echo $dir"/"$file
        fi
    done
}

traverse $1

14. 字符串截取

命令 说明
${var##*str} 从左向右截取最后一个str后的字符串
${var#*str} 从左向右截取第一个str后的字符串
${var%%str*} 从右向左截取最后一个str后的字符串
${var%str*} 从右向左截取第一个str后的字符串
${var:n1:n2} 截取变量var从n1开始的n2个字符(n1从0开始)

15. 控制结构

  • if分支
if condition1
then
    cmd1
else
    cmd2
fi

或者
if condition1
then
    cmd1
elif condition2
    cmd2
else
    cmd3
fi
  • case分支
case value in
mode1)
    cmd1
    ;;
mode2|mode3)
    cmd2
    ;;
mode4)
    cmd3
    ;;
*)
    cmd4
    ;;;
esac
  • 循环
for var in list
do
    cmd
done

list可以为:
列表,字符串,文件名,{100..200}

while conditions
do
    cmd
done

循环常用形式:

for LINE in `cat file`
或者
cat $FILE | while read LINE

16. sed基本用法

sed [-nefr] [n1, n2] 'actions'

例子:

删除file的2~5行后再显示
cat -n file | sed '2,5d'

在文件file的第二行的下一行添加“Hello, world”字符串
cat -n file | sed '2a Hello, world'

注意:行末使用 \ 转义回车换行符达到续行的效果。

将2~5行的内容替换为baby girl
cat -n file | sed '2,5c baby girl'

只显示5~7行的内容
cat -n file | sed -n '5,7p'

实现字符串函数 trim() 的效果
sed 's/^\s*//' totrim.txt |sed 's/\s*$//'>trimed.txt
sed 's/^\s*//;s/\s*$//' totrim.txt>trimed.txt
sed -e 's/^\s*//' -e 's/\s*$//' totrim.txt>trimed.txt

设置去除,不要注释行
cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'

下加一行(&指代pattern)
sed 's/pattern/&\n/g' file
上加一行
sed 's/pattern/\n&/g' file

变量替换
sed -e "s/$var1/$var2/g" file

在第一行前插入文本---BEGIN---,在最后一行插入文本---END---。
cat test4.txt | sed '1 i\---BEGIN---' | sed '$ a\---END---'

在正则匹配行前插入string
sed -i '/pattern/ i "string"' file
在正则匹配行后插入string
sed -i '/pattern/ a "string"' file

将家目录~下所有文件中的abc都改为cba(g指一行中的每一列都要处理)
sed -i 's/abc/cba/g' `grep abc -rl ~`
其中:-r表示递归,但不包括符号连接,-l表示只列出匹配的文件名(绝对路径)。

使用其他分隔符文本替换
sed -i '[email protected]://[^.]*[email protected]/home/html/[email protected]' file

行首添加注释#
sed -i '1,20s/^/#/' file  只处理第一个匹配
取消行首的#
sed -i '1,20s/^#//' file  只处理第一个匹配

提取日志记录
sed -n '/2018-11-08 10:15:00/, /2018-11-11 10:15:00/p' logfile

17. awk基本用法

awk [-F field-seperator] 'pattern {action}' file
BEGIN 初始化
数据处理
END 收尾处理
注意:需使用单引号,以防被shell解释。
pattern和{action}可以省略其中之一,但不能同时省略。
action 中的语句以 ; 分隔。

awk -F[:" "] ...    -F[:" "]表示以:和空格作为分隔符
默认分隔符是空格

内置变量
FS  输入字段分隔符
RS  输入记录分隔符
OFS 输出字段分隔符
ORS 输出记录分隔符
NF  输入字段个数
NR  输入当前记录编号
$0  整条记录
$n  第n条记录,n=1,2,3,...

pattern{action}模式

/^$/ {print "blank line"}
$5~/MA/ {print $1" "$3}

例子:

抓取时间范围是Jun 30 10:30:00到Jun 30 11:00:00的日志记录
cat /var/log/secure | grep "Jun 29" | awk '$3>="22:00:00" && $3<="22:30:00"'
类似地有
cat log1 | awk -F'\t' '$1$2>="2013/08/16    01:16:11.111" && $1$2<="2013/08/16    01:25:22.222"'

转换时间格式
date -d "Jun 23 12:22:21" "+%F %T" 转换时间格式
2018-06-23 12:22:21 回显
echo "Jun 23 12:22:21" | awk '{NF=3;cmd="date -d \""$0"\" \"+%F %T\"";cmd|getline dt;print dt;close(cmd)}'

统计
cat file | awk -F: 'BEGIN{count=0} $2>0{count+=$9} END{print count}'
  1. 常用运维脚本
  • ftp备份
ftp -i -n -v << !
open ${HOST}
user ${USERNAME} ${PASSWORD}
bin
cd ${OLDDATE}
mdelete *
cd ..
rmdir ${OLDDATE}
mkdir ${DATE}
cd ${DATE}
mput *
bye
!
  • 批量添加/删除用户
    用户信息文件users.txt
cerana1:13888298736
cerana2:13888298737
cerana3:13888298738
cerana4:13888298739
cerana5:13888298740

批量添加用户的脚本

#!/bin/bash
#把本shell脚本和账号文件放在同一个目录下

for line in `cat users.txt` ; do
    username=$(echo $line | awk -F: '{print $1}')
    password=$(echo $line | awk -F: '{print $2}')
    useradd $username
    echo "User $username was added successfully" 

    #passwd --stdin表示不交互,直接输入密码
    echo $password | passwd --stdin $username
    #强制用户第一次登陆就必须更改密码
    chage -d 0 $username
    #定义密码有效期30天
    chage -M 30 $username
done
echo "Finish!"

批量删除用户的脚本

#!/bin/bash

for line in `cat users.txt` ; do
    username=$(echo $line | awk -F: '{print $1}')
    #同时删除用户home目录,邮箱等资源
    userdel -r $username
    echo "User $username was deleted successfully"
done
echo "Finish!"

原文地址:https://www.cnblogs.com/cerana/p/11108362.html

时间: 2024-09-29 23:32:07

Linux 脚本运维总结之Shell script的相关文章

手游公司运维之利用Rundeck自动化运维工具和Shell脚本构建测试环境代码发布平台和生产环境代码发布平台

在做手游运维工作之前,我接触的代码发布都是常规的软件发布,有固定的发布周期.之前工作的那个外企有严格的发布周期,一年中的所有发布计划都是由Release Manager来控制,每次发布之前都需要做一些准备工作,如填写发布表单,上传发布需要的资源文件,联系发布过程中的相关人员,如开发和测试.最后在公司内部开发的发布平台上按照指定的时间点击鼠标对一个集群内的几台主机或全部主机进行代码发布.这个发布平台还是基于rsync服务实现的.虽然每个星期都有各种服务的发布,但是整个发布流程是可以控制的,并且发布

Linux系统运维与架构设计

一 本章概览 介绍Linux系统运维与架构设计的方方面面 二 Linux基础入门 认识计算机核心硬件和服务器 Linux发展历史.系统组成.应用领域以及发行版 搭建运维环境:VMWareWorkStation.SecureCRT的使用 Linux系统的基本使用 Shell入门以及命令概述 三 Linux系统管理 文件目录管理 用户管理 权限管理 VIM编辑器的使用 文档压缩打包 程序包管理 网络管理 文件系统管理 内存管理 系统管理(监控.环境变量) 安全管理(selinux,iptables)

[转]Linux 系统运维学习方法汇总

Linux 系统运维学习方法汇总 (2014.07.18) from:http://freeloda.blog.51cto.com/2033581/1315694 大纲 一.前言 二.Linux 运维大环境说明 三.Linux 运维学习思路 四.Linux 运维大方向说明 五.Linux 运维学习必看书籍推荐 六.Linux 运维实践内容简介 注,本博文主要用于交流与学习.如有雷同,纯属意外. 一.前言 最近,有不少博友问我.刚进入运维行业怎么学习呢?思路是什么?一点思路也没有,然后与大家在群里

Linux服务器运维安全策略经验分享

http://jxtm.jzu.cn/?p=3692 大家好,我是南非蚂蚁,今天跟大家分享的主题是:线上Linux服务器运维安全策略经验.安全是IT行业一个老生常谈的话题了,从之前的“棱镜门”事件中折射出了很多安全问题,处理好信息安全问题已变得刻不容缓.因此做为运维人员,就必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先要站在攻击者的角度思考问题,修补任何潜在的威胁和漏洞.今天,我为大家讲的,主要分五部分展开:账户和登录安全账户安全是系统安全的第一道屏障,也是系统安全的核心,保障登录

要成为linux网站运维工程师必须要掌握的技能

我是一名linux运维工程师,确切的说是网站运维工程师,从事linux工作有2年多了,对这方面有一些体会,给新手一点借鉴: 首先说下运维种类:有办公网系统运维(就是网管),有IDC外网运维,外网运维里又分网站运维.游戏运维.IDC运维(装系统排障),监控运维(盯着监控).我强烈建议大家选择linux网站运维路线,这个路线绝对是最好的,会了网站运维了去做别的运维岗位绝对也是信手拈来的,网站运维需要的技术点更多,因此,我以我工作的网站运维岗位说说运维都需要啥. 1.选择linux系统选择linux系

零基础转行Linux云计算运维工程师获得20万年薪的超级学习技巧

云计算概念一旦产生便一发不可收拾,成为移动互联网时代最为火热的行业之一.国内各大互联网公司例如阿里.腾讯.百度.网易等纷纷推出自己的云计算产品,3月10日,腾讯云0.01元投标时间更是让云计算在普罗大众中火热了一把! 随着云计算的产生,运维工程师也迎来了职业的升级.传统的运维工程师散布在各个企业,在可见的将来,运维工程师将会越来越集中于云计算平台.当然,各企业因为对服务器端内容需要维护,也会有运维工程师的需求. 随着云计算被捧上神坛,相应的人才待遇水涨船高.据拉勾统计,云计算相关岗位数量相比前一

云计算视频,Linux云计算运维开发架构视频

云计算视频,Linux云计算运维开发架构视频,该视频一共分为两大板块: 一.Python Linux自动化运维开发实战 1.python开发环境部署 2.python文件类型 3.python运算符及表达式 4.python数据类型 5.python流程控制 6.python文件操作 7.python 函数 8.python包与模块 9.python正则表达式 10.python异常处理 11.python面向对象 12.收集主机系统信息 13.构建信息发布系统 Django 14.批量主机管理

云计算课程大纲,Linux云计算运维课程视频

架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物.一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单. 架构师在软件开发的整个过程中起着很重要的作用.接着分享的视频讲究的不止是Linux,而且是云计算:不止是云计算,而且是运维:不只是运维,而且是开发. 视频课程一共分为两大板块: 一.Python Linux自动化运维开发实战 1.python开发环境部署 2.python文件类型 3.python运算符

Linux系统运维面试题,Linux运维经典面试题讲解

这里给大家整理了一些Linux系统运维相关的面试题,有些问题没有标准答案,希望要去参加Linux运维面试的朋友,可以先思考下这些问题. 1.Linux如何挂载windows下的共享目录? mount.cifs //IP地址/server /mnt/server -o user=administrator,password=123456 linux 下的server需要自己手动建一个 后面的user与pass 是windows主机的账号和密码 注意空格 和逗号 2.如何查看http的并发请求数与其