Shell编程
来自软件实验室
shell概述
shell是一种高级程序设计语言
shell的特点
- 组合命令成为心的命令
- 允许灵活使用数据流,提供通配符、输入输出重定向、管道等机制
- 结构化程序设计
- 提供可配置的环境
shell的主要版本
csh/ksh/bash/ash/zsh,主流:bash
基本的bash shell脚本示例
#!/bin/bash # very simple bash script date pwd cd
shell脚本的文件扩展名通常为.sh,并具有可执行权限。
其中#!/bin/bash是必须的,表示调用/bin/bash解释下面的shell命令。
其中#开头的行为注释
shell脚本的执行
- sh ./test.sh
- chmod +x ./test.sh; ./test.sh
shell中的特殊字符
通配符
- *,圆点和路径符号必须显式匹配
- ?
- [字符组],比如f[abcd]匹配fa,fb,fc,fd,f[a-d],f[1-9]
- !,比如f[!1-9]
模式表达式
可以包含多个通配符,并支持扩展模式匹配:
- *(模式表),比如file*(.c|.o)匹配file,file.c,file.c.c,file.c.o,file.o.c,file.o.o等,不匹配file.h
- +(模式表),比如file+(.c|.o)匹配file.c,file.o,file.c.o,file.c.c等,但是不匹配file
- ?(模式表),file?(.c|.o)匹配file,file.c,file.o,不匹配file.c.o
- @(模式表),file@(.c|.o)匹配file.c,file.o,不匹配file,file.c.c等
- !(模式表),file!(.c|.o)匹配file,file.a,不匹配file.c,file.o
引号
双引号
由双引号括起来的字符均作为普通字符对待,$,`,\三个字符除外:
- $表示变量替换
- `表示命令替换
- \表示转义字符,通常用于显示特殊字符$\."'等,比如:echo "filename is \"$HOME\"\$*"的结果是:filename is "/home/subaochen"$*
需要注意的是:双引号中的单引号是普通字符。
例子:
echo "current directory is `pwd`" echo "home directory is $HOME" echo "file*.?" echo "directory '$HOME'"
单引号
单引号括起来的字符都是普通字符,不进行变量替换和命令替换,比如:
echo 'home directory is $HOME'
并不进行变量替换。同理也适应于命令替换。
倒引号
命令替换,比如:
echo `pwd` echo `date`
输入输出重定向符
执行一个shell命令时,自动打开三个标准设备文件:标准输入stdin、标准输出stdout、标注出错stderr
输入重定向符<
把标准输入设备重新定向到文件,标准用法:
[n]<file
即,将文件描述字为n的设备重定向到file,如果n省略则默认为标准输入设备(n=0)。
输出重定向符>
把脚本或者程序的执行结果写入指定的文件(重定向到文件):
[n]>file
即,将文件描述字为n的设备重定向到file。如果n省略则为标准输出设备(n=1)
例如:
$ who > who.txt $ cat who.txt
输出附加重定向>>
把命令的输出结果追加到指定文件的末尾