bash脚本编程
脚本文件格式:第一行,顶格:#!/bin/bash
注释信息:#
代码注释:
缩进,适度添加空白行;
shell语法介绍
算数语法介绍
1.数据类型:字符型、数值型 弱类型:字符型
2.算术运算:+, -, *, /, %, **
let VAR=expression
VAR=$[expression]
VAR=$((expression))
VAR=$(expr argu1 argu2 argu3)
注意:有些时候乘法符号需要转义;
3.增强型赋值:变量做某种算术运算后回存至此变量中;
let i=$i+# 等同于let i+=# 同理:+=,-=,*=, /=, %=
3.1 自增:VAR=$[$VAR+1] 等同于 let VAR+=1 等同于 let VAR++
3.2 自减:VAR=$[$VAR-1] 等同于 let VAR-=1 等同于 let VAR--
条件测试语法
判断的需求是否满足有两种机制:
(1) 执行命令,并利用命令状态返回值来判断;
0:成功
1-255:失败
(2) 测试表达式
test EXPRESSION
[ EXPRESSION ]
` EXPRESSION `
注意:EXPRESSION两端必须有空白字符,否则为语法错误;
1、数值测试:数值比较
-eq:是否等于; [ $num1 -eq $num2 ]
-ne:是否不等于;
-gt:是否大于;
-ge:是否大于等于;
-lt:是否小于;
-le:是否小于等于;
2.字符串测试:
==:是否等于;
>:是否大于;
<:是否小于;
!=:是否不等于;
=~:左侧字符串是否能够被右侧的PATTERN所匹配;
-z "STRING":判断指定的字串是否为空;空则为真,不空则假;
-n "STRING":判断指定的字符串是否不空;不空则真,空则为假;
注意:(1) 字符串要加引用;(2) 要使用` `;
3.文件测试:
存在性测试-a FILE -e FILE 文件的存在性测试,存在则为真,否则则为假;
存在性及类型测试:
-b FILE:是否存在并且为 块设备 文件;
-c FILE:是否存在并且为 字符设备 文件;
-d FILE:是否存在并且为 目录文件;
-f FILE:是否存在并且为 普通文件;
-h FILE或 -L FILE:是否存在并且为 符号链接文件;
-p FILE:是否存在且为 命名管道文件;
-S FILE:是否存在且为 套接字文件;
4.文件权限测试:
-r FILE:是否存在并且 对当前用户可读;
-w FILE:是否存在并且 对当前用户可写;
-x FILE:是否存在并且 对当前用户可执行;
5. 特殊权限测试:
-u FILE:是否存在并且 拥有suid权限;
-g FILE:是否存在并且 拥有sgid权限;
-k FILE:是否存在并且 拥有sticky权限;
6.文件是否有内容:
-s FILE:是否有内容;
7. 时间戳:
-N FILE:文件自从上一次读操作后是否被修改过;
8. 从属关系测试:
-O FILE:当前用户是否为文件的属主;
-G FILE:当前用户是否属于文件的属组;
9.双目测试:
FILE1 -ef FILE2:FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接;
FILE1 -nt FILE2:FILE1是否新于FILE2;
FILE1 -ot FILE2:FILE1是否旧于FILE2;
10.组合测试条件:
逻辑运算:
第一种方式:
COMMAND1 && COMMAND2 逻辑于
COMMAND1 || COMMAND2 逻辑或
! COMMAND 取反
例如:[ -O FILE ] && [ -r FILE ] 判断当前用户是否是文件的属主且文 件是否可读
第二种方式:
EXPRESSION1 -a EXPRESSION2 逻辑于
EXPRESSION1 -o EXPRESSION2 逻辑或
! EXPRESSION 取反
[ -O FILE -a -x FILE ]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
练习:将当前主机名称保存至hostName变量中;
主机名如果为空,或者为localhost.localdomain,则将其设置为www.magedu.com;
hostName=$(hostname)
[ -z "$hostName" -o "$hostName" == "localhost.localdomain" -o "$hostName" == "localhost" ] && hostname www.magedu.com
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
11.向脚本传递参数:位置参数变量
myscript.sh argu1 argu2
引用方式:
$1, $2, ..., ${10}, ${11}, ...
注:$1等于argu1 $2等于argu2,如果输入的参数多,最后一个$n会继承,如果输入的参数少了,就会报错。
12.轮替: shift [n]:位置参数轮替;
13.特殊变量:
$0:脚本文件路径本身;
$#:脚本参数的个数;
$*:所有参数
$@:所有参数
扩展板块:
脚本的状态返回值:
默认是脚本中执行的最后一条件命令的状态返回值;
自定义状态退出状态码:exit [n]:n为自己指定的状态码;
注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束
shell语句之if
1.选择执行:
单分支的if语句:
if 测试条件
then
代码分支
fi
注:选择执行:代码有一个分支:条件满足时才会执行;
两个或以上的分支:只会执行其中一个满足条件的分支;
2.双分支的if语句:
if 测试条件; then
条件为真时执行的分支
else
条件为假时执行的分支
fi
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备;
(2) 如磁盘数量为1,则显示其空间使用信息;
否则,则显示最后一个磁盘上的空间使用信息;
if [ $disks -eq 1 ]; then
fdisk -l /dev/[hs]da
else
fdisk -l $(fdisk -l /dev/[sh]d[a-z] | grep -o "^Disk /dev/[sh]d[a-]" | tail -1 | cut -d' ' -f2)
fi
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
bash脚本编程之用户交互
read [option]... [name ...]
-p 'PROMPT' 打印提示符
-t TIMEOUT 超时时间
扩展板块
bash -n /path/to/some_script
检测脚本中的语法错误
bash -x /path/to/some_script
调试执行