摘要:第一章介绍unix系统的发展史及软件工具的设计原则。第二章介绍编译语言与脚本语言的区别以及两个相当简单但很实用的Shell脚本程序,涵盖范围包括了命令、选项、参数、Shell变量、echo与printf的输出、基本输入/输出重定向、命令查找、从脚本里访问参数以及执行跟踪等。

第一章 背景知识

概括:这一章介绍unix系统的发展史及软件工具的设计原则。

1.1  unix系统发展史

unix最初是由贝尔电话实验室的计算机科学研究中心开发的。第一版诞生于1970年。

1.2  软件工具设计原则

♦  一次做好一件事
♦  处理文本行,不要处理二进制数据
♦  使用正则表达式
♦  默认使用标准输入/输出
♦  避免喋喋不休
♦  输出格式必须与可接受的输入格式一致
♦  让工具去做困难的部分
♦  构建特定工具前,先想想

第二章 入门

概括:该章从编译语言与脚本语言间的取舍开始讨论,再介绍两个相当简单但很实用的Shell脚本程序,涵盖范围包括了命令、选项、参数、Shell变量、echo与printf的输出、基本输入/输出重定向、命令查找、从脚本里访问参数以及执行跟踪。最后则以国际化与本地化结束。

2.1  脚本编程语言与编译型语言的差异

编译型语言的好处是高效,缺点是多半运作于底层,脚本编程语言通常是解释型的,由解释器读入代码并转换成内部的形式,解释器本身是一般的编译型程序。

2.2  为什么要使用Shell脚本?

简单性:Shell是一个高级语言,通过它可以简洁地表达复杂的操作。
可移植性:使用POSIX所定义的功能,可以做到脚本无须修改就可以在不同的系统上执行。
开发容易:可以在短时间内完成一个功能强大又好用的脚本。

2.3  一个简单的脚本

查看系统有多少人登录:

$ cat > nusers                 #建立文件,使用cat复制终端的输入
who | wc -l #程序的内容
^D #Ctrl-D表示end-of-file
$chmod +x nusers #让文件拥有执行的权限
$./nusers #执行测试
2 #输出结果

2.4  自给自足的脚本:位于第一行的#!

当Shell执行一个程序时,会要求UNIX内核启动一个新的进程(process),以便在该进程里执行所指定的程序。内核知道如何为编译型程序做这件事,我们的nusers Shell脚本并非编译型程序;当Shell要求内核执行它时,内核将无法做这件事,并回应“not executable format file”(不是可执行的格式文件)错误信息。Shell收到此错误信息时,就会说“啊哈,这不是编译型程序,那么一定是Shell脚本”,接着会启动一个新的/bin/sh(标准Shell)副本来执行该程序。
       当一个文件的开头的两个字符是#!时,内核会扫描该行其余部分,看是否存在可用来执行程序的解释器的完整路径。

2.5  Shell的基本元素

(1)命令与参数
分号可用来分隔同一行里的多条命令。

(2)变量

$ myvar=this_is_a_long_string_that_does_not_mean_much       #分配变量值
$ echo $myvar #打印变量值

(3)简单的echo输出
 语法:  echo [string ...]
 用途:  产生Shell脚本的输出

(4)华丽的printf输出
 语法:  printf format-string [arguments...]
 说明:  第一部分是一个字符串,用来描述输出的排列方式,最好为此字符串加上引号。第二部分是与格式声明相对应的参数列表。

(5)基本的I/O重定向
  在登录系统时,UNIX便将默认的标准输入、输出及错误输出安排成你的终端。I/O重定向就是你通过与终端交互,或者是在Shell脚本里设置,重新安排从哪里输入或输出到哪里。

 ①重定向与管道

Shell提供了数种语法标记,可用来改变默认I/O的来源端与目的端。由浅入深如下:
  *以<改变标准输入
  program < file 可将program的标准输入修改为file: 
  tr -d '\r' < dos_file.txt
  *以>改变标准输出
  program > file 可将program的标准输出修改为file:
  tr -d '\r' < dos_file.txt > UNIX-file.txt
  这条命令会先以tr将将dos-file.txt里的ASCII carriage-return(回车)删除,再将转换完成的数据输出到UNIX-file.txt。dos-file.txt里的原始数据不会有变化。
  *以>>附加到文件
  program >> file 可将program的标准输出附加到file的结尾处
  *以|建立管道
  program1|program2 可将program1的标准输出修改为program2的标准输入
  虽然<与>可将输入与输出连接到文件,不过管道(pipeline)可以把两个以上执行中的程序衔接在一起。
  tr -d '\r' < dos-file.txt |sort > UNIX-file.txt
  这条管道会先删除文件内的回车字符,在完成数据的排序之后,将结果输出到目的文件。

②特殊文件:/dev/null与/dev/tty

UNIX系统提供了两个对Shell编程特别有用的特殊文件。第一个文件/dev/null,就是大家所熟知的位桶(bit bucket)。传送到此文件的数据都会被系统丢掉。另一个特殊文件为/dev/tty。当程序打开此文件时,UNIX会自动将它重定向到一个终端[一个实体的控制台(console)或串行端口(serial port)],也可能是一个通过网络与窗口登录的伪终端]再与程序结合。这在程序必须读取人工输入时(例如密码)特别有用。

printf "Enter new password:"      #提示输入
stty -echo #关闭自动打印输入字符的功能
read pass < /dev/tty #读取密码
printf "Enter again:" #提示再输入一次
read pass2 < /dev/tty #再读取一次以确认
stty echo #别忘了打开自动打印输入字符的功能
...

(6)基本的I/O重定向

Shell会沿着查找路径$PATH来寻找命令。$PATH是一个以冒号分隔的目录列表,可以在列表所指定的目录下找到所要执行的命令。如果你要编写自己的脚本,最好准备自己的bin目录来存放它们,并且让Shell能够自动找到他们,只要建立自己的bin目录,并将它加入$PATH中的列表即可。

2.6  访问Shell脚本的参数

所谓的位置参数指的也就是Shell脚本的命令行参数。当它超过9,就应该用大括号把数字框起来。
echo first arg is $1
echo tenth arg is ${10}
根据用户名查找用户是否登录:

 $cat > finduser            #建立新文件
#!/bin/sh
#finduser #查看第一个参数所指定的用户是否登录
who | grep $1
^D #以end-of-file结尾 $ chmod +x finduser #设置执行权限
$ ./finduser root #测试寻找root

2.7  简单的执行跟踪

在脚本里,用set -x命令将执行跟踪的功能打开,然后再用set +x命令关闭它。

2.8  国际化与本地化

当国际化作为设计软件的过程时,软件无须再修改或重新编译程序代码,就可以给特定的用户群使用。当本地化作为软件的过程时,目的是让特定的用户群得以使用软件。

 

Shell脚本学习指南 [ 第一、二章 ] 背景知识、入门的更多相关文章

  1. 笔记——shell脚本学习指南

    <shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超 ...

  2. 转 shell脚本学习指南

    shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...

  3. Shell脚本学习指南笔记

    Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...

  4. 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式

    正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...

  5. 《Shell脚本学习指南》书籍目录

    摘要:Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更 ...

  6. Shell脚本学习指南 [ 第三、四章 ] 查找与替换、文本处理工具

    摘要:第三章讨论的是编写Shell脚本时经常用到的两个基本操作.第四章总共介绍了约30种处理文本文件的好用工具. 第三章 查找与替换 概括:本章讨论的是编写Shell脚本时经常用到的两个基本操作:文本 ...

  7. 《Shell脚本学习指南》学习笔记之变量、判断和流程控制

    变量 定义变量 可以使用export和readonly来设置变量,export用于修改或打印环境变量,readonly则使得变量不得修改.语法: export name[=word] ... read ...

  8. 《shell脚本学习指南》学习笔记之入门

    为什么要使用shell脚本? shell脚本能够轻易处理文件与目录之类的对象,而且是各UNIX系统之间经过POSIX标准化的通用的功能,因此Shell脚本只要“用心写”一次,即可应用到很多系统上,因此 ...

  9. shell脚本学习指南-学习(1)

    1.先看下面这个命令: $who  | wc  -l  计算当前登陆的用户个数: $who   当前登陆的有哪些用户: pipeling(   |  )可以在两个程序之间建立管道,左侧的结果成为右侧的 ...

随机推荐

  1. MFC 消息中( WPARAM wParam,LPARAM lParam)包含信息

    windows的消息具有以下两个参数: (1)字参数(wParam) (2)长参数(lParam) 字参数和长参数都是32位整数,用于提供消息的附带消息,是消息传递过程中参数的载体.附加信息的消息号取 ...

  2. Android程序中使用iconfont心得

    1.关于iconfont iconfont既是icon又是font,具体来说应该是用font形式展现的icon.与传统图片格式的图标不同,这一种图标因为是以字体形式展现的,所以更改大小.颜色.背景颜色 ...

  3. 基于phpExcel写的excel类(导出为Excel)

    <?php /* * 类的功能 * 传入二位数组导出excel * 传入excel 导出二位数组 * @author mrwu */ require('PHPExcel.php'); requi ...

  4. show processlist使用介绍

    这个命令中最关键的就是state列,mysql列出的状态主要有以下几种: Checking table 正在检查数据表(这是自动的).Closing tables 正在将表中修改的数据刷新到磁盘中,同 ...

  5. 异步 Thread

    Threads 最早的版本,微软推荐不要再使用Thread了thread不支持带返回值的方法本身也没有线程回调,但是可以自己做一个 private void btnThreads_Click(obje ...

  6. openstack v3 rest 访问

    1. openstack主要面向得是python为主得开发.目前java中嵌入openstack主要是通过rest接口访问 2. 下载一个postman的接口测试工具 3. openstack 中的服 ...

  7. leetcode_1033. Moving Stones Until Consecutive

    https://leetcode.com/problems/moving-stones-until-consecutive/ 题意:给定3个点,每次从两个端点(位置最小或位置最大)中挑选一个点进行移动 ...

  8. java并发编程:Executor、Executors、ExecutorService

    1.Executor和ExecutorService Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable comma ...

  9. CAD交互绘制圆形批注(网页版)

    js中实现代码说明: 动态拖放时的绘制事件: function DoDynWorldDrawFun(dX,dY,pWorldDraw,pData) { //自定义实体的GUID标识符 var sGui ...

  10. scanf函数详解

    函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...