Shell脚本应用(一)上

简介: Shell脚本应用(一)上

Shell脚本基础

在一些复杂的Linux维护工作中,大量重复性的输出和交互操作不仅费时费力,而且容易出错,而编写一个恰到好处的shell脚本程序,可以批量处理,自动化地完成一些列维护任务,大大减轻管理员的负担。

shell的作用

命令解释器,起到了翻译官的作用,介于系统内核与用户之间,负责解释命令行。

用户的登录shell

登录后默认使用的shell程序,一般为/bin/bash,不同shell的内部指令,运行环境都会有所区别。hash的全称为Bourne Again shell ,是最受欢迎的开源软件项目之一。

1.  [root@localhost ~]# cat /etc/shells 
2.  /bin/sh
3.  /bin/bash
4.  /sbin/nologin
5.  /usr/bin/sh
6.  /usr/bin/bash
7.  /usr/sbin/nologin
8.  /bin/tcsh
9.  /bin/csh

编写第一个shell脚本

什么是shell脚本呢?简单的说,只要将平时使用的各种Linux命令按顺序保存到一个文本文件中,添加可执行的权限,这个文件就成为了一个shell脚本了。

例如,执行以下操作可以创建第一个脚本文件:1.sh

1.  [root@localhost ~]# vim 1.sh
2.  cd /boot/
3.  pwd
4.  ls -lh vml*
5.  [root@localhost ~]# chmod +x 1.sh                       //添加可执行权限
6.  [root@localhost ~]# ./1.sh                              //执行脚本,下方结果
7.  /boot
8.  -rwxr-xr-x. 1 root root 5.2M 5月   7 2018 vmlinuz-0-rescue-d2fbf6a8306647d2abb5b8e02db3fcaa
9.  -rwxr-xr-x. 1 root root 5.2M 11月 23 2016 vmlinuz-3.10.0-514.el7.x86_64
10.  [root@localhost ~]#

执行脚本的方法有三种:

方法一:直接执行脚本文件(需要有X的权限)

./脚本文件  或 /路径/脚本文件          ————相对路径和绝对路径

方法二:sh命令执行

sh  /路径/脚本文件

方法三:source命令执行(可以用 . 代替)

source  /路径/脚本文件

一个合格的shell脚本程序应该遵循标准的脚本结构,而且能够输出友好的提示信息,更加容易读懂。对于代码多,结构复杂的脚本,应添加必要的注释文字。

1.  [root@localhost ~]# vim 1.sh
2.  
3.  #!/bin/bash
4.  # This is my 2.sh Shell-script.
5.  cd /boot
6.  echo "dang qian mu lu wei yu :"
7.  pwd
8.  echo "qi zhong yi vml kai tou de wen jian bao kuo:"
9.  ls -lh vml*

第一行“#!/bin/bash”是一行特殊的脚本声明,表示此行以后的语句通过/bin/bash程序来解释执行;其他"#"开头的语句表示注释信息;echo命令用于输出字符串,以使脚本的输出信息更容易读懂。

脚本执行结果如下:

1.  [root@localhost ~]# chmod +x 1.sh 
2.  [root@localhost ~]# ./1.sh 
3.  dang qian mu lu wei yu :
4.  /boot
5.  qi zhong yi vml kai tou de wen jian bao kuo:
6.  -rwxr-xr-x. 1 root root 5.2M 5月   7 2018 vmlinuz-0-rescue-d2fbf6a8306647d2abb5b8e02db3fcaa
7.  -rwxr-xr-x. 1 root root 5.2M 11月 23 2016 vmlinuz-3.10.0-514.el7.x86_64

重定向与管道操作

重定向操作

linux系统使用文件来描述各种硬件,设备等资源,如以前学过的硬件和分区,光盘等设备文件,用户通过操作系统处理信息的过程中,包括以下几类交互式设备文件。

标准输入:从该设备接收用户输入的数据,默认的设备是键盘,文件编号为0,设备文件/dev/stdin。 标准输出:通过该设备向用户输出数据,默认的设备是显示器,文件编号为1,设备文件/dev/stdout。 标准错误:通过该设备报告执行出错信息,默认的设备是显示器,文件编号为2,设备文件/dev/stderr。

重定向输入: <

将命令中接收输入的途径有默认的键盘改为指定的文件,而不是等待从键盘输入。

1.  [root@localhost ~]# vim password.txt
2.  123456
3.  [root@localhost ~]# passwd --stdin jerry < password.txt 
4.  更改用户 jerry 的密码 。
5.  passwd:所有的身份验证令牌已经成功更新。

重定向输出:>(覆盖) >>(追加)

将命令的正常输出结果保存在指定的文件中,而不是直接显示在显示器的屏幕上。

1.  覆盖
2.  [root@localhost ~]# uname -p > 1.txt
3.  [root@localhost ~]# cat 1.txt 
4.  x86_64
5.  追加
6.  [root@localhost ~]# uname -r >> 1.txt
7.  [root@localhost ~]# cat 1.txt 
8.  x86_64
9.  3.10.0-514.el7.x86_64

重定向错误输出: 2> (覆盖) 2>>(追加)

将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件中,而不是直接显示在屏幕上。

1.  [root@localhost ~]# tar jcf /123/456.taz /etc/ 2> error.log
2.  [root@localhost ~]# cat error.log 
3.  tar: 从成员名中删除开头的“/”
4.  tar (child): /123/456.taz:无法 open: 没有那个文件或目录
5.  tar (child): Error is not recoverable: exiting now

混合输出(正确和错误):&>

当命令输出的结果可能既包括标准输出(正常运行)信息,又包括错误输出信息时, 可以使用操作符“>” "2>" 将两类输出信息分别保存到不同的文件,也可以使用“&>”操作符将两类输出信息保存到同一个文件中。例如,在编译源码包的自动化脚本中,若要忽略make,make install 等操作过程信息,则可以将其定向到空文件/dev/null中。

管道符操作

将左侧的命令的输出结果,作为右侧命令的处理对象,同一命令中可以使用多个管道符。

1.  [root@localhost ~]# grep "/bin/bash$" /etc/passwd               //提取前
2.  root:x:0:0:root:/root:/bin/bash
3.  lisi:x:1000:1000:lisi:/home/lisi:/bin/bash
4.  jerry:x:1001:1001::/home/jerry:/bin/bash
5.  [root@localhost ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'     //提取后
6.  root /bin/bash
7.  lisi /bin/bash
8.  jerry /bin/bash

awk命令:提取一行中的某一段(不写-F表示一空格分隔)

awk -F: '{print $1,$7}'

若要提取根分区的磁盘使用率信息,可以执行以下操作,其中用到了df,grep,awk命令和管道符操作。

1.  [root@localhost ~]# df -hT                              //提取前
2.  文件系统            类型      容量  已用  可用 已用% 挂载点
3.  /dev/mapper/cl-root xfs        39G  3.9G   35G   11% /
4.  devtmpfs            devtmpfs  897M     0  897M    0% /dev
5.  tmpfs               tmpfs     912M  116K  912M    1% /dev/shm
6.  tmpfs               tmpfs     912M  9.0M  903M    1% /run
7.  tmpfs               tmpfs     912M     0  912M    0% /sys/fs/cgroup
8.  /dev/sda1           xfs      1014M  173M  842M   18% /boot
9.  /dev/mapper/cl-home xfs        19G   33M   19G    1% /home
10.  tmpfs               tmpfs     183M  8.0K  183M    1% /run/user/0
11.  /dev/sr0            iso9660    40M   40M     0  100% /media
12.  [root@localhost ~]# df -hT | grep "/$" | awk '{print $6}'       //提取后其中grep "/$" 表示提取以“/”结尾的行
13.  11%

使用Shell变量

各种shell环境中都是用到了“变量”的概念。shell变量用来存放系统和用户需要使用的特定参数(值),而这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,shell程序能够提供更加灵活的功能,适应性更强。常见的shell变量的类型包括自定义变量,环境变量,位置变量,预定义变量。

自定义变量

自定义变量是由系统用户自己定义的变量,只在用户自己的shell环境中有效,因此又称为本地变量。在编写shell脚本程序时,通常会设置一些特定的自定义变量,以适应程序执行过程中的各种变化,满足不同的需求。

  • 定义新的变量

bash中的变量操作相对比较简单,不像其他高级编程语言那么复杂。在定义一个新的变量时,一般不需要提前进行声明,而是直接指定变量名称并赋予初始值(内容)即可。

定义变量的基本格式为“变量名=变量值”,等号两边没有空格。变量名称需以字母或下划线开头,名称中不要包括特殊字符。例如,若要定义一个名为“product”的变量值为python和一个名为“version”的变量值为2.7.13,可以执行以下操作。

1.  [root@localhost ~]# product=python
2.  [root@localhost ~]# version=2.7.13
  • 查看和引用变量的值

通过在变量名称前添加前导符号“$",可以引用一个变量的值。使用echo命令可以查看变量可以在一条echo命令中同事查看多个变量值。

1.  [root@localhost ~]# echo $product
2.  python
3.  [root@localhost ~]# echo $product $version
4.  python 2.7.13

当变量名称容易和紧跟其后的其他字符相混淆时,需要添加大括号“{}”将其括起来,否则将无法确定正确的变量名称。对于未定义的变量将显示空值。

1.  [root@localhost ~]# echo $product2.5                //变量product2.5并未被定义
2.  .5
3.  [root@localhost ~]# echo ${product}2.5
4.  python2.5
  • 变量赋值的特殊操作

1)双引号(“)

双引号主要起界定字符串的作用,特别是当要赋值的内容中包含空格时,必须以双引号括起来;其他情况下双引号通常可以省略。例如,若要将Python2.7.13赋值给变量PYTHON,应执行PYTHON=“Python 2.7.13”操作

1.  [root@localhost ~]# PYTHON=Python 2.7.13
2.  bash: 2.7.13: 未找到命令...
3.  [root@localhost ~]# PYTHON="Python 2.7.13"
4.  [root@localhost ~]# echo $PYTHON
5.  Python 2.7.13

在双引号范围内,使用“$”符号可以引用其他变量的值(变量引用),从而能够直接调用现有变量的值来赋给新的变量。

1.  [root@localhost ~]# sqlserver="sqlserver $version"              //以变量的值进行赋值
2.  [root@localhost ~]# echo $sqlserver 
3.  sqlserver 2.7.13

2)单引号( ‘ )

当要赋值的内容包含$,",\等具有特殊含义的字符时,应使用单引号括起来。在单引号的范围内,将无法引用其他变量的值,任何字符均作为普通字符看待。但赋值内容中包含单引号(’)时,需要使用/'符号进行转义,以免冲突。

1.  [root@localhost ~]# sqlserver='sqlserver $version'
2.  [root@localhost ~]# echo $sqlserver
3.  sqlserver $version

3)反撇号(`)

反撇号主要用于命令替换,允许将执行某个命令的屏幕输出结果赋值给变量。反撇号括起来的范围内必须是能够执行的命令行,否则将会出错。例如,若在一行命令中查找useradd命令程序的位置并列详细属性,可以执行以下操作。

1.  [root@localhost ~]# ls -lh `which useradd`
2.  -rwxr-x---. 1 root root 116K 11月  6 2016 /usr/sbin/useradd

上述操作相当于连续执行了两条命令——先通过which useradd命令查找出useradd命令的程序位置,然后根据查找结果列出文件属性。执行过程中,会用which useradd命令的输出结果替换整个反撇号范围。

需要注意的是,使用反撇号难以在一行命令中实现嵌套命令替换操作,这时可以改用“$()”来代替反撇号操作,以解决嵌套的问题。例如,若要查询提供useradd命令程序的软件包所安装的配置文件位置,可以执行以下操作(从里到外先后执行替换)。

1.  [root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))
2.  /etc/default/useradd
3.  /etc/login.defs


相关文章
|
3月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
|
3月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
|
6月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
287 60
|
3月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
9月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
5月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
641 1
|
7月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
203 17
|
7月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
224 4
|
7月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
444 3
|
8月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
686 25