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

调试执行