Shell 脚本学习指南-入门篇

本文介绍了Shell脚本的学习指南,包括软件设计原则,如文本处理、正则表达式使用和标准I/O重定向。详细讲解了Shell脚本的基础,如简单的脚本编写、命令与参数、变量、I/O重定向、命令查找以及脚本参数访问。通过实例展示了如何编写和执行简单的Shell脚本,以及如何开启执行跟踪和处理国际化与本地化问题。
原则影响着日后的点点滴滴。

一、软件设计原则

  1. 一次做好一件事:若程序只做一件事,那么设计、编写、调试、维护及生成文件都会容易得多。此原则的结果就是会不断产生更小、更专用与特定功能的程序。

  1. 处理文本行,不要处理二进制数据:内含文本行的数据可以使用文本编辑器编辑、可以在网络与各种机器架构间传输,也有助于任何自定义工具与UNIX程序的结合。

  1. 使用正则表达式:正则表达式是很强的文本处理机制,了解其运作模式可适度简化编写命令脚本的工作。

  1. 默认使用标准输入 / 输出:在未明确指定文件名的情况下,程序默认会从它的标准输入读取数据,将数据写到它的标准输出,至于错误信息则会传送到标准错误输出。以这样的方式来编写程序,可以轻松地让它们成为数据过滤器(filter),例如,组成部分的规模越大,越需要复杂的管道(pipeline) 或脚本来处理。

  1. 避免喋喋不休:软件工具的执行过程不该像在“聊天”(chatty)。不要将“开始处理”(starting processing)、“即将完成”(almost done) 或是“处理完成”(finished processing) 这类信息放进程序的标准输出(至少这不该是默认状态)。在工具程序的世界里,没有消息就是好消息!

  1. 输出格式必须与可接受的输入格式一致:这样做的好处是容易将一个程序的执行结果交给另一个程序进行处理。

  1. 让工具去做最困难的部分:虽然程序并非完全符合你的需求,但是现有的工具或许已经可以为你完成 90%的工作。接下来,若有需要,你可以编写一个功能特定的小型程序来完成剩下的工作。与每次都从头开始来解决各个问题相比,这已经让你省去许多工作了。

  1. 构建特定工具前先想想:动手编写一个能够解决问题的程序前,请先停下来想几分钟。你所要做的事,是否有其他人也需要做?这个特殊的工作是否有可能是某个一般问题的一个特例?如果是的话,请针对一般问题来编写程序。当然,这么做的时候,无论是在程序的设计或编写上,都应该遵循前面所提到的几项原则。


二、Shell脚本入门

当需要计算机帮你做什么时,最好用对工具。

Shell 脚本最常用于系统管理工作,或是用于结合现有的程序以完成小型的、特定的工作。一且你找出完成工作的方法,可以把用到的命令串在一起,放进一个独立的程序或脚本(script)里,此后只要直接执行该程序便能完成工作。此外,如果你写的程序很有用,其他人可以利用该程序当作一个黑盒(black box)来使用,它是一个可以完成工作的程序,但我们不必知道它是如何完成的。

脚本编程语言与编译型语言的差异
  • 编译型语言的好处是高效,缺点则是:它们多半运作于底层,所处理的是字节、整数、 浮点数或是其他机器层级的对象。例如,在C++里,就很难进行“将一个目录里所有的文件复制到另一个目录中”之类的简单操作。

  • 脚本编程语言通常是解释型 (interpreted) 的。这类程序的执行,是由解释器 (interpreter) 读入程序代码,并将其转换成内部的形式,再执行。请注意,解释器本身是一般的编译型程序。

为什么要使用Shell脚本?

使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象。缺点是:它们的效率通常不如编译型语言。

Shell脚本语言的特点:

  • 简单性:Shell 是一个高级语言,通过它,你可以简洁地表达复杂的操作。

  • 可移植性:使用 POSIX 所定义的功能,可以做到脚本无须修改就可在不同的系统上执行。

  • 开发容易:可以在短时间内完成一个功能强大又好用的脚本。


一个简单的脚本

  1. 想知道系统上有多少人登陆?who命令。

  1. 如何计算用户个数?可以利用 wc(字数计算)程序,它可以算出行数(line)、字数(word)与字符数 (character)。

  1. 两程序之间使用管道符号 | 建立管道,who的输出成了wc的输入。

  1. 如何将此管道转为一个独立的命令?方法是把这条命令输入到一个一般的文件中, 然后使用 chmod为该文件设置执行的权限。


脚本中位于第一行的 #!

一个系统上可能有多个Shell,第一行的#!就是告诉内核以哪个Shell来执行所指定的脚本

Example

我们的nusers脚本第一行有 #! /bin/sh -f, 指定内核使用/bin/sh Shell来执行该脚本。

当执行该nusers脚本时,实际等价于 /bin/sh -f 脚本文件路径。


Shell的基本元素

命令与参数
  • 格式:

  • 以空白(Space 键或 Tab 键)隔开命令行中各个组成部分;

  • 命令名称是命令行的第一个项目。通常后面会跟着选项(option),任何额外的参数(argument)都会放在选项之后

  • 选项的开头是一个破折号(或减号),后面接着一个字母。选项可有可无,选项可能需要参数,不需要参数的选项可以合并。

  • 长选项以一个破折号还是两个,视程序而定。

  • 分号( ; )可用来分隔同一行里的多条命令,Shell会依次执行这些命令。

  • 使用 &符号而不是分号,则 Shell 将在后台执行其前面的命令,这意味着, Shell 不用等到该命令完成,就可以继续执行下一个命令。

  • Shell识别三种基本命令:内建命令、Shell函数、外部命令。


变量
  • Shell变量名称的开头是一个字母或下划线符号,后面可以接着任意长度的字母、数字或下划线符号。

  • 变量名称的字符长度无限制。Shell变量可用来保存字符串值,所能保存的字符数同样没有限制。

  • 变量赋值方式

  • 变量名称=新值

  • 中间无空格。

  • 当所赋的新值包含空格时,请加引号。

  • 取变量值方式

  • $变量名称

Example

‘=’ 两边无空格

当所赋的新值包含空格时,加引号

取一个变量的值为另一个变量赋值

将几个变量连起来,需要使用引号


简单的echo输出

echo的转义序列

将参数打印到标准输出


华丽的Printf输出
  • 类比c语言printf(),几乎实现了c语言中printf()所有功能。

  • 不像echo会自动提供换行符号。

  • 语法格式:

  • 第一部分是一个字符串,包含按字面显示的字符和格式声明(特殊的占位符)。

  • 格式声明:%指示符。

  • 第二部分是与格式声明相对应的参数列表,按顺序匹配。

Example
基本I/O重定向
  • 程序应该有数据的来源端、数据的目的端(数据要去的地方)以及报告问题的地方,它们分别被称为标准输入 (standard input)、标谁输出(standard output)以及标准错误输出(standard error)。

  • 默认的标准输入、标准输出以及标谁错误输出都是终端,I/O 重定向就是你通过与终端交互,或是在Shell 脚本里设置,重新安排从哪里输入或输出到哪里。

重定向与管道
  • 以 < 改变标准输入

  • 以 > 改变标准输出

tr命令先将demo1.txt中匹配到‘1’的字符删掉,再将转换后的数据输出到demo2.txt,原始数据不更改,若存在demo2.txt,则覆盖;否则,创建。

  • 以 >> 附加到文件中

  • 以 | 建立管道


特殊文件:/dev/null 与/dev/tty
  • 第一个文件 / dev /nul1,就是大家所熟知的位桶(bit bucket)。传送到此文件的数据都会被系统丢掉。读取/dev/null 则会立即返回EOF。

  • 第二个文件/dev/tty,当程序打开此文件时,UNIX会自动将它重定同到一个终端【一个实体的控制台(console)或串行端口 (serial port) ,也可能是一个通过网络与窗口登录的伪终端(pseudoterminal)】再与程序结合。这在程序必须读取人工输入时(例如密码)特别有用。

Example

基本命令查找
  • Shell会沿着查找路径$PATE来寻找命令。$PATE是一个以冒号分隔的目录列表,你可以在列表所指定的目录下找到所要执行的命令。

  • $PATH里的空项目表示当前目录。

  • bin目录保存可执行文件,编写脚本,最好准备自己的bin目录来存放他们,并且让Shell能够自动找到它们。

将前文提到的nusers脚本放入Shell能自动找到的bin目录

  • 要让修改永久生效,在.profile文件中将bin目录加入$PATH,每次登陆,Shell都会读取.profile文件。


访问Shell脚本参数

  • 位置参数(positional parameters)指的是Shell脚本的命令行参数。

  • 在 Shell 函数里,它们同时也可以是函数的参数。各参数都由整数来命名,当超过9时,应该用大括号框起来。

写一个查询指定用户是否登陆的脚本,其接收一个参数,该参数表示想要查询的用户名,示例中的参数为root


简单的执行跟踪

  • 当执行一个脚本时,想知道程序在做什么?打开执行跟踪功能。这会使Shell显示每个被执行到的命令,并在前面加上‘+’:加号后面跟着一个空格。

  • 开启执行跟踪功能的两种方式:

方式1,在脚本命令前加sh -x,表示开启执行跟踪功能

方式2,脚本文件中添加set -x命令,该命令表示开启执行追踪功能。同理可以添加set +x命令来关闭执行追踪功能

国际化与本地化

  • 对用户而言,用来控制让哪种语言或文化环境生效的功能叫做:locale。

  • 可通过设置Locale环境变量的值来指定。

可通过locale -a命令来查看本系统支持的locale

  • 查询特定locale变量相关细节的方法: 为执行环境指定locale(放在命令前面)并以-ck选项与一个 LC_xxx 变量来执行 locale命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值