概述:
shell是一个工具程序,在用户登录后后系统启动,它解释并运行由命令或脚本文件输入的命令,从而实现用户与内核之间的交互。bash是Linux操作系统上默认的shell,在交互和编程两方面,bash提供了许多Bourne shell没有的功能,并且还结合了C shell和Kron shell最有用的功能。
bash的语法和结构
1、shbang行:
shbang行是脚本的第一行,它通知内核使用哪种shell解释脚本中的行
#!/binbash
2、注释:
注释由一个#号后跟一些描述性的说明组成,它们可以从行的任意位置开始,在行的末尾结束。
2 #10user id add 20user id sum 3 #author:xiaoshui
3、显示输出
echo命令用于向屏幕显示输出,通配符必须使用反斜线和配对引号进行转意
1 #!/bin/bash 2 #function: hello world 3 #author:xiaoshui 4 echo "hello world"
4、局部变量
局部变量的作用域被限定在当前的shell中,当一个脚本执行结束,它们不可再用。也就是说它们超出了作用域,生效范围为当前shell进程中某代码片断(通常指函数)
5、本地变量
本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效。
[root@localhost ~]# var2=two //在当前shell中定义var2 [root@localhost ~]# chmod +x test1.sh [root@localhost ~]# ./test1.sh one [root@localhost ~]# vi test1.sh 1 #!/bin/bash 2 #test local var 3 var1=one 4 echo "$var1" 5 echo "$var2" //显示不了父进程定义的var2
6、环境变量
生效范围为当前shell进程及其子进程
[root@localhost ~]# unset var2 //取消var2的值 [root@localhost ~]# export var2=two //设置var2为环境变量 [root@localhost ~]# ./test1.sh //执行test1脚本 one two [root@localhost ~]# vi test1.sh 1 #!/bin/bash 2 #test local var 3 var1=one 4 echo "$var1" 5 echo "$var2" //调用父进程的var2
显示所有环境变量:export,env,printenv
7、位置变量
$1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
[root@localhost ~]# vi v2.sh 1 #!/bin/bash 2 #function: test //此实验的目的就是为了测试$10是${10}还是$1+0 3 #author: xiaoshui 4 5 echo $10 6 echo $11 7 echo $12 8 echo "==========" 9 echo ${10} 10 echo ${11} 11 echo ${12} [root@localhost ~]# ./v2.sh a b c d e f g h i j k l a0 //很显然,结果为$1+0 a1 //同样结果为$2+1 a2 ========== j //显然此为${10} k //${11} l
上述例子表明,位置变量$1..$9中,变量引用没有问题,当到了$10以后,此时如果不把10用花括号括住,则会被识别为$1+#(#为数字)
8、特殊变量
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
[root@localhost test]# vi test2.sh 1 #!/bin/bash 2 # test 3 echo "file name: $0" 4 echo "first argue: $1" 5 echo "two argue: $2" 6 echo "all argues: "$*"" 7 echo "all argues: "$@"" 8 echo "argue numbers: $#" 9 touch file_"$*" //利用touch来测试$*和$@的区别, 10 touch file."$@" // [root@localhost test]# ./test2.sh 1 2 3 file name: ./test2.sh first argue: 1 two argue: 2 all argues: 1 2 3 all argues: 1 2 3 argue numbers: 3 [root@localhost test]# ll total 4 -rw-r--r-- 1 root root 0 Aug 12 16:28 2 //词尾$@第二个 -rw-r--r-- 1 root root 0 Aug 12 16:28 3//此为$@第三个 -rw-r--r-- 1 root root 0 Aug 12 16:28 file.1//此为$@第一个 -rw-r--r-- 1 root root 0 Aug 12 16:28 file_1 2 3//仔细观察可以发现此为$* -rwxr-xr-x 1 root root 189 Aug 12 16:28 test2.sh
由上述例子可以得出,$*全部参数合为一个字符串,$@每个参数为独立字符串
课后作业:
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。
2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中
3、编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值
4、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
5、写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和
6、写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和
7、写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件
7、写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
8、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
9、chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写
10、编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。
11、写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问
12、计算1+2+3+…+100的值
13、计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之
备注:第十一题和第十三题注释区域有疑问。
原创文章,作者:我的滑板鞋,如若转载,请注明出处:http://www.178linux.com/34005
评论列表(1条)
总结的很详细,思路很清晰,作业完成的很用心,再接再厉,