每天进步一点点
全部博文(137)
分类:
2005-06-09 15:22:46
Shell历史
Bourne shell (sh)
C shell (csh)
Korn shell (ksh)
三种shell 都有它们的优点和缺点
Bourne Again shell (bash), 正如它的名字所暗示的,是 Bourne shell 的扩展。BASH 与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。BASH 也包含了很多 csh 和 Korn Shell 里的优点,使得 BASH 有很灵活和强大的编程接口,同时又有很友好的用户界面。为什么要用 BASH 来代替 sh 呢?Bourne Shell 最大的缺点在于它处理用户的输入方面,在 Bourne shell 里键入命令会很麻烦,尤其当你键入很多相似的命令时,而 BASH 准备了几种特性使命令的输入变得更容易。 BASH 的新功能包括 命令补齐、通配符、命令历史记录、别名等。
bash 是为互动用户提供的默认shell
一、bash 语法
1 变量
Bourne Shell有如下四种变量:
.用户自定义变量
.位置变量即 shell script之参数
.预定义变量(特殊变量)
.环境变量(参考shell定制部分)
(1)用户自定义变量
a="hello world"
echo $a
num=2
echo "this is the $nd"
这将打印: this is the 2nd
使用unset命令删除变量的赋值
$ Z=hello
$ echo $Z
hello
$ unset Z
备注:单引号和双引号的区别
(2)位置变量
(3)特殊变量及保留符
保留字符及其含义
$ shell变量名的开始,如$var
| 管道,将标准输出转到下一个命令的标准输入
# 注释开始
& 在后台执行一个进程
? 匹配一个字符
* 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)
$- 使用set及执行时传递给shell的标志位
$! 最后一个子进程的进程号
$# 传递给shell script的参数个数
$* 传递给shell script的参数
$@ 所有参数,个别的用双引号括起来
$? 上一个命令的返回代码
当前shell的名字
$n (n:1-) 位置参数
$$ 进程标识号(Process Identifier Number, PID)
> file 输出重定向
`command` 命令替换,如 filename=`basename /usr/local/bin/tcsh`
>>file 输出重定向,append
2 流程控制
1) if
"if" 表达式 如果条件为真则执行then后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
if通常和test配合使用 形如:
if[ expr ]; then
....
fi
shell程序中的test命令
(1)字符串操作符 用于计算字符串表达式
test命令 | 含义
-----------------------------------------
Str1 = str2 | 当str1与str2相同时,返回True
Str1! = str2| 当str1与str2不同时,返回True
Str | 当str不是空字符时,返回True
-n str | 当str的长度大于0时,返回True
-z str | 当str的长度是0时,返回True
-----------------------------------------
(2)整数操作符具有和字符操作符类似的功能.只是他们的操作是针对整数
test表达式 | 含义
---------------------------------------------
Int1 -eq int2|当int1等于int2时,返回True
Int1 -ge int2|当int1大于/等于int2时,返回True
Int1 -le int2|当int1小于/等于int2时,返回True
Int1 -gt int2|当int1大于int2时,返回True
Int1 -ne int2|当int1不等于int2时,返回True
-----------------------------------------
(3)用于文件操作的操作符,他们能检查:文件是否存在,文件类型等
test表达式 | 含义
------------------------------------------------
-d file |当file是一个目录时,返回 True
-f file |当file是一个普通文件时,返回 True
-r file |当file是一个刻读文件时,返回 True
-s file |当file文件长度大于0时,返回 True
-w file |当file是一个可写文件时,返回 True
-x file |当file是一个可执行文件时,返回 True
------------------------------------------------
(4)shell的逻辑操作符用于修饰/连接包含整数,字符串,文件操作符的表达式
test表达式 | 含义
----------------------------------------------------------
! expr |当expr的值是False时,返回True
Expr1 -a expr2|当expr1,expr2值同为True时,返回True
Expr1 -o expr2|当expr1,expr2的值至少有一个为True时,返回True
-----------------------------------------------------------
注意:
tcsh shell 不使用test命令,但是tcsh中的表达式同样能承担相同的功能.tcsh
支持的表达式于C中的表达式相同.通常使用在if和while命令中.
tcsh表达式 | 含义
-------------------------------------------------------
Int1 <= int2 |当int1小于/等于int2时,返回True
Int1 >= int2 |当int1大于/等于int2时,返回True
Int1 < int2 |当int1小于int2时,返回True
Int1 > int2 |当int1大于int2时,返回True
Str1 == str2 |当str1与str2相同时,返回True
Str1 != str2 |当str1与str2不同时,返回True
-r file |当file是一个可读文件时,返回True
-w file |当file是一个可写文件时,返回True
-x file |当file是一个可执行文件时,返回True
-e file |当file存在时,返回True
-o file |当file文件的所有者是当前用户时,返回True
-z file |当file长度为0时,返回True
-f file |当file是一个普通文件时,返回True
-d file |当file是一个目录时,返回True
Exp1 || exp2 |当exp1和exp2的值至少一个为True时,返回True
Exp1 && exp2 |当exp1和exp2的值同为True时,返回True
! exp |当exp的值为False时,返回True
-------------------------------------------------------
2) for
#!/usr/bin/env bash
for myfile in /etc/r*
do
if [ -d "$myfile" ]
then
echo "$myfile (dir)"
else
echo "$myfile"
fi
done
输出:
/etc/rc.d (dir)
/etc/resolv.conf
/etc/resolv.conf~
/etc/rpc
3) while
例一 : 无限回圈写法
#!/bin/sh
while : ; do
echo "do something forever here"
sleep 5
done
例二 : 强迫把pppd杀掉。
#!/bin/sh
while [ -f /var/run/ppp0.pid ] ; do
killall pppd
done
4)select
下面是一个例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是该脚本运行的结果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
5)case
file lf.gz
这将返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
#!/bin/sh
ftype=`file ""`
case "$ftype" in
": Zip archive"*)
unzip "" ;;
": gzip compressed"*)
gunzip "" ;;
": bzip2 compressed"*)
bunzip2 "" ;;
*) error "File can not be uncompressed with smartzip";;
esac
您可能注意到我们在这里使用了一个特殊的变量。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:
smartzip articles.zip
就是字符串 articles.zip
二 Bash 进阶应用