脚本规范
脚本代码开头约定,如下:
#!/bin/bash
# ------------------------------------------
# Filename: hello.sh
# Revision: 1.1
# Date: 2017/06/01
# Author: zhang
# Email: zhang@123456.com
# Website: www.123456.com
# Description: This is the first script
# ------------------------------------------
# Copyright: 2017 zhang
# License: GPL
echo “hello world”
调试脚本
检查脚本语法错误
bash -n /path/to/some_script
调试执行
bash -x /path/to/some_script
shell里的变量
- 本地变量:只对当前shell有效;作用范围可以是整个shell程序文件,包括脚本中的函数,对其他的shell无效。
- 环境变量:对当前shell及子进程shell有效。
- 声明、赋值:export name=value 或者 declare -x name=value
- 局部变量:与函数的生命周期一样;
- 定义:local name=value
- 位置变量:$1,$2,…,表示脚本传入的第几个参数
- 特殊变量:$?(上一条命令执行结果代码),$0(当前脚本名称),$#(脚本参数个数)
注:在用完变量之后要unset 变量名,这是个好习惯。
退出状态
进程使用退出状态来报告命令执行成功或失败
0代表成功,1-255表示失败,系统通过数字来指定特定的错误
$?保存最近的退出状态,用来判断执行命令是否成功
不过我们在脚本里可以自定义退出状态码,用exit [n] 定义
注意:脚本中一旦遇到exit 命令,脚本会立即终止;终止退出状态取决于exit 命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
shell里的算术运算
算术运算符:+,-,*,/,%,** (乘法符号有些场景中需要转义 ,如*),算术表达式里的变量可以不加$,以下是实现算术运算并赋值的几种形式
let var=算术表达式
注意:let和expr运算符只要后面表达式执行结果为0,会返回错误代码1,写脚本做运算的时候注意!!!
这里有个特殊例子:let k++ 和 let ++k 前面的返回1,后面的返回0var=$((算术运算符))
- var=$[算术运算符]
- var=$(expr arg1 运算符 arg2)
注意:expr数字与运算符之间要有空格,否则会报错,参数除数字之外要加$ - declare -i var=value 声明变量val为数值,感觉这个和普通声明没有太大区别
- echo `算术表达式` | bc
- $RANDOM (0-32767)
例:echo $[$RANDOM%50] :0-49
shell里的逻辑运算
逻辑运算就与(&&)或(||)非(!)
与:
1 与 与 1 = 1
1 与 与 0 = 0
0 与 与 1 = 0
0 与 与 0 = 0
或:
1 或 或 1 = 1
1 或 或 0 = 1
0 或 或 1 = 1
0 或 或 0 = 0
以上相信大家比较熟悉,下面简单介绍下逻辑短路。
短路与:
第一个为0 ,结果必定为0
第一个为1 ,第二个必须要参与运算
短路或
第一个为1 ,结果必定为1
第一个为0 ,第二个必须要参与运算
shell条件测试
在另一篇博客已经说了基础知识,下面简单说一下要注意的地方
测试命令有3种
test expression
[ expression ]
[[ expression ]]
注意:expression前后必须有空格;值为空或不赋值时结果为假,所有要加上引号。
[zhang@centos7 MyShell]$ [ a=b ] #操作法两边要加上空格,否则系统认为是整体会一直为真
[zhang@centos7 MyShell]$ echo $?
0
[zhang@centos7 MyShell]$ [ a = b ] #字符串要写成"$a",和算术运算不一样
[zhang@centos7 MyShell]$ echo $?
1
[zhang@centos7 MyShell]$ [ $a = $b ] #这个虽然可以,以防万一要加上双引号,这种情况下面介绍
[zhang@centos7 MyShell]$ echo $?
0
[ -n “$var” ] 这是正确写法,下面代码来说明一下
[zhang@centos7 MyShell]$ echo "$ab" #ab为空
[zhang@centos7 MyShell]$
[zhang@centos7 MyShell]$ [ -n $ab ] && echo true #而ab为空显示true
true
[zhang@centos7 MyShell]$ [ -n "$ab" ] && echo true #这个是正确结果
[zhang@centos7 MyShell]$
[ 条件1 -a 条件2 ] 和 [[ 条件1 && 条件2 ]] 这里面的逻辑运算是一样的,里面没有逻辑短路问题,不过后面可以接与或逻辑短路。
数值比较用 -eq,-ne…
字符串比较用 ==,>,<…
字符串比较可以匹配正则表达式但是要用[[ “$var” =~ 正则表达式 ]],正则表达式不用加双引号。
条件测试里的权限测试是测实际权限而不是文字表面权限,比如root用户对某些文件没有读写权限,但是用-r或-w测出root是有读写权限的