shell脚本基础及细节总结

脚本规范

脚本代码开头约定,如下:

#!/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里的变量

  1. 本地变量:只对当前shell有效;作用范围可以是整个shell程序文件,包括脚本中的函数,对其他的shell无效。
  2. 环境变量:对当前shell及子进程shell有效。
  3. 声明、赋值:export name=value 或者 declare -x name=value
  4. 局部变量:与函数的生命周期一样;
    • 定义:local name=value
  5. 位置变量:$1,$2,…,表示脚本传入的第几个参数
  6. 特殊变量:$?(上一条命令执行结果代码),$0(当前脚本名称),$#(脚本参数个数)
    注:在用完变量之后要unset 变量名,这是个好习惯。

退出状态

进程使用退出状态来报告命令执行成功或失败

  1. 0代表成功,1-255表示失败,系统通过数字来指定特定的错误

  2. $?保存最近的退出状态,用来判断执行命令是否成功

  3. 不过我们在脚本里可以自定义退出状态码,用exit [n] 定义

    注意:脚本中一旦遇到exit 命令,脚本会立即终止;终止退出状态取决于exit 命令后面的数字
    注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

shell里的算术运算

算术运算符:+,-,*,/,%,** (乘法符号有些场景中需要转义 ,如*),算术表达式里的变量可以不加$,以下是实现算术运算并赋值的几种形式

  1. let var=算术表达式
    注意:let和expr运算符只要后面表达式执行结果为0,会返回错误代码1,写脚本做运算的时候注意!!!
    这里有个特殊例子:let k++ 和 let ++k 前面的返回1,后面的返回0

  2. var=$((算术运算符))

  3. var=$[算术运算符]
  4. var=$(expr arg1 运算符 arg2)
    注意:expr数字与运算符之间要有空格,否则会报错,参数除数字之外要加$
  5. declare -i var=value 声明变量val为数值,感觉这个和普通声明没有太大区别
  6. echo `算术表达式` | bc
  7. $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是有读写权限的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值