#SHELL脚本编程基础#
shell脚本基础

shell脚本

包含一些命令或声明,并符合一定的格式的文本文件

格式要求:首行shebang机制

!bin/bash

!/usr/bin/python

!/usr/bin/perl

shell脚本的用途有:

自动化常用命令

执行系统管理和故障排除

创建简单的应用程序

处理文本或文件

脚本规范

  1. 第一行一般为调用使用的语言
  2. 程序名,避免更改文件名为无法找到正确的文件
  3. 版本号
  4. 更改后的时间
  5. 作者相关信息
  6. 该程序的作用,及注意事项
  7. 最后是各版本的更行简要说明

    脚本的基本结构

脚本的基本结构
#!SHEBANG

CONFIGURATION_VARIABLES

FUNCTION_DEFINITIONS

MAIN_CODE

脚本调试

检测脚本中的语法错误
bash -n /path/to/some_script
调试执行
bash -x /path/to/some_script

只读和位置变量

只读变量:只能声明,但不能修改和删除

声明只读变量

  • readonly name
  • declare -r name
  • 查看只读变量

  • readonly -p
  • 位置变量:在脚本代码中调用通过命令传递给脚本的参数

  • $1,$2,... 对应第1,第2等参数,shift [n] 换位置
  • $0 命令本身
  • $* 传递给脚本的所有参数,每个参数为独立字符
  • $@ 传递给脚本的所有参数,每个参数为独立字符串
  • $# 传递给脚本的参数的个数
  • 注意:$@ $*只在被双引号包起来的时候才会有差异
  • set --清空所有位置变量

    退出状态

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

  • 0代表成功,1-255代表失败
  • $?变量保存最近的命令退出状态

例如

  • ping -c -W1 hostdown &>/dev/null
  • echo $?

算术运算

bash中的算术运算:help let

  • +,-,*,/,%取模(取余),**(乘方),乘法符号有些场景中需要转义

  • 实现算术运算:
  • let var=算术表达式
  • var=$[算术表达式]
  • var=$((算术表达式))
  • var=$(expr arg1 arg2 arg3 ...)
  • declare -i var =数值
  • echo '算术表达式' |bc
  • bash有内建的随机数生成器变量:$RANDOM(0-32767)

  • 示例:生成0-49之间随机数
  • echo$[$RANDOM%50]

条件测试

判断某需求是否满足,需要由测试机制来实现

  • 专用的测试表达式需要由测试命令辅助完成测试过程

评估布尔声明,以便用在条件性执行中

  • 若真,则返回0
  • 若假,则返回1

测试命令:

  • test EXPRESSION
  • [ EXPRESSION ]
  • [[ EXPRESSION ]]
    注意:EXPRESSION前后必须有空白字符

bash的数值测试

-v VAR

-变量VAR是否设置

数值测试:

  • -gt 是否大于
  • -ge 是否大于等于
  • -eq 是否等于
  • -ne 是否不等
  • -le 是否小于等于
  • -lt 是否小于

Bash 的文件测试

存在性测试

  • -a FILE:同-e
  • -e FILE:文件存在性测试,存在未真,否则为假

存在性及类别测试

  • -b FILE:是否存在且为块设备文件
  • -c FILE:是否存在且为字符设备文件
  • -d FILE:是否存在且为目录文件
  • -f FILE:是否存在且为普通文件
  • -h FILE 或 -L FILE:存在且为符号链接文件
  • -p FILE:是否存在且为命名管道文件
  • -S FILE:是否存在且为套接字文件

Bash的文件权限测试

文件权限测试

  • -r FILE:是否存在且可读
  • -w FILE: 是否存在且可写
  • -x FILE: 是否存在且可执行

文件特殊权限测试:

  • -u FILE:是否存在且拥有suid权限
  • -g FILE:是否存在且拥有sgid权限
  • -k FILE:是否存在且拥有sticky权限

Bash的文件属性测试

文件大小测试:

  • -s FILE: 是否存在且非空

文件是否打开

  • -t fd: fd 文件描述符是否在某终端已经打开
  • -N FILE:文件自从上一次被读取之后是否被修改过
  • -O FILE:当前有效用户是否为文件属主
  • -G FILE:当前有效用户是否为文件属组

Bash的文件属性测试

双目测试:

  • FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
  • FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
  • FILE1 -ot FILE2: FILE1是否旧于FILE2

Bash的组合测试条件

第一种方式:

  • EXPRESSION1 -a EXPRESSION2 并且
  • EXPRESSION1 -o EXPRESSION2 或者
  • ! EXPRESSION
  • 必须使用测试命令进行,[[ ]] 不支持

第二种方式:

  • COMMAND1 && COMMAND2 并且, 短路与,代表条件性的AND THEN
  • COMMAND1 || COMMAND2 或者, 短路或,代表条件性的OR ELSE
  • ! COMMAND 非
  • 如:[ -f “$FILE” ] && [[ “$FILE”=~ .*.sh$ ]]