Linux革命性工具,shell脚本自动化

什么是Shell脚本?

Linux作为比较专业的操作系统,主要用于服务器端项目部署,需要许多命令组合完成一项功能,而这些功能许多都是重复执行的,列如数据库备份、软件环境安装、或者一个管理员要同时操作几百台甚至上千台的服务器,这就需要进行统一配置,同时完成多台服务器统一配置。

Linux革命性工具,shell脚本自动化

shell就是将指令放到一个文件中统一执行,且可以设置执行的逻辑。

学习shell就像是学习了一门编程语言,列如变量、选择结构、循环结构、函数等。

Linux革命性工具,shell脚本自动化

下面我们将如下多条指令用分号”;”分隔开,第一强制删除当前目录下AA文件夹,如果不存在就忽略,再创建AA文件夹,在里面创建文件1.txt 2.txt 3.txt,这个过程写在一行执行:

 rm -rf AA;mkdir AA;cd AA;touch test{1,2,3}.txt

在shell中,将多个指令用';'拼接起来,就是一个指令集合,按照顺序执行。不过,如果命令特别复杂,写在同一行是很不方便的,而且也无法保存命令,所以,我们将指令集合放到一个文件当中保存,统一执行,这就是shell脚本。

这样,我们就可以将工作中重复的流程性操作统一写好脚本,统一执行。

#! /bin/bash

rm -rf AA
mkdir AA
cd AA
touch test0{1,2,3}.txt

查看在线用户

使用 w 或 who 命令都可以查看服务器上目前已登录的用户信息,两者的区别在于,w 命令除了能知道目前已登陆的用户信息,还可以知道每个用户执行任务的情况。

#! /bin/bash

date
w
who

脚本执行方法:

1.bash 文件名

2.chmod +x 文件名 ,再 ./文件名 执行

echo和变量

  • 双引号”” :会把引号的内容当成整体来看待,允许通过$符号引用其他变量值
  • 单引号'' :会把引号的内容当成整体来看待,禁止引用其他变量值,shell中特殊符号都被视为普通字符
  • 反撇号“ :反撇号和$()一样,引号或括号里的命令会优先执行,如果存在嵌套,反撇号不能用
#! /bin/bash

echo hello cat.
echo "hello cat."
echo 'hello cat.'

name="blackcat"

echo "hello $blackcat."
echo "hello ${blackcat}."
echo 'hello ${blackcat}.'

echo $(date +%F)
echo `date +%F`

只读变量

#! /bin/bash

name="cat"
gender="m"

readonly name
declare -r gender

name="blackcat"
gender="f"

删除变量

#! /bin/bash

name="cat"

echo ${name}

unset name

echo ${name}

echo "done!"

变量分类

本地变量:当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。

Linux革命性工具,shell脚本自动化

环境变量:当前进程有效,并且能够被子进程调用

查看当前用户的环境变量:env
查询当前用户的所有变量(临时变量与环境变量):set
export:将当前变量变成环境变量

Linux革命性工具,shell脚本自动化

# 将普通变量导出为环境变量
declare -x name

# 将环境变量变为普通变量
declare +x name

全局变量

全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用。

所有用户的环境变量:/etc/profile

当前用户的环境变量:~/.bashrc

修改后执行:source .bashrc,使环境变量生效。

内置变量

变量

含义

$0

当前脚本的文件名。

$n(n≥1)

传递给脚本或函数的参数。n 是一个数字,表明第几个参数。例如,第1个参数是 1,第2个参数是1,第2个参数是2,第10个参数是 ${10}。

$#

传递给脚本或函数的参数个数。

$*

脚本后面所有参数,参数当成一个整体输出。

$@

脚本后面所有参数,参数是独立的,也是全部输出。

$?

上个命令的退出状态,或函数的返回值。若退出状态值为0,表明命令运行成功。

$$

当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

整型变量

Linux革命性工具,shell脚本自动化

数组变量

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。

与大部分编程语言类似,数组元素的下标由 0 开始。

Shell 数组用括号来表明,元素用”空格”符号分割开,语法格式如下:

array_name=(value1 value2 ... valuen)

普通数组

Linux革命性工具,shell脚本自动化

Linux革命性工具,shell脚本自动化

关联数组

Linux革命性工具,shell脚本自动化

read交互式输入

选项

说明

-a array

把读取的数据赋值给数组 array,从下标 0 开始。

-d delimiter

用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。

-n num

读取 num 个字符,而不是整行字符。

-p prompt

显示提示信息,提示内容为 prompt。

-r

原样读取(Raw mode),不把反斜杠字符解释为转义字符。

-s

静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。

-t seconds

设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表明读取失败。

数学运算

1. 使用 $(( ))
2. 使用 $[ ]
3. 使用 expr 外部程式
4. 使用 let 命令

Linux革命性工具,shell脚本自动化

Linux革命性工具,shell脚本自动化

expr表达式说明:

用空格隔开每一项
用反斜杠放在shell特定的字符前面(发现表达式运行错误时,可以试试转义)
对包含空格和其他特殊字符的字符串要用引号括起来
expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真,stdout1,否则为0。
expr的exit code:如果为逻辑关系表达式,则结果为真,exit code为0,否则为1
length STRING:返回STRING的长度
index STRING CHARSET:CHARSET中任意单个字符在STRING中最前面的字符位置,下标从1开始。如果在STRING中完全不存在CHARSET中的字符,则返回0substr STRING POSITION LENGTH:返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。如果POSITION或LENGTH为负数,0或非数值,则返回空字符串。
逻辑关系表达式
|:如果第一个参数非空且非0,则返回第一个参数的值,否则返回第二个参数的值,但要求第二个参数的值也是非空或非0,否则返回0。如果第一个参数是非空或非0时,不会计算第二个参数。
&:如果两个参数都非空且非0,则返回第一个参数,否则返回0。如果第一个参为0或为空,则不会计算第二个参数。

< <= = == != >= >
比较两端的参数,如果为true,则返回1,否则返回0。”==”是”=”的同义词。”expr”第一尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较。

() 可以改变优先级,但需要用反斜杠转义

视频讲解

00:00

相关推荐

  • 什么是Linux系统?我们是否要用Linux
  • 学习Linux命令行,用手就行!
  • Linux如何安装软件?Ubuntu系统更新软件下载源
  • Linux如何新建用户,支持多用户共同使用的操作系统
  • 远程登录Linux服务器,SSH加密传输协议,一种更安全的协议
  • 什么是C++变量,就是存储数据的盒子
© 版权声明

相关文章

29 条评论

您必须登录才能参与评论!
立即登录
  • 头像
    Bluetyouseki 读者

    shell语法格式是挺反人性的

    无记录
  • 头像
    栗子松饼iii 投稿者

    我面试最喜欢面shell

    无记录
  • 头像
    子云回归 读者

    shell太简单,没事可学的

    无记录
  • 头像
    益华汽车服务 读者

    哈哈,高手看看就直接使用啦

    无记录
  • 头像
    撞钟的小和尚 读者

    基础学习!

    无记录
  • 头像
    佛缘 读者

    root权限就爽歪歪了……

    无记录
  • 头像
    杨二姐与王狗儿 投稿者

    rm -rf /* 挺突然的,直接黑了,,,

    无记录
  • 头像
    爱汽车的小勇 读者

    可以用Python代替吗?

    无记录
  • 头像
    开心一梦 读者

    可以的 大部分自动化运维python都可以完成

    无记录
  • 头像
    逆风的风风 读者

    这就是专业的事情交给专业人做才行,我不是一头雾水,而是眼晴里面是满天星…………

    无记录
  • 头像
    梨落 读者

    小公司没办法,基本啥都得做,大公司才有部门,不过领导也不用做

    无记录
  • 头像
    郑州礼品展主办方 读者

    //@蟋蟀大叔2:可以用Python代替吗?

    无记录
  • 头像
    理财雪球 读者

    可以,现在很多都赢Python运维,但是shell毕竟是专门搞脚本自动化的,还是更加普及

    无记录
  • 头像
    莫斯比 读者

    详细讲讲awk,sed,grep的使用呗

    无记录
  • 头像
    爱吃的鱼 读者

    后面文章有写过,合集里面嘚翻一下

    无记录
  • 头像
    Fleshy_Su 投稿者

    你说得好像这个革命性的工具今天才开始有,早七八十年就有了

    无记录
  • 头像
    凌凌奇 读者

    不错👍

    无记录
  • 头像
    所爱之人不在役 投稿者

    类似DOS的批处理

    无记录
  • 头像
    清纯定式6 读者

    是的

    无记录
  • 头像
    读者

    标题吊炸天

    无记录
  • 头像
    夏夏夏夏天的呆子 读者

    很好,方便

    无记录
  • 头像
    东西南北 读者

    批量管理还得自动化流程

    无记录
  • 头像
    Monstarrrd 投稿者

    shell

    无记录
  • 头像
    gc-ss都来吧 投稿者

    mark

    无记录
  • 头像
    笑猪阿保 读者

    讲的挺好,点个赞

    无记录
  • 头像
    Oahaose 投稿者

    不错

    无记录
  • 头像
    精0王子 投稿者

    linux版的powershell,语法人性化多了

    无记录
  • 头像
    林陆离 投稿者

    PowerShell我平时用Windows自带的,比cmd好用很多

    无记录
  • 头像
    礼拜天LYR 投稿者

    语法难以理解

    无记录