您的位置:首页 > 运维架构 > Shell

Linux bash shell special characters and script syntax.

2010-03-11 15:11 615 查看
Linux bash shell special characters and script syntax.

Thanks for 倚天秋水's bash script note

Online book URL: http://doc.linuxpk.com/doc/abs/index.html
########################### BASH 特殊字符 ###########################

# 注释.

; 命令分隔符,可以在同一行上写两个或两个以上的命令.

;; 终止case选项.

. "点"命令等价于source命令.

"点"作为文件名的一部分. 如果点放在文件名的开头的话, 那么这个文件将会成为

隐藏文件,

"点"字符匹配. "点"用来匹配任何的单个字符.

"" 部分引用[双引号, 即"]. "STRING"将会阻止(解释)STRING中大部分特殊的字符.

'' 全引用[单引号, 即']. 'STRING'将会阻止STRING中所有特殊字符的解释. 这是

一种比使用"更强烈的形式.

, 逗号操作符. 逗号操作符链接了一系列的算术操作. 虽然里边所有的内容都被运

行了,但只有最后一项被返回.

/ 转义符[反斜线, 即/]. 一种对单字符的引用机制.

/ 文件名路径分隔符[斜线, 即/],也可以用来作为除法算术操作符.

`` 命令替换. 已逐渐被$()替代,后者更灵活,如可以嵌套等

: 空命令[冒号, 即:]. 也可以被认为与shell的内建命令true作用相同.

! 取反操作符[叹号, 即!].

* 通配符[星号, 即*]. *可以用来做文件名匹配,也可以用在正则表达式中, 用来

匹配任意个数(包含0个)的字符.

算术操作符. 在算术操作符的上下文中, *号表示乘法运算.

如果要做求幂运算, 使用**, 这是求幂操作符.

? 测试操作符. 在一个特定的表达式中, ?用来测试一个条件的结果.

在一个双括号结构中, ?就是C语言的三元操作符.

在参数替换表达式中, ?用来测试一个变量是否被set了.

通配符. ?在通配(globbing)中, 用来做匹配单个字符的"通配符".

$ 变量替换(引用变量的内容).

行结束符. 在正则表达式中, "$"表示行结束符.

${} 参数替换.

$* 位置参数

$@ 同上.

$? 退出状态码变量. $?变量保存了一个命令, 一个函数, 或者是脚本本身的退出

状态码.

$$ 进程ID变量. 这个$$变量保存了它所在脚本的进程ID.

() 命令组.

{} 代码块,又被称为内部组, 这个结构事实上创建了一个匿名函数(一个没有名字

的函数).

[] 条件测试.数组元素.用作正则表达式的一部分, 方括号描述一个匹配的字符范围.

[[]] 测试.

(()) 整数扩展.

>

&>

>&

>>

<

<> 重定向.

<< 用在here document中的重定向.http://doc.linuxpk.com/doc/abs/here-

docs.html#HEREDOCREF

<<< 用在here string中的重定向.

<

> ASCII comparison.

/<

/> 正则表达式中的单词边界.

| 管道.

>| 强制重定向(即使设置了noclobber选项 -- 就是-C选项). 这将强制的覆盖一个

现存文件.

|| 或-逻辑操作.

& 后台运行命令.

&& 与-逻辑操作.

- 选项, 前缀.

用于重定向stdin或stdout[破折号, 即-].

先前的工作目录.

减号. 减号属于算术操作.

= 等号. 赋值操作,"="也用来做字符串比较操作.

+ 加号. 加法算术操作.某些命令内建命令使用+来打开特定的选项, 用-来禁用这

些特定的选项.

% 取模. %也是一种模式匹配操作. 在BASH中,%number表示将后台编号为number的

任务调度到前台执行。

~ home目录[波浪号, 即~].

~+ 当前工作目录. 相当于$PWD内部变量.

~- 先前的工作目录. 相当于$OLDPWD内部变量.

=~ 正则表达式匹配. 这个操作将会在version 3版本的Bash部分进行讲解.

^ 行首. 在正则表达式中, "^"表示定位到文本行的行首.

########################### BASH 文件测试 ###########################

-e 文件存在.

-f 表示这个文件是一个一般文件.

-d 表示这是一个目录.

-b 表示这是一个块设备.

-c 表示这是一个字符设备.

-p 这个文件是一个管道

-s 文件大小不为零.

-L 这是一个符号链接

-S 表示这是一个socket

-t 文件(描述符)被关联到一个终端设备上.

这个测试选项一般被用来检测脚本中的stdin([ -t 0 ]) 或者stdout([ -t 1 ])是

否来自于一个终端.

-r 文件是否具有可读权限(指的是正在运行这个测试命令的用户是否具有读权限)

-w 文件是否具有可写权限(指的是正在运行这个测试命令的用户是否具有写权限)

-x 文件是否具有可执行权限(指的是正在运行这个测试命令的用户是否具有可执行

权限)

-g set-group-id(sgid)标记被设置到文件或目录上

-u set-user-id (suid)标记被设置到文件上

-k 设置粘贴位

-O 判断你是否是文件的拥有者

-G 文件的group-id是否与你的相同

-N 从文件上一次被读取到现在为止, 文件是否被修改过

! "非" -- 反转上边所有测试的结果(如果没给出条件, 那么返回真).

########################### BASH 比较操作 ###########################

------------文件比较------------

f1 -nt f2

文件f1比文件f2新

f1 -ot f2

文件f1比文件f2旧

f1 -ef f2

文件f1和文件f2是相同文件的硬链接

------------整数比较------------

-eq 等于

-ne 不等于

-gt 大于

-ge 大于等于

-lt 小于

-le 小于等于

< 小于

<= 小于等于

> 大于

>= 大于等于

------------字符串比较------------

= 等于

== 等于

!= 不等号

< 小于, 按照ASCII字符进行排序

> 大于, 按照ASCII字符进行排序

-z 字符串为"null", 意思就是字符串长度为零

-n 字符串不为"null".

-l 字符串长度

------------逻辑操作------------

-a 逻辑与

-o 逻辑或

! 逻辑非

########################### BASH 参数替换 ###########################

------------参数扩展------------

${parameter} 与$parameter相同, 在某些上下文中, ${parameter}很少会产生混淆.

${parameter-default} 如果变量parameter没声明, 那么就使用默认值.

${parameter:-default} 如果变量parameter没设置, 那么就使用默认值.

${parameter=default} 如果变量parameter没声明, 那么就把它的值设为default.

${parameter:=default} 如果变量parameter没设置, 那么就把它的值设为default.

${parameter+value} 如果变量parameter被声明了, 那么就使用value, 否则就使

用null字符串.

${parameter:+value} 如果变量parameter被设置了, 那么就使用value, 否则就使

用null字符串.

${parameter?err_msg} 如果parameter已经被声明, 那么就使用设置的值, 否则打

印err_msg错误消息.

${parameter:?err_msg} 如果parameter已经被设置, 那么就使用设置的值, 否则

打印err_msg错误消息.

------------子串删除------------

${#var} 字符串长度(变量$var的字符个数). 对于array来说, ${#array}表示的是

数组中第一个元素的长度.

${var#Pattern} 从变量$var的开头删除最短匹配$Pattern的子串.

${var##Pattern} 从变量$var的开头删除最长匹配$Pattern的子串.

${var%Pattern} 从变量$var的结尾删除最短匹配$Pattern的子串.

${var%%Pattern} 从变量$var的结尾删除最长匹配$Pattern的子串.

------------子串替换------------

${var:pos} 变量var从位置pos开始扩展(译者注: 也就是pos之前的字符都丢弃).

${var:pos:len} 变量var从位置pos开始, 并扩展len个字符.

${var/Pat/Rep} 使用Rep来替换变量var中第一个匹配Pat的字符串.

${var//Pat/Rep} 使用Rep来替换变量var中的所有匹配Pat的字符串.

${var/#Pat/Rep} 如果变量var的前缀匹配Pat, 那么就使用Rep来替换匹配到Pat的

字符串.

${var/%Pat/Rep} 如果变量var的后缀匹配Pat, 那么就使用Rep来替换匹配到Pat的

字符串.

${!varprefix*}

${!varprefix@} 匹配所有之前声明过的, 并且以varprefix开头的变量.

########################### BASH 进程替换 ###########################

>(command)

<(command)

########################### BASH 变量定义 ###########################

declare用法

-r 只读

-i 整型

-a 数组

-f 函数

-x export 这句将会声明一个变量, 并作为这个脚本的环境变量被导出.

-x var=$value 允许在声明变量类型的同时给变量赋值.

########################### BASH 控制结构 ###########################

----if结构----

if command

then

command

elif command

then

command

else

command

fi

例:

var=70;

if (($var<60))

then

echo "too bad"

elif (($var>90))

then

echo "very good"

else

echo "OK"

fi

----case结构----

case variable in

value1)

command1

;;

value2)

command2

;;

*)

command3

;;

esac

例:

cat << ENDIT

1)one

2)two

ENDIT

read choice;

case "$choice" in

1)

echo "one"

;;

2)

echo "two"

;;

*)

echo "Error"

;;

esac

----for结构----

for variable int world_list

do

command

done

例:

for line in ~/*

do

echo $line;

done

----while结构----

while command

do

command

done

例:

var=1

while ((var<=30))

do

echo $var

let "var=var+1"

done
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息