A chain no stronger than its weakest link.node
"一着不慎,满盘皆输"shell
参考资料:鸟哥的Linux私房菜 基础学习篇(第三版) 编程
Linux Shell脚本攻略 bash
Linux程序设计(第四版)less
1、什么是shell script函数
一、什么是shell script学习
简单来讲,shell script(程序化脚本)是利用shell功能所写的一个“程序”,它拥有本身的语法特性测试
二、为何要学shell scriptspa
对于一个初学者来讲,我以为就那么几个缘由:设计
①连续命令单一化;
②简单的数据处理;
③简化常规的系统管理;
三、注意事项(重要!重要!重要!--重要的事情说三遍)
①命令的执行顺序是从上而下,从左而右地分析与执行;
②若是读取到一个Enter符号(CR),就尝试开始执行该行(串)命令;
③若是命令太长,可使用\[Enter]来扩展至下一行;
④“#”可做为批注(注释),任何加在“#”后面的数据在执行时所有被忽略;
⑤命令、参数间的空白(包括Tab键)在执行时都会被忽略;
四、shell script的文件结构(重要!重要!重要!)
①第一行为#!/bin/bash,目的是声明这个script使用的shell名称;
②程序内容说明;
③主要环境变量和函数的声明;
④主程序部分;
⑤程序的执行结果;
五、养成良好的shell script编程习惯(重要!重要!重要!)
①功能(批注);
②版本信息(批注);
③做者和联系方式(批注);
④版权声明(批注);
⑤历史记录(批注);
⑥特殊命令应该用绝对路径的方式来执行;
⑦预先声明环境变量;
2、简单的shell script练习
一、几种经常使用的范例
①交互式脚本:用 read 命令获取用户输入做为变量内容;
②随日期变化的文件:利用date命令的执行结果做为文件名的一部分;
③简单的数值运算:shell script支持 +、-、*、/、%等运算符上的整数运算;
④数值运算的方法:假设a=1,b=2,如今要求a+b并赋值给c,那么能够这样: let c=a+b、c=$((a+b))或者c=$[ a + b ] ;
二、script的执行方式区别
①直接执行或者使用 bash name.sh 方式执行:子进程执行完以后,子进程内各项变量或操做将会结束而不传回到父进程中;
②利用 source name.sh 或者 . name.sh 的方式来执行:在父进程中执行;
3、测试语句
一、利用 test 测试,命令格式: test test_expr
二、利用 [] ,命令格式: [ test_expr ] ,使用中括号须要注意如下几点:
①在中括号[]内的每一个组件都要用空格键来分隔;
②在中括号内的变量,最好都以双引号括起来;
③在中括号内的常量,最好都以单或双引号括起来;
三、关于 test_expr ,见下表
测试标志 | 表明意义 |
文件类型判断,如: test -d filename 表示 判断filename是否存在且是一个目录 | |
-e | 文件名是否存在 |
-f | 文件名是否存在且为文件(file) |
-d | 文件名是否存在且为目录(directory) |
-b | 文件名是否存在且为一个block device设备 |
-c | 文件名是否存在且为一个character device设备 |
-S | 文件名是否存在且为一个Socket文件 |
-p | 文件名是否存在且为一个FIFO(pipe)文件 |
-L | 文件名是否存在且为一个链接文件 |
文件权限检测,如: test -r filename 表示 判断filename是否可读(root权限例外) | |
-r | 文件名是否存在且具备“可读”权限 |
-w | 文件名是否存在且具备“可写”权限 |
-x | 文件名是否存在且具备“可执行”权限 |
-u | 文件名是否存在且具备“SUID”属性 |
-g | 文件名是否存在且具备“SGID”属性 |
-k | 文件名是否存在且具备“Sticky bit”属性 |
-s | 文件名是否存在且为“非空白文件” |
两个文件之间的比较,如: test file1 -nt file2 表示 判断file1是否比file2新 | |
-nt | (newer than)更新 |
-ot | (older than)更旧 |
-ef | 是否为同一文件,主要用于断定两个文件是否指向同一个inode |
整数比较,如: [ n1 -eq n2 ] 表示判断n1是否等于n2 | |
-eq | (equal)相等 |
-ne | (not equal)不相等 |
-gt | (greater than)大于 |
-lt | (less than)小于 |
-ge | (greater than or equal)大于等于 |
-le | (less than or equal)小于等于 |
字符串比较 | |
-z string | 是否为空串 |
-n string | 是否不是空串,-n 可省略 |
str1 == str2 | 是否相等 |
str1 != str2 | 是否不等 |
复合断定,如:[ n -ge '0' -a n -le '9' ] 表示 判断n是否大于等于0且小于等于9 | |
-a | 与 运算符,都成立才成立 |
-o | 或 运算符,一个成立就成立 |
! | 非 运算符,取反 |
四、shell script的默认变量
1 $0: 脚本文件名;$1,$2,...,$i,第i个参数; 2 $#: 参数个数;$@:表明“ "$1"、"$2"、"$3"、...”,每一个变量是独立的;$*:表明“ "$1c$2$3c..." ”,c为分隔符,默认为空格; 3 shift: 参数变量号码偏移,shift n 表示将全部变量的变量号码左移n位,变量计数始终从$1开始;
4、条件判断式
一、if ... then
1 if [ expr1 ]; then 2 dosomething 3 elif [ expr2 ]; then 4 dosomething 5 ... 6 else 7 dosomething 8 fi
注意:条件表达式能够用 && 、|| 链接起来进行复合判断,做用与 -a、-o 同样
二、case ... esac
1 case $变量名 in 2 "var1") 3 dosomething 4 ;; 5 "var2") 6 dosomething 7 ;; 8 ... 9 *) 10 dosomething 11 ;; 12 esac
三、使用函数(function)
1 function fname() 2 { 3 dosomething 4 }
注意:函数的内置变量与shell script的默认变量相似
5、循环
一、while do done
1 while [ condition ] 2 do 3 dosomething 4 done
二、until do done
1 until [ condition ] 2 do 3 dosomething 4 done
三、for...do...done
1 for var in con1 con2 ... 2 do 3 dosomething 4 done
5 for ((初始值;限制值;执行步长)) --用于数值处理 6 do 7 dosomething 8 done
补充:使用 seq a b 能够生成a到b的连续序列(整数)
6、shell script的追踪与调试
1 用法:bash [-nvx] script.sh 2 参数: 3 -n :不要执行,仅查询语法问题 4 -v :在执行前,先将script的内容输出到屏幕上 5 -x :将使用到的script内容显示到屏幕上,最经常使用的参数
7、几个重要的命令(补充,持续更新...)
一、trap:信号处理
1 用法:trap cmd signal #在接收到signal信号后执行cmd命令 2 范例:trap rm tmpfile INT #接收到INT信号(Ctrl+C组合键引起)后删除tmpfile
二、find:查找文件
1 用法:find [path] [options] [tests] [actions] 2 功能:在 path 指定的目录下查找知足 options 和 tests 指定条件的文件,并执行 actions 指定的动做 3 options说明: 4 -depth #在查看目录自己以前先搜索目录的内容 5 -follow #跟随符号连接 6 -maxdepth N #最多搜索N层目录 7 -mount(或 -xdev) #不搜索其余文件系统中的目录 8 9 tests说明: 10 -atime N #文件在N天以前被最后访问过 11 -mtime N #文件在N天以前被最后修改过 12 -name pattern #文件名(不包括路径名)匹配提供的模式pattern,pattern必须用引号括起 13 -newer otherfile #文件比otherfile更新 14 -type c #文件类型为c,c是一个特殊类型,如d(目录)、f(普通文件)等 15 -user username #文件的拥有者是username指定的用户 16 17 还可使用操做符来进行组合测试 18 ! -not #测试取反 19 -a -and #与运算 20 -o -or #或运算 21 22 actions说明: 23 -exec command #执行一条命令,这个动做必须使用 \; 字符对来结束,经常使用!!! 24 -ok command #与-exec相似,但在执行前会针对每一个要处理的文件,提示用户进行确认,也必须使用 \; 字符对来结束 25 -print #打印文件名 26 -ls #对当前文件使用命令ls
27 说明:{}是-exec或-ok命令的一个特殊类型参数,它将被当前文件的完整路径取代 28 补充:-exec结合多个命令。-exec参数每次只能直接执行单个命令,可是咱们能够把多个命令写到一个script中,而后在-exec后将单个命令替换为执行script的命令,{}将做为script的参数传递给script 29 范例:find ./ -name "*.gch" -exec rm {} \; #在当前目录下递归查找文件名以 .gch 结尾的文件并删除他们
总结:shell的功能真的是很强大,刚开始学习就利用shell script快速地完成了不少操做,特别是用find命令来查找文件,屡试不爽啊!