期待已久的脚本终于在这一周学到了,对于脚本,我感觉就是有两点,第一:考验一个人的思维能力,如果能把你想要的结果用脚本正确的表示出来。第二:以前学的基础命令,怎么组合起来使用。达到以上两点,再难写的脚本都可以写出来的。
一、编写,执行一个脚本
脚本的格式
首行:#!/bin/bash (目前学到的就以这个开头,相当于进入了下一级bash)
不是首行:带#的都是注释
不带#的都是命令
规范的脚本
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
脚本的执行
需要给执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行
二、脚本调试
检测脚本中的语法错误
bash -n 脚本路径
调试执行
bash -x 脚本路径
三、变量
本地变量:仅对当前SHELL有效,对子SHELL也无效
直接输入A=123 设置本地变量
set查看本地和环境变量
环境变量:对当前SHELL及其子SHELL均有效。
export A=121 设置环境变量
declare -x varname=value 也是设置环境变量
env查看环境变量
export
位置变量:$1, $2, …来表示,用于让脚本在脚本代码 中调用通过命令行传递给它的参数
$0:命令本身
$*:传递给脚本的所有参数,全部参数合为一个字符串
$@:传递给脚本的所有参数,每个参数为独立的字符串
$#:传递给脚本的参数的个数
注释:$@ $* 只在被双引号包起来的时候才会有差异
set – – 清空所有位置变量
只读变量:readonly name 不能修改变量
readonly -p 查看只读变量
删除变量:unset name
四、 ps -ef 查看进程号 ps -ef |grep bash 查看bash的进程号
$:显示当前的PID
PPID:显示父进程的PID
SHLVL: 显示当前SHELL是几级bash
pstree 显示进程树
-p 同时显示进程的PID
五、转译
\完全转译
“” 部分转译 不转译 \ ` ! $
‘’ 完全转译
六、bash中的算数运算
+, -, *, /, %取模(取余), **(乘方)在bc当中乘方是^
实现算术运算:
(1)let var=算术表达式
let var++ 自加1 let var- – 自减1 let var+3 自加3
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 …) 乘法时要转译* ,即\*
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc
七、与,或,非 (true=1 false=2)
与:1与1=1
1与0=0
0与1=0
0与0=0
只要有一个假则为假
短路与 前一个为假,则不再判断第二个值
或:1或1=1
1或0=1
0或1=1
0或0=0
只要有一个真则为真
短路或,前一个为真,则不再判断第二个值
非:!1=0
!0=1
八、测试
测试命令
test expression
[ expression ]
[[ expression ]]
长格式的例子:
test “$A” == “$B” && echo “Strings are equal”
test “$A” -eq “$B” && echo “Integers are equal”
简写格式的例子:
[ “$A” == “$B” ] && echo “Strings are equal”
[ “$A” -eq “$B” ] && echo “Integers are equal
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必须使用测试命令进行
数值测试:
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
字符串测试:
= = 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的pattern所匹配
以上的表达式一般用在[[ ]]中
-z 检验字符串是否为空,空为真,非空为假
-o 与-z相反
用于字符串比较时的用到的操作数都应该使用引号
文本权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
双目测试:
FILE1 -ef FILE2: FILE1与FILE2是否指向同一个设 备上的相同inode
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否旧于FILE
组合条件测试:
第一种方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必须使用测试命令进行
针对以上的内容做出了以下练习
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
针对此题就是考察一些命令的使用:查看主机名:hostname 查看系统版本:cat /etc/redhat-release 查看内核版本:uname -r 查看CPU型号:cat /proc/cpuinfo 查看内存大小:cat /proc/meminfo查看硬盘大小:fdisk -l
2、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
这个只是针对第十个用户和第二十个用户。
这个针对多个用户来说,只需要把grep后面的截取内容改了即可
3、编写脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
ping -c 是ping的结果显示几行,-W是几秒ping一次 &> 是把错误或者正确的结果都导入黑洞里面不显示结果
4、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
此题就是先把磁盘分区空间和inode的最大使用率给找出来,然后判断是否超过80%,然后用wall报警提醒用户。
5、编写脚本/root/bin/excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
此题就是先判断是否是普通文件,然后以取基名的方法把目录名字取出来,然后判断是否以sh后缀的既可以。
脚本的功能就是(1)自动化常用命令(2)执行系统管理和故障排除(3)创建简单的应用程序(4)处理文本和文件
脚本对于我们以后的工作非常方便,我们以后的工作大多数也都是写脚本的。所以对于这一块我们应该更加努力。
原创文章,作者:In summer,如若转载,请注明出处:http://www.178linux.com/83791