Shell脚本应用(一)上

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 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


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
23天前
|
分布式计算 Hadoop Shell
使用shell脚本实现自动SSH互信功能
使用shell脚本实现自动SSH互信功能
26 1
|
1天前
|
Shell 开发工具 Android开发
|
2天前
|
Shell Linux
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
linux shell 脚本实现:根据文件内容中的每行分隔符放入数组,根据规则打印日志并重新创建目录 备份文件
|
2天前
|
Shell Linux
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
linux shell脚本字符串 字段分隔符 存入数组 根据下标取值
|
2天前
|
Shell Linux
linux shell 脚本中变量截取
linux shell 脚本中变量截取
|
2天前
|
机器学习/深度学习 Shell Linux
linux shell脚本判断文件或文件夹是否存在循环操作
linux shell脚本判断文件或文件夹是否存在循环操作
|
2天前
|
Shell Linux
shell循环读文件 Linux脚本读文件
shell循环读文件 Linux脚本读文件
|
7天前
|
存储 算法 安全
shell 脚本之 函数与数组
shell 脚本之 函数与数组
|
7天前
|
机器学习/深度学习 Shell Perl
shell 脚本循环语句
shell 脚本循环语句
|
7天前
|
机器学习/深度学习 Ubuntu Shell
shell 脚本 条件语句
shell 脚本 条件语句