最近编写RPM包的安装文件 .spec 文件 总结如下
系统设定
默认输出设备:标准输出 stdout, 1
默认输入设备:标准输入 stdin, 0
标准错误输入: stderr, 2
在0~9号流中 系统固定占用了3个,即上述的0.1.2,其他号码根据具体需求可以重新调查定义和使用。
I/O 重定向
输出重定向: > 覆盖输出
>> 追加输出
2> 错误输出
2>> 错误追加输出
&> 将标准输出和错误输出到同意文件
输入重定向: <
<< here documents ex: cat <<EOF > test.txt
set -C 禁止对已存在的文件使用覆盖重定向 >| 强制覆盖输出
set +C 关闭上面的功能
set -x 屏幕打印命令本身 用于调试
set +x 屏幕不打印命令内容
自定义输出重定向:
不使用0,1,2
exec 3> /tmp/myout.out
(定义3这个描述符,适用于想多次向某个文件中重定向,避免多次打开关 闭/tmp/myout.out文件 )
ls –l /etc >&3
exec 3>&- (撤销3这个描述符)
exec &>/dev/tty 所有信息输出到控制台 即 开启屏幕打印功能;
exec &>/dev/null 所有信息输出到“黑洞”,即关闭屏幕打印功能,主要针对echo;
exec 意为 永久定义
grep 正则表达式元字符
.: 任意单个字符匹配
[]: 指定范围内的单个字符匹配
[^]: 制定范围外的单个字符匹配
*: 匹配其前 0 次或任意次
\?: 匹配其前字符 0 次或 1 次
\{m,n\}: 匹配其前的字符至少 m 次至多 n 次
.*: 匹配任意长度任意字符
^: 锚定行首
$: 锚定行尾
\<,\b: 锚定词首
\>,\b: 锚定词尾
\(\): 用于分组做后项引用 \1 \2 \3
grep 选项
-i 忽略字符大小写
-v 反向搜索
-o 只显示匹配结果
--color 显示颜色
-E 使用扩展正则表达式
-A 显示匹配结果的后 n 行
-B 显示匹配结果的前 n 行
-C 显示匹配结果的上下 n 行
grep 扩展正则表达式
+:匹配其前字符至少 1 次
分组:
(): 分组 \1 \2 \3
a|b: 匹配 a 或者 b(匹配左边字符串或者右边字符串)
逻辑运算:与 &、或 | 、非 !、异或
1:真
0:假
与
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
或
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
非
脚本在执行时会启动一个子 shell 进程:
命令行中启动的脚本会集成当前 shell 环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义需要的各环境变量;
bash 变量类型:
环境变量:作用域为当前 shell 进程及其子进程 (理解为全局变量)
export varname=value
本地变量(局部变量)
varname=value : 作用域为整个 bash 进程
local varname=value :作用域为当前代码段
位置变量 (比如 awk 命令里表示第一列第二列等等)
$1, $2, ...
shift
特殊变量
$?: 上一个命令的执行状态返回值 (正在调查状态值的种类 &? 一般表示函数的return值 ,或者执行成功的状态值0,或者调用失败的返回值127,其他值还在调查……)
$#: 参数的个数
$*: 参数列表
$@: 参数列表
程序执行,可能有 两类返回值:
程序执行结果
程序状态返回代码 (0-255)
0: 正确执行
1-255:错误执行 1,2,127 系统预留
BASH 的返回值可以用 return 语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。
变量名称:
1、只能包含字母,数字和下划线,并且不能以数字开头
2、不应该和系统中已有的环境变量重名
3、最好做到见名知义
撤销变量:
unset varname
export varname
查看当前 shell 中的变量
set
查看当前 shell 中的环境变量
printenv, env, export
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现源程序
shebang:魔数
#!/bin/bash
“”强引用 (做变量引用)
‘’弱引用 (不做变量替换)
引用变量: ${varname} 括号有时可以省略
条件判断
bash 中如何实现条件判断
条件测试类型
整数测试
字符测试
文件测试
条件测试的表达式
[expression]
[[expression]]
test expression
整数比较:
-eq:测试两个整数是否相等; 比如 $a -eq $b (如果是和数字比用-eq “123” ,和 字符串比较用= "yes" )
-ne: 测试两个整数是否不等;
-gt:测试一个数是否大于另一个数
-ge:大于或等于
-lt:测试一个数是否小于另一个数
-le:小于或等于
命令间的逻辑关系:
逻辑与: &&
第一个条件为假时,第二条件不用再判断
第一个条件为真时,第二条件必须再判断
逻辑或: ||
条件判断,控制结构:
if 判断条件; then
statement1
statement2
.。。
fi
shell 中的算术运算
a=3
b=4
1、let 算术运算表达式
let c=$a+$b
2、$[算术运算表达式]
c=$[$a+$b]
3、$((算术运算表达式))
c=$(($a+$b))
4、expr 算术运算表达式,表达式中个操作数及运算符之间要有空,而且要使用命令引用
c=`expr $a + $b`
文件测试
-e filename 测试文件是否存在
-f filename 测试文件是否为普通文件
-d filename 测试是否为目录
-r filename 测试当前用户对指定文件是否有读取权限
-w
-x
bash 测试脚本是否有语法错误
bash -n scripts
exit 1 退出
exit 0 正常结束
exit: 退出脚本
exit #
如何脚本没有明确定义推出状态码,那么最后执行的一条命令的退出码即为脚本的退出码
参考文章:https://segmentfault.com/a/1190000008053195 https://segmentfault.com/a/1190000008080537