摘要:第一章介绍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. div+css 布局经验 - 最简单的 = 最不变形的(原创技巧)

    站酷几年了 一直饱受其恩泽 尤为感激 一直想奉献些什么 但是苦于水平 苦于奔波 今天静下心来 为大家奉献下 自己的div+css 经验 ,以下观点只代表 深海个人立场 希望为初学者提供一条" ...

  2. codevs 2059 逃出克隆岛

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description oi小组的yh酷爱玩魔兽rpg,每天都会在u9搜索最新的rpg地图. 今天,他 ...

  3. [习题]输入自己的生日(年/月/日)#2 -- 日历(Calendar)控件的时光跳跃,一次跳回五年、十年前?--TodaysDate属性、VisibleDate属性

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/10/calendar_visibledate_birthday_dropdow ...

  4. SAP云平台,区块链,超级账本和智能合约

    前一篇文章<Hyperledger Fabric on SAP Cloud Platform>,我的同事Aviva已经给大家介绍了基于区块链技术的超级账本(Hyperledger)的一些概 ...

  5. bootstrap历练实例: 基本胶囊式的导航菜单

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  6. Bootstrap历练实例:表单控件状态(焦点)

    输入框焦点 当输入框 input 接收到 :focus 时,输入框的轮廓会被移除,同时应用 box-shadow. <!DOCTYPE html><html><head& ...

  7. Apache Commons Configuration的应用

    Apache Commons Configuration的应用 Commons Configuration是一个java应用程序的配置管理工具.可以从properties或者xml文件中加载软件的配置 ...

  8. 通过工厂模式批量创建对象后调用其中方法 出现XXXis not a function()问题原因

    //通过工厂模式批量创建 function Computer(color,weight,logo){         var obj=new Object();         obj.color=c ...

  9. mysqldump导出备份数据库报Table ‘performance_schema.session_variables‘ doesn‘t exist

    今天在bash进行本地数据库往云端数据库导数据的时候,在本地导出.sql文件这第一步就出现了错误问题,导出sql文件的命令: mysqldump -u 用户名 -p 数据库名 > xxx.sql ...

  10. Python自动化测试框架——数据驱动(从代码中读取)

    今天小编要介绍的是数据驱动最简单和最常用的一种方法,由于只是介绍方法,代码操作后的美观程度略有缺陷,介意者可以自行改动 还是以163邮箱登录为例: 设计一个存放数据的类,这个类的参数是我们需要修改的数 ...