首页
Java
登录
6mi
u
盘
搜
搜 索
Java
高级Bash脚本编程
高级Bash脚本编程
xiaoxiao
2021-02-27
523
<<高级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
}
<
$
0
# 文件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} '.*
A
B
C
[
1
−
3
]
.
.
.*'`"
echo
"get substring: `expr "
${str}
" : '.*
A
B
C
[
1
−
3
]
.
.
.*'`"
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
)