脚本编程语言与编译型语言的差异
- 编译型编程语言从源代码转换为目标代码后就可以在机器上执行
优点:高效
缺点:运作于底层,主要处理字节,整数,浮点数,其他及其层级的对象 - 脚本编程语言:由解释器读入程序代码,并将其转换为内部的形式再执行,解释器一般为编译型程序
优点:轻易处理文本与目录之类的对象
缺点:效率不如编译型语言 - 常用脚本语言:awk, Perl, Python, Ruby, Shell
为什么要使用Shell
简单,可移植性,开发容易
命令初探
- who 当前系统登陆用户
- who | wc -1 计算用户个数
- chmod 为文件设置执行权限
- cat filename 打印文件内容
管道 |
| 可以在两个程序间建立管道,前者输出作为后者的输入
位于第一行的 #!
- Shell脚本执行流程:
- 要求UNIX内核启动新的进程
- 内核识别Shell不是编译程序,返回错误(不是可执行的格式文件)
- Shell收到错误信息,启动新的/bin/sh(标准Shell)副本执行该程序
- 为什么要有#!
Unix系统通常存在多个shell,因此需要告知内核应该以哪个Shell来执行指定的Shell脚本
当文件开头是#!时,内核会扫描该行的其余部分,看是否存在可用于执行程序的解释器的完整路径
shell脚本通常是 #! /bin/sh - [- 表示没有shell选项,避免欺骗式攻击]
Shell脚本的基本元素
- 命令与参数
- ; 分号分隔同一行多个命令,Shell会依次执行这些命令
- & Shell将在后台执行前面的程序
- 基本命令分为三种:内建命令,Shell函数,外部命令
- 变量
- 变量以字母或下划线开头
- 变量赋值:变量名称=变量值 【不能有空格】
- 变量取值:$变量名称 【变量值有空格式,请加上引号】
- 将变量值连起来需要引号"$a $b $c"
- echo输出
- 参数之间以空格隔开
- POSIX标准中目前没有规范echo的参数,通常处理简单输出
- printf输出
printf format-string [arguments …]
printf “here is %s \n” world - 基本的I/O重定向
程序应该有数据的来源端,数据的目的端,报告问题的地方
用户登录时,UNIX将默认的标准输入,输出,错误输出安排成你的终端
I/O重定向就是你通过与终端交互,或在shell脚本中设置输入输出到哪里- 重定向与管道
< filename 将左侧标准输入改为指定的file
> filename 将左侧标准输出改为指定的file
>> filename 将标准输出附加到file结尾
| 将左侧标准输出改为右侧的标准输入
【管道可以使执行速度比用临时文件快十倍】 - tr 转换字符
- 特殊文件:
/dev/null 传输到此文件的数据会被系统丢掉
读取该文件会立即返回文件结束符号(end-of-file)
/dev/tty 当程序打开此文件时,UNIX会自动重定向到终端
- 重定向与管道
- 基本命令查找
echo $PATH
Shell脚本参数
- 参数形式
- 参数以$1, $2, $3, … $9, ${10}, …
- 参数都以整数命名
- 超过9要用{}括起来
执行跟踪
- set -x 在脚本中打开执行跟踪功能
- set +x 在脚本中关闭执行跟踪功能
- sh -x 文件名称 执行跟踪运行某脚本