高级Bash脚本编程

xiaoxiao2021-02-27  465

<<高级Bash脚本编程>> 学习笔记    

abs-guide shell 学习笔记

  http://blog.csdn.net/gsnumen/article/details/7288204

第二部分 基本

3 特殊字符

#

    (1) 注释,从"#"至行尾都是注释     (2) 模式匹配,如 ${##}     (3) #!指示脚本解释器

;     命令分隔符,  

;;    case终止符

.     (1) 等价于source,是bash的内建命令     (2) 文件和目录的一部分     (3) 正则匹配中的字符匹配

"    部分引用

'    全引用

        全引用和部分引用的区别:全引用阻止'string'中所有的特殊字符,部分引用阻止'string'中的部分引用,如 $var 变量引用不会被阻止

,    逗号操作符 和C中类似。

\    转义符[反斜线] 作用: 转义

/    文件名路径分隔符

`    命令替换符,`ls -l`, 类似功能的还有: $(ls -l)

:    空命令[冒号],bash内建命令,等价于"NOP",作用与命令"true"相同,还用来做环境变量如"$PATH"的分隔符.

!    取反

*   

    (1) 通配符[星号],用于路径匹配     (2) 正则表达式的星号     (3) 算术运算符的 乘号 和 幂

?    测试操作符,正则匹配

$         (1) 变量替换     (2) 正则表达式中的 行尾匹配符

${}    参数替换

$*,$@    位置参数

$?    紧跟上一条命令的退出码

$$    进程ID变量

()    

    (1) 命令组,会常见一个子shell          #!/bin/bash   # parenthesis.sh var=123 echo "PID is $$" (var=456;echo"PID is $$";) echo "var=$var" exit 0 # 运行结果如下: #./parenthesis.sh  #PID is 17665 #PID is 17665 #var=123       (2) 初始化数组         array=(element1 element2 element3)

{}

    (1) 用于操作文件         $> touch {a,b,c,d}{1,2,3,4}         $> ls         a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4 d1 d2 d3 d4     (2) 代码块         其实是函数体,如果没有函数名就是"匿名函数" #!/bin/bash  # redirect.sh {     while read line     do         echo $line     done  } < $# 文件I/O重定向

{} \;    路径名, 用于 find

    $> find ./ -type f -name "*.sh" -exec echo {} \;

[ ]    

    (1) 条件测试, 条件测试表达式放在[ ]中.     (2) 数组元素     (3) 正则表达式中的字符范围.         $> find ./ -type f -name "[a-h0-9]*.sh" -exec echo {} \;

[[]]    测试, 比[] 更通用,是扩展的shell内建test, 使用[[...]]比[...]能防止脚本中许多逻辑错误.

>   &> >& >> < <> 重定向

< > ASCII comparion

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

|  管道

    $> ls | tr 'a-z' 'A-Z'

||    逻辑或

&    后台运行命令

&&    逻辑与

-

    (1) 选项前缀     (2) 用于重定向stdout和stderr         $> ls | cat - #将ls的结果经过管道给cat,又将cat的结果重定向到stdout     (3) 先前的工作目录         $> cd -

=    赋值运算符

+    加法算术操作

%    取模

~    home目录

~+    相当于 $PWD

~-    先前的工作目录

^    正则表达式的行首匹配

空白    分割命令,函数,变量

4 变量和参数的介绍

4.1 变量的名字就是变量保存值的地方,引用变量的值就叫做变量替换 4.2 变量赋值 = 左右不能有空白 4.3 bash变量不区分变量类型.

6 bash脚本的退出码有对应退出状态

    参考: /usr/include/sysexits.h

7 条件判断

7.1 if/then     (1) bash脚本中,关键字(或者命令)如果作为表达式的开头,并且如果想再同一行再写一个新的表达式的话,那么必须使用分号结束上一个表达式.(P)     (2) if test condition-true 等价于 if [ condition-true ]     (3) [[...]] 比 [..]更通用,因为[[...]]能避免一些逻辑上的错误,所以尽量使用[[...]]     (4) ((...)) 的退出结果与 [...] 相反. #!/bin/bash  # if.sh if [ $1-eq 1 ] then      echo "arg's value: 1"; #else if [ $1 -eq 2 ] #error #then # echo "arg's value: 2"; elif [ $1-eq 3 ] then     echo "arg's value: 3" else     echo "unknow."; fi exit 0 #运行结果如下: #./if.sh 1 #arg's value: 1 #./if.sh 2 #arg's value: 2 #./if.sh 3 #arg's value: 3 #./if.sh 4 #arg's value: 4   7.2 文件测试操作符   7.3 整数比较运算符, 字符串比较运算符,逻辑或,逻辑与和逻辑非     (1) 整数比较运算: -eq, -gt, -lt, -ge, -le     (2) 字符串比较运算符: >, >=, <, <=, !=, -z, -n     (3) 逻辑运算: -a, -o , !  

8 操作符

8.1 操作符     (1) 赋值 =     (2) 算术操作符     (3) 位操作符     (4) 裸机操作符:  && || 8.2 数字常量     数字常量默认十进制;数字0开头是八进制;数字0x开头是十六进制;数字符合base#number形式标记的是base进制,图 20#1234, 就是20进制  

第三部分 进阶

9 变量重游

9.1 内部命令     (1) $EDITOR    脚本调用的默认编辑器,如vim或者emcase     (2) $FUNCNAME, $LINENO 当前代码所在的函数名和所在脚本的行号,用于挑事     (3) $HOME    home目录     (4) $PATH    可执行文件的搜索路径     (5) $PS1    主提示符     (6) $PWD    当前工作目录     (7) $REPLY    当read命令后不加任何变量时,会将内如保存到 $REPLY     (8) $SECONDS    脚本到现在为止运行了多少秒     (9) $TMOUT    脚本运行不得超过的秒数     (10) $0,$1,$2,... 命令行参数     (11) $#    命令行参数的个数     (12) $*, $@ 所有的命令行参数, $@与$*的不同在于, $@是未经任何改变的命令行参数,而$*将命令行参数以空白分割成了一个一个的单词     (13) caller    调用本函数的函数. 9.2 操作字符串     啥时候用到啥时候再来温习   #!/bin/bash  # opstring.sh str=abcABC123ABCabc # 长度 echo "${str} len: ${#str}" echo "${str} len: `expr length ${str}`" echo "${str} len: `expr "$str" : '.*'`" echo #匹配字符串开头的子字符串长度 echo "match: `expr match "${str}" 'abc[A-C]*..3'`" echo "match: `expr "${str}" : 'abc[A-C]*..3'`" echo #索引 echo "index: `expr index "${str}" '123'`" echo #提取子串 echo "get substring: ${str:3}" echo "get substring: ${str:3:11}" echo "get substring: `expr match ${str} '.* ABC[13].. .*'`" echo "get substring: `expr "${str}" : '.* ABC[13].. .*'`" echo #从头删除子串 echo "delete head substring: ${str#a*A}" echo "delete head substring: ${str##a*A}" echo #从尾删除子串 echo "delete tail substring: ${str%A*c}" echo "delete tail substring: ${str%%A*c}" echo #子串替换 echo "replace substring: ${str/ABC/789}" echo "replace substring: ${str//ABC/789}" echo "replace substring: ${str/#abc/789}" echo "replace substring: ${str/
转载请注明原文地址: https://www.6miu.com/read-2051.html

最新回复(0)