字串比较时变量最好使用""
这样就不会报错了,只是退出码不为0
组合条件:
与:[ condition1 -a condition2 ]或condition1 && condition2
或:[ condition1 -o condition2 ]或condition1 || condition2
非:[ -not condition ]或者 ! condition
练习:如果当前主机的主机名为空,或为'localhost',将其修改为www.magedu.com
练习:如果某用户存在,且answer变量的值为"yes",则显示用户的id号,否则,说用户选择了退出
if id $userName &> /dev/null && [ "$answer" == "yes" ];then
…
fi
练习:给定一个用户,如果其shell为/bin/bash,且其id号大于等于500,则说明这是一个可登陆普通用户,否则,显示其为非登陆用户或管理员
写脚本:
1、查看传递参数个数
2、判断参数类型等
3、逻辑等
练习:
如果某用户不存在,则添加之
练习:
1、添加10个用户,如果用户不存在,则添加,如果存在就显示已经有此用户
2、显示一共添加了多少个用户
练习:
1、添加10个用户,如果用户不存在,则添加并以绿色显示添加成功,如果存在就显示已经有此用户并以红色显示
2、显示一共添加了多少个用户
文件测试:
-a file:文件存在则为真
-e file:文件存在则为真
以上两者可能是文件、目录、链接
-f file:文件存在并且是普通文件则为真
-d file:存在并且为目录文件则为真
-h/L file:存在并且为符号链接则为真
-b file:存在并且为块设备则为真
-c file:存在并且为字符设备则为真
-S file:存在并且为套接字则为真
-p file:存在并且为管道则为真
-s file:存在并且为非空文件则为真
-r file:存在并且可读则为真
-w file:存在并且可写则为真
-x file:存在并且可执行则为真
-N file:存在并且mtime比atime新
file1 -nt file2:file1比file2新则为真
file1 -ot file2:file1比file2旧则为真
file1 -ef file2:file1比file2新则为真
练习:如果wget命令对应的可执行文件存在且可执行,则使用它下载http://172.16.0.1/centos6.5.repo至当前目录中
练习:给定一个文件路径,判断此文件是否存在,不存在则说明文件不存在直接结束脚本;如果文件是一个普通文件,则显示为“regular file”,如果文件是目录,则显示为“directory”,如果文件是链接文件,则显示为“symbolic file”,否则显示为“unknown”
练习:脚本完成以下任务
1、分别复制/var/log下的文件至/tmp/logs目录
2、复制目录时,才使用cp -r
3、复制文件,使用cp
4、复制链接,使用cp -d
5、余下的类型,使用cp -a
写一个脚本,完成如下任务,其使用形式如下所示:
script.sh {start|stop|restart|status}
其中:
如果参数为空,则显示帮助信息,并退出脚本;
如果参数为start,则创建空文件/var/lock/subsys/script,并显示“starting script successfully.”
如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script successfully.”
如果参数为restart,则删除文件/var/locksubsys/script并重新创建,而后显示“Restarting script successfully.”
如果参数为status,那么:
如果文件/var/lock/subsys/script存在,则显示“Script is running…”,否则,则显示“Script is stopped.”
说明:script.sh是脚本文件名,在创建时,其名称可以自己随意定义,但如果其名称发生变量,上/var/lock/sussys/下的文件名也要随之而变;
交互编程:
read
-p:"提示"
-t:超时
例子:显示一个如下菜单给用户:
cpu) show cpu infomation
mem) show memory infomation
*) quit
1、如果用户选择了cpu,则显示/proc/cpuinfo文件的内容;
2、如果用户选择了mem,则显示/proc/meminfo文件的内容;
3、退出
或者
生成菜单第二种方法更易用
字符串中的模式匹配:
=~:模式匹配
用法:[[ "$var" =~ pattern ]]
例如:让用户给定一个用户名,判断其是否拥有可登录shell;
练习:写一个脚本,完成如下功能
使用格式:
script.sh /path/to/somefile
1、可接受一个文件路径参数:
如果此文件不存在,则创建之,则自动为其生成前n行类似如下:
#!/bin/bash
# description:
# version:
# date:
# author: mageedu
# license: GPL
而后使用vim打开此文件,并让光标处在最后一行的行首
如果文件存在、且是bash脚本,则使用vim打开之,光标自动处行最后一行的行首;
否则,退出;
如果正常编辑保存,
判断,如果文件没有执行权限,则添加之;
判断,其是否有语法错误,如果有,提示;
while和until循环:
for循环劣势:
1、先要在内存中生成列表,如果列表很大,就很占内存
2、循环次数不定,无法适合这种场景
while适用于循环次数位置或不便用for直接生成较大的列表时
格式:
1、次数已知
while 测试条件;do
循环体
done
如果测试条件为真,则进入循环;退出条件为,测试条件为假
declare -i count=1
while $count <= 100;do
循环体
let count++
done
until:
until 测试条件;do
循环体
done
如果测试条件结果为假,则进入循环,退出条件为,测试条件为真
练习:求100以内所有正整数之和
练习:求100以内所有偶数之和,使用取模方式实现
练习:提示用户输入一个用户名,如果用户存在,就显示用户的id号或shell,否则显示用户不存在,显示完成之后不退出,再次重复前面的操作,直到用户输入q或quit为止
2、
循环高级:
for的第二种使用格式:
for ((初始条件;测试条件;修改表达式));do
循环体
done
练习:求100以内所有正整数之和
while的实现方式:
#!/bin/bash
declare -i count=1
declare -i sum=0
while [ $count -lt 100 ];do
let sum+=$count
let count++
done
echo $sum
for的实现方式:
#!/bin/bash
declare -i sum=0
for ((count=1;$count <= 100;count++));do
let sum+=$count
done
echo $sum
变量在赋值时都不用加$,在比较时需要加
练习:求100以内所有偶数之和
#!/bin/bash
declare -i sum=0
for ((count=2;$count <= 100;count+=2));do
let sum+=$count
done
echo $sum
while循环:遍历文本文件
格式:
while read i;do
echo $i
done < file
练习:显示id号为偶数的用户的用户名、id、shell
练习:显示id号为偶数,且id号同gid的用户的用户名、id、shell
练习:显示当前系统上所有挂载的文件系统中空间使用百分比大于10的文件系统
bash编程至case
写一个脚本,使用格式:
1、start:创建/var/lock/subsys/script.sh
2、stop:删除此文件
3、restart:先删除文件,再创建文件
4、status:如果文件存在,显示running,否则显示stopped
case语句:有多个测试条件时,case语句会使得语法结构更明晰
case 变量引用 in
pattern1)
分支1
;;
pattern2)
分支2
;;
…
*)
分支n
esac
pattern:类同于文件名通配机制,但支持使用|表示或者
a|b:a或b
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:指定范围内的任意单个字符
练习:用户键入字符后判断其所属的类别
练习:写一个脚本,对/etc/目录及内部的所有文件打包压缩
1、显示一个菜单,让用户选择使用的压缩工具
xz)xz compress tool
gz)gzip compress tool
bz2)bzip2 compress tool
2、根据用户选择的工具,对/etc/执行相应的操作并保存至/backups目录,文件形如/backups/etc-日期时间.tar.压缩后缀
练习:写一个脚本,使用形式如下
showifinfo.sh [-i interface|-a] [-v]
要求:
1、-i或-a不可同时使用,-i用于指定特定网卡接口,-a用于指定所有接口
显示接口的ip地址
2、使用-v,则表示显示详细信息
显示接口的ip地址、子网掩码、广播地址
3、默认表示仅使用-a选项
原创文章,作者:黑白子,如若转载,请注明出处:http://www.178linux.com/47622