分类: LINUX
2011-04-13 15:01:46
#! 命令解释器 当然"#!"也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用 shell 内建的指令,如果在脚本的里边还有一个#!行,那么 bash 将把它
认为是一个一般的注释行。
# 注释,行首以#开头为注释(#!是个例外). 注释也可以存在于本行命令的后边.
注意:命令是不能跟在同一行上注释的后边的,没有办法,在同一行上,注释的后边想要再使用命令,只能另起一行.
当然,在 echo 命令中被转义的#是不能作为注释的. 同样的,#也可以出现在特定的参数替换结构中或者是数字常量表达式中.
标准的引用和转义字符("'\)可以用来转义#
; 命令分隔符,可以用来在一行中来写多个命令.
;; 终止"case"选项.
. .命令等价于 source命令(见 Example 11-20).这是一个 bash 的内建命令.
. .作为文件名的一部分.如果作为文件名的前缀的话,那么这个文件将成为隐藏文件.
. .字符匹配,这是作为正则表达是的一部分,用来匹配任何的单个字符.
" 部分引用."STRING"阻止了一部分特殊字符,
' 全引用. 'STRING' 阻止了全部特殊字符
, 逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被返回.
\ 转义字符
/ 文件名路径分隔符.或用来做除法操作.
` 后置引用,命令替换,
: 空命令,等价于"NOP"(no op,一个什么也不干的命令).也可以被认为与 shell 的内建命令(true)作用相同.":"命令是一个 bash 的内建命令,它的返回值为 0,就是 shell
返回的 true.
占位符:在一个 2 元命令中提供一个占位符.
"变量扩展/子串替换" :在和 > (重定向操作符)结合使用时,把一个文件截断到 0 长度,没有修改它的权限. 如果文件在之前并不存在,那么就创建它.如:
: > data.xxx #文件"data.xxx"现在被清空了.
":"还用来在/etc/passwd 和$PATH 变量中用来做分隔符.
! 取反操作符,将反转"退出状态"结果,(见 Example 6-2).也会反转test 操作符的意义.比如修改=为!=.!操作是 Bash 的一个关键字.
* 万能匹配字符,用于文件名匹配(这个东西有个专有名词叫 file globbing),或者是正则表达式中.注意:在正则表达式匹配中的作用和在文件名匹配中的作用是不同的.
* 数学乘法.
** 是幂运算.
? 测试操作.在一个确定的表达式中,用?来测试结果.
(())结构可以用来做数学计算或者是写 c 代码,那?就是 c 语言的 3元操作符的一个.
在"参数替换"中,?测试一个变量是否被 set 了.
在 file globbing中和在正则表达式中一样匹配任意的单个字符.
$ 变量替换
$ 在正则表达式中作为行结束符.
${} 参数替换,
$*,$@ 位置参数
$? 退出状态变量.$?保存一个命令/一个函数或者脚本本身的退出状态.
$$ 进程 ID 变量.这个$$变量保存运行脚本进程 ID
() 命令组
注意:在()中的命令列表,将作为一个子 shell 来运行.
在()中的变量,由于是在子 shell 中,所以对于脚本剩下的部分是不可用的.
如:
1 a=123
2 ( a=321; )
3 echo "a = $a" # a = 123
用在数组初始化,如:
1 Array=(element1,element2,element3)
{xxx,yyy,zzz...} 大括号扩展,如:
1 cat {file1,file2,file3} > combined_file
2 # 把 file1,file2,file3 连接在一起,并且重定向到 combined_file中.
3
4
5 cp file22.{txt,backup}
6 # 拷贝"file22.txt" 到"file22.backup"中
一个命令可能会对大括号中的以逗号分割的文件列表起作用[1]. file globbing将对大括号中的文件名作扩展.
注意: 在大括号中,不允许有空白,除非这个空白是有意义的.
echo {file1,file2}\ :{\ A," B",' C'}
file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
{} 代码块.又被称为内部组.事实上,这个结构创建了一个匿名的函数.但是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的.
如
bash$
{
local a;
a= 123;
}
bash 中的 local 申请的变量只能够用在函数中.
未完待续