bash基本语法
时间:2010-04-13 来源:litandy
| 管道,将左侧命令的输出作为右侧命令的输入,可以连接很多的命令,各个命令以子进程的方式运行.
> 重定向符,将左侧的输出重定向到右侧.
< 重定向符,将右侧的输入重定向到左侧.
>> 将左侧输出追加到右侧.
$(...) 以子进程的形式运行符号里面的命令.
`...` 在命令中是使用,被引起来的命令的输出将显示在当前位置.但是建议使用$(),因为如在内部要用到`的时候需要用\来转义,看起来很费劲.
0,1,2 分别代表标准输入,标准输出,标准出错输出.
2>&1 将标准出错输出输入到标准输出中.
/dev/null 回收站,可以将输出重定向到这里,会不显示.相当于删除.
"..." 如果双引号里面有$引用的变量,会用变量的内容替换该变量的引用.
'...' 将里面的内容原封不动的输出,如果单引号里面有$引用的变量,不会用变量的内容来替换该引用.
\ 转义符,对特殊符号不做解释.
$(()) 将双括号内的表达式当成是算术表达式,如果不用这样括起来,将看成普通的表达式,普通表达式在没有$的情况下将看成字符串表达式,如果有$,会解释$后面的东西替换当前的$和后面的东西. 定义变量的时候不用使用$符号,在引用变量的时候需要使用$符号,定义的变量只在当前的脚本有效.
一些系统预定义的变量
$HOME 登录用户的主目录
$PS1 命令行提示符,一般是: [\u@\h\W]$
$PS2 二级命令行提示符,一般是:>
$IFS 参数分割符,一般是空格
$# 参数的个数
$* 所有的参数,用$IFS来分割
$@ 所有的参数,直接用空格来分割
$0,$1,... 类似C语言main函数的参数argv[0],argv[1],...
$$ 执行shell脚本的进程号 if语句
if [...]; then
...
elif [...]; then
...
else
..
fi test命令:可以用[来代替,参数可是:
文件比较:d,f;g,u;r,w,x;s
字符串比较n,z;=,!=
算术比较:eq,ne,gt,ge,lt,le
逻辑比较:!
循环语句:
for var in exp
do
...
done while [...]
do
...
done until [...]
do
...
done 选择结构
case ... in ...
xx1 )
...
...;;
xx2 | xx3 )
...
...;;
...
esac &&连接语句块,当前面的执行返回错误的时候停止
||连接语句块,当前面的执行正确的时候停止
可以将要执行的语句放到一个语句块{}中,可以通过&&,||来连接起来执行. 函数的定义
foo(){
...
}
调用的时候只写函数名,函数内部可以定义局部变量,关键字是local,局部变量的作用范围和C语言是一样的. 点命令,是在当前的shell环境下执行脚本,对变量的修改在当前的脚本环境下有效,如果不用点命令执行脚本,则创建一个新的shell环境执行脚本,对当前的环境没有任何影响,比如你执行的脚本是改变当前的节点,但是如果不用点命令执行该脚本,则在脚本执行完成后不会切换节点.
如果只是想在子shell中使用变量,则也可以将该变量导出,通过export命令. eval命令会把后面的文本当成命令来解释执行. 定义的变量只在当前的shell环境是有效的,若要在子shell中有效就需要用export命令导出. exec命令是执行后面的命令,但是,在执行后面的命令之前,退出当前shell.该命令也可以重定向文件描述符.
比如exec 3< afile
是将文件描述符3对应到afile文件上. expr命令将后面的命令当成表达式来求值,表达式可以通过|,&来连接,这个跟连接语句块的||,&&是一个意思,也可以通过=,>,>=,<,<=,!=,+,-,*,/,%来连接表达式,这些跟C语言的语法是一样的.但是一般都用$(())来代替 set可以修改当前脚本的参数列表(注意不是变量).unset是删除该脚本定义的变量和函数.但是不能删除shell本身定义的只读变量. shift命令就是将$2变成$1,$3变成$2,...,$0不变,影响$*,$@,$# trap命令就是设置消息钩子
trap 命令 消息号
消息有:
HUP(1) 通常是终端掉线,或是用户退出.
INT(2) 中断,通常是按下ctrl+c
QUIT(3) 退出,通常是按下ctrl+\
ABRT(6) 中止,通常是严重错误
ALRM(14) 报警,通常是超时
TERM(15) 终止,通常是系统关机 find命令:
find [path] [options] [tests] [actions]
options比较有用是:
-maxdephs n 最多搜索n层
-mount 不搜索其他文件系统.
-follow 跟随符号连接 tests比较常用的是:
-name pattern 文件名的模式,不能包含路径名
-atime n 在n天前访问过
-mtime n 在n天前修改过
-type d/f 找的文件类型是文件夹(d),还是文件(f)
-user name 找拥有者的文件
-newer name 找比该文件更新的文件 tests部分也可以连接:是逻辑连接
-o -a !等都是连接符.
等价的连接符是-or -and -not
测试部分可以括起来,用\(...\)来括起来. actions比较常用的是:
-exec command 执行命令
-ok command 执行命令,需要用户确认
-print 输出文件名 grep命令:
grep options pattern files
options比较常用是:
-c 输出匹配的行
-i 忽略大小写
-l 列出匹配行是文件名,而不显示匹配行
-v 不匹配时候显示匹配行 正则表达式:
^ 行首
$ 行尾
. 任意一个字符
? 没有或一个字符
* 没有或多个字符
+ 一个或多个字符
{n} 必须匹配n次
{n,} 必须匹配n次或n次以上
{n,m} 匹配次数在n次到m次之间,包括n,m
[] 在中括号里面的字符可以匹配任意一个
- 在两个字符之间的所有字符,闭区间 [:alnum:] 数字或字母
[:alpha:] 字母
[:blank:] 空格或制表符
[:lower:] 小写字母
[:upper:] 大写字母
[:digit:] 数字
[:punct:] 标点
[:space:] 空白字符或垂直制表符
[:xdigit:] 十六进制符 shell中的${...},是字符串替换,替换大括号中包起来的字符串
${param:-default} 如果param为空,则用default的值来代替
${#param} 取得param的长度
${param%word} 删除开头的字符,最小删除
${param%%word} 删除开头的字符,最大删除
${param#word} 删除结尾的字符,最小删除
${param##word} 删除结尾的字符,最大删除
${param:=bar} 在param不存在或是为空的时候返回bar,否则输出param值.好象跟${param:-bar}一样
${param:?bar} 在param不存在或是为空的时候返回bar,否则报错
${param:+bar} 在param不存在或是为空的时候返回空,否则输出bar
相关阅读 更多 +