bash编程资料
上一篇 / 下一篇 2009-01-20 09:51:42 / 个人分类:linux应用
找到一份不错的bash编程资料,顺便在此记录一下:
Bash 编程
一.Bash特殊字符
1.通配符:
*:匹配任何字符串
?:匹配任何单个字符
集合运算符:用一些单个字、一个连续范围或断续的字符集合作为通配符
[set]:用字符集合作通配符匹配单个字符,如:[aeiou],[a-o],[a-h, w-z]
[!set]:除了集合外的所有字符组成的集合作通配符
2.花括号展开式(可以嵌套):
格式:[前导字符串]{字符串1[{嵌套字符串1…}] [, 字符传2…]}[后继字符串]
如:c{a{r, t, n}, b{r, t, n}}s 就等于 cars cats cans cbrs cbts cbns
3.其它特殊字符:
<:输入重定向
>:输出重定向(没有文件则创建,有则覆盖)
>>:输出重定向(没有则创建,有则追加到文件尾部)
(:子shell开始,子shell继承父shell部分环境变量
):子shell结束
{:命令块开始,由当前shell执行,保留所有环境变量
}:命令块结束
|:管道
\:引用后面的单个字符
‘:强引用字符串,不解释特殊字符
“:弱引用字符串,解释所有特殊字符
~:根目录
`:命令替换
;:命令分隔符(命令终止符),运行在一行里执行多条命令
#:行注释
$:变量表达式
&:在后台执行命令
*:字符串通配符
?:单个字符通配符
二.Bash变量
1.自定义变量
用户自定义的变量由字母、数字和下划线组成,并且变量名的第一个字符不能为数字,且变量名大小写敏感。
varname=value注意bash不能在等号两侧留空格
shell语言是非类型的解释型语言,给一个变量赋值实际上就是定义了变量,而且可以赋不同类型的值。引用变量有两种方式,$varname和${varname},为防止变量在字符串中产生歧义建议使用第二种方式,引用未定义的变量其值为空。
为一个变量赋值一个串,需要用到引号,注意`、’、”的不同,``相当于$()
为了使变量可以在其它进程中使用,需要将变量导出:export varname
2.环境变量
可以用set命令给变量赋值或查看环境变量值,使用unset命令清除变量值,使用export导出变量将可以使其它进程访问到该环境变量。
3.位置变量
位 置变量对应于命令行参数,其中$0为脚本名称,$1为第一个参数,依次类推,参数超过9个必须使用${}引用变量。shell保留这些变量,不允许用户以 另外的方式定义它们,传给脚本或函数的位置变量是局部和只读的,而其余变量为全局的(可以用local关键字声明为局部)。
4.其它变量
$?:保存前一个命令的返回码
$-:在Shell启动或使用set命令时提供选项
$$:当前shell的进程号
$!:上一个子进程的进程号
$#:传给脚本或函数的参数个数,即位置变量数减1,不含脚本名称。
$*:传给脚本或函数的参数组成的单个字符串,即除脚本名称后从第一个参数开始的字符串,每个参数以$IFS分隔(一般内部域分隔符$IFS为1空格)。形同”…”
$@:传给脚本或函数的参数列表,这些参数被表示为多个字符串。形同”” “” “”…。$*和$@之间的不同方便使用两种方法处理命令行参数,但是在打印时参数外观没有区别。
如:#vi posparm.sh
function cutparm
{echo –e “inside cntparm: $# parms: $*\n”}
cntparm “$*”
cntparm “$@”
#./posparm.sh abc bca cab
inside cntparm: 1 parms: abc bca cab
inside cntparm: 3 parms: abc bca cab
三.Bash操作符
1.字符串操作符(替换操作符)
${var:-word}如果var存在且不为空,返回它的值,否则返回word
${var:=word}如果var存在且不为空,返回它的值,否则将word赋给var,返回它的值
${var:+word}如果var存在且不为空,返回word,否则返回空
${var:?message}如果var存在且不为空,返回它的值,
否则显示“bash2:$var:$message”,然后退出当前命令或脚本
${var:offset[:length]}从offset位置开始返回var的一个长为length的子串,
若没有length,则默认到var串末尾
2.模式匹配操作符
${var#pattern}从var头部开始,删除和pattern匹配的最短模式串,然后返回剩余串
${var##pattern}从var头部开始,删除和pattern匹配的最长模式串,然后返回剩余串,basename path=${path##*/}
${var%pattern}从var尾部开始,删除和pattern匹配的最短模式串,然后返回剩余串,dirname path=${path%/*}
${var%%pattern}从var尾部开始,删除和pattern匹配的最长模式串,然后返回剩余串
${var/pattern/string}用string替换var中和pattern匹配的最长模式串
四.Shell中条件和test命令
Bash可以使用[ … ]结构或test命令测试复杂条件
格式:[ expression ]或test expression
返回一个代码,表明条件为真还是为假,返回0为真,否则为假。
注:左括号后和右括号前空格是必须的语法要求
1.文件测试操作符
-d filefile存在并且是一个目录
-e filefile存在
-f filefile存在并且是一个普通文件
-g filefile存在并且是SGID(设置组ID)文件
-r file对file有读权限
-s filefile存在并且不为空
-u filefile存在并且是SUID(设置用户ID)文件
-w file对file有写权限
-x file对file有执行权限,如果是目录则有查找权限
-O file拥有file
-G file测试是否是file所属组的一个成员
-L filefile为符号链接
file1 –nt file2file1比file2新
file1 –ot file2file1比file2旧
2.字符串操作符
str1=str2str1和str2匹配
str1!=str2str1和str2不匹配
str1<str2str1小于str2
str1>str2str1大于str2
-n strstr的长度大于0(不为空)
-z strstr的长度为0(空串)
3.整数操作符
var1 –eq var2var1等于var2
var1 –ne var2var1不等于var2
var1 –ge var2var1大于等于var2
var1 –gt var2var1大于var2
var1 –le var2var1小于等于var2
var1 –lt var2var1小于var2
4.逻辑操作符
!expr对expr求反
expr1 && expr2对expr1与expr2求逻辑与,当expr1为假时不再执行expr2
expr1 || expr2对expr1与expr2求逻辑或,当expr1为真时不再执行expr2
注:另一种逻辑操作符逻辑与expr1 –a expr2逻辑或expr1 –o expr2
五.Shell流控制
1.条件语句:if
if 条件IFS=:
thenfor dir in $PATH
语句do
[elif 条件if [ -O dir ]; then
语句]echo –e “\tYou own $dir”
[elseelse
语句]echo –e “\tYou don’t own $dir”
fifi
2.确定性循环:fordone
for value in listfor docfile in /etc/* /usr/etc/*
dodo
statements using $valuecp $docfile ${docfile%.doc}.txt
donedone
注:for var;…相当于for var in “$@”;…
3.不确定性循环:while和until
while 条件until 条件
dodo
语句语句
donedone
count=1count=1
while [ -n “$*” ]until [ -z “$*” ]
dodo
echo "parameter $count"echo "parameter $count"
shiftshift
count='expr $count + 1'count='expr $count + 1'
donedone
条件为真执行循环体条件为假执行循环体
注:整数变量
Bash 编程
一.Bash特殊字符
1.通配符:
*:匹配任何字符串
?:匹配任何单个字符
集合运算符:用一些单个字、一个连续范围或断续的字符集合作为通配符
[set]:用字符集合作通配符匹配单个字符,如:[aeiou],[a-o],[a-h, w-z]
[!set]:除了集合外的所有字符组成的集合作通配符
2.花括号展开式(可以嵌套):
格式:[前导字符串]{字符串1[{嵌套字符串1…}] [, 字符传2…]}[后继字符串]
如:c{a{r, t, n}, b{r, t, n}}s 就等于 cars cats cans cbrs cbts cbns
3.其它特殊字符:
<:输入重定向
>:输出重定向(没有文件则创建,有则覆盖)
>>:输出重定向(没有则创建,有则追加到文件尾部)
(:子shell开始,子shell继承父shell部分环境变量
):子shell结束
{:命令块开始,由当前shell执行,保留所有环境变量
}:命令块结束
|:管道
\:引用后面的单个字符
‘:强引用字符串,不解释特殊字符
“:弱引用字符串,解释所有特殊字符
~:根目录
`:命令替换
;:命令分隔符(命令终止符),运行在一行里执行多条命令
#:行注释
$:变量表达式
&:在后台执行命令
*:字符串通配符
?:单个字符通配符
二.Bash变量
1.自定义变量
用户自定义的变量由字母、数字和下划线组成,并且变量名的第一个字符不能为数字,且变量名大小写敏感。
varname=value注意bash不能在等号两侧留空格
shell语言是非类型的解释型语言,给一个变量赋值实际上就是定义了变量,而且可以赋不同类型的值。引用变量有两种方式,$varname和${varname},为防止变量在字符串中产生歧义建议使用第二种方式,引用未定义的变量其值为空。
为一个变量赋值一个串,需要用到引号,注意`、’、”的不同,``相当于$()
为了使变量可以在其它进程中使用,需要将变量导出:export varname
2.环境变量
可以用set命令给变量赋值或查看环境变量值,使用unset命令清除变量值,使用export导出变量将可以使其它进程访问到该环境变量。
3.位置变量
位 置变量对应于命令行参数,其中$0为脚本名称,$1为第一个参数,依次类推,参数超过9个必须使用${}引用变量。shell保留这些变量,不允许用户以 另外的方式定义它们,传给脚本或函数的位置变量是局部和只读的,而其余变量为全局的(可以用local关键字声明为局部)。
4.其它变量
$?:保存前一个命令的返回码
$-:在Shell启动或使用set命令时提供选项
$$:当前shell的进程号
$!:上一个子进程的进程号
$#:传给脚本或函数的参数个数,即位置变量数减1,不含脚本名称。
$*:传给脚本或函数的参数组成的单个字符串,即除脚本名称后从第一个参数开始的字符串,每个参数以$IFS分隔(一般内部域分隔符$IFS为1空格)。形同”…”
$@:传给脚本或函数的参数列表,这些参数被表示为多个字符串。形同”” “” “”…。$*和$@之间的不同方便使用两种方法处理命令行参数,但是在打印时参数外观没有区别。
如:#vi posparm.sh
function cutparm
{echo –e “inside cntparm: $# parms: $*\n”}
cntparm “$*”
cntparm “$@”
#./posparm.sh abc bca cab
inside cntparm: 1 parms: abc bca cab
inside cntparm: 3 parms: abc bca cab
三.Bash操作符
1.字符串操作符(替换操作符)
${var:-word}如果var存在且不为空,返回它的值,否则返回word
${var:=word}如果var存在且不为空,返回它的值,否则将word赋给var,返回它的值
${var:+word}如果var存在且不为空,返回word,否则返回空
${var:?message}如果var存在且不为空,返回它的值,
否则显示“bash2:$var:$message”,然后退出当前命令或脚本
${var:offset[:length]}从offset位置开始返回var的一个长为length的子串,
若没有length,则默认到var串末尾
2.模式匹配操作符
${var#pattern}从var头部开始,删除和pattern匹配的最短模式串,然后返回剩余串
${var##pattern}从var头部开始,删除和pattern匹配的最长模式串,然后返回剩余串,basename path=${path##*/}
${var%pattern}从var尾部开始,删除和pattern匹配的最短模式串,然后返回剩余串,dirname path=${path%/*}
${var%%pattern}从var尾部开始,删除和pattern匹配的最长模式串,然后返回剩余串
${var/pattern/string}用string替换var中和pattern匹配的最长模式串
四.Shell中条件和test命令
Bash可以使用[ … ]结构或test命令测试复杂条件
格式:[ expression ]或test expression
返回一个代码,表明条件为真还是为假,返回0为真,否则为假。
注:左括号后和右括号前空格是必须的语法要求
1.文件测试操作符
-d filefile存在并且是一个目录
-e filefile存在
-f filefile存在并且是一个普通文件
-g filefile存在并且是SGID(设置组ID)文件
-r file对file有读权限
-s filefile存在并且不为空
-u filefile存在并且是SUID(设置用户ID)文件
-w file对file有写权限
-x file对file有执行权限,如果是目录则有查找权限
-O file拥有file
-G file测试是否是file所属组的一个成员
-L filefile为符号链接
file1 –nt file2file1比file2新
file1 –ot file2file1比file2旧
2.字符串操作符
str1=str2str1和str2匹配
str1!=str2str1和str2不匹配
str1<str2str1小于str2
str1>str2str1大于str2
-n strstr的长度大于0(不为空)
-z strstr的长度为0(空串)
3.整数操作符
var1 –eq var2var1等于var2
var1 –ne var2var1不等于var2
var1 –ge var2var1大于等于var2
var1 –gt var2var1大于var2
var1 –le var2var1小于等于var2
var1 –lt var2var1小于var2
4.逻辑操作符
!expr对expr求反
expr1 && expr2对expr1与expr2求逻辑与,当expr1为假时不再执行expr2
expr1 || expr2对expr1与expr2求逻辑或,当expr1为真时不再执行expr2
注:另一种逻辑操作符逻辑与expr1 –a expr2逻辑或expr1 –o expr2
五.Shell流控制
1.条件语句:if
if 条件IFS=:
thenfor dir in $PATH
语句do
[elif 条件if [ -O dir ]; then
语句]echo –e “\tYou own $dir”
[elseelse
语句]echo –e “\tYou don’t own $dir”
fifi
2.确定性循环:fordone
for value in listfor docfile in /etc/* /usr/etc/*
dodo
statements using $valuecp $docfile ${docfile%.doc}.txt
donedone
注:for var;…相当于for var in “$@”;…
3.不确定性循环:while和until
while 条件until 条件
dodo
语句语句
donedone
count=1count=1
while [ -n “$*” ]until [ -z “$*” ]
dodo
echo "parameter $count"echo "parameter $count"
shiftshift
count='expr $count + 1'count='expr $count + 1'
donedone
条件为真执行循环体条件为假执行循环体
注:整数变量
相关阅读:
- 一个下载724本linux电子书的bash脚本 (c-aries, 2008-8-21)
- bash小技巧:历史 (blackspace, 2009-1-14)
TAG: bash
