本文共 4512 字,大约阅读时间需要 15 分钟。
目录
1.
正文
1. 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部分进行讲解. ^ 行首. 在正则表达式中, "^"表示定位到文本行的行首.
2. 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 从文件上一次被读取到现在为止, 文件是否被修改过 ! "非" -- 反转上边所有测试的结果(如果没给出条件, 那么返回真).
3. 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 逻辑或 ! 逻辑非
4. 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开头的变量. 5. BASH 进程替换 >(command) <(command) 6. BASH 变量定义 declare用法 -r 只读 -i 整型 -a 数组 -f 函数 -x export 这句将会声明一个变量, 并作为这个脚本的环境变量被导出. -x var=$value 允许在声明变量类型的同时给变量赋值. 7. 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
转载地址:http://wvtmb.baihongyu.com/