Linux系统下的shell默认为bash,所以在写脚本的时候首行一定要是#!/bin/bash,这一行用于声明使用/bin/bash作为脚本语言。
脚本文件中,所有以#开头的行均为注释行,不会被执行。
这是一个脚本,实现功能的很简单,显示This is a test shell
vim shell.sh
1 2 3 4 5 6 | #!/bin/bash # Discribe:This is a test shell. # Version 0.0.1 # Author:Myb # DATE 2014-3-24 echo " This is a test shell." |
:wq保存退出
bash –n shell.sh检查脚本的语法错误,不执行脚本。如果没有错误,则不会显示任何信息。
在linux下没有返回信息很多时候都会是最好的消息。
chmod +x shell.sh 赋予shell.sh执行权
./shell.sh 或者 /bin/bash shell.sh执行脚本
1 2 3 4 5 | [root@myb362 ~] # bash -n shell.sh [root@myb362 ~] # chmod +x shell.sh [root@myb362 ~] # ./shell.sh This is a test shell. [root@myb362 ~] # |
比如,添加一个用户名user1,密码与用户名相同。
如果不使用脚本的话,这也是一个非常简单的操作。
1 2 3 4 5 | [root@myb362 ~] # useradd user1 [root@myb362 ~] # echo user1 | passwd --stdin user1 Changing password for user user1. passwd : all authentication tokens updated successfully. [root@myb362 ~] # |
这样就添加了一个用户user1,,并且密码与用户名相同。
写入脚本中,就会是这样的
1 2 3 4 5 6 7 8 | #!/bin/bash # Discribe:This is a test shell. # Version 0.0.1 # Author:Myb # DATE 2014-3-24 echo " This is a test shell for add user user2." useradd user2 echo user2 | passwd --stdin user2 |
:wq保存退出,执行./shell.sh,查看passwd文件看出user2已经添加成功。
1 2 3 4 5 6 | [root@myb362 ~] # ./shell.sh This is a test shell for add user user2. Changing password for user user2. passwd : all authentication tokens updated successfully. [root@myb362 ~] # cat /etc/passwd | grep "^user2" user2:x:6007:6007:: /home/user2 : /bin/bash |
for循环
事先提供一个元素列表,而后,使用变量去遍历此元素列表,每访问一个元素,就执行一次循环体,直到元素访问完毕。
用法格式一:
1 2 3 4 5 | for VAR_NAME in 元素 1 元素 2 …; do 语句 1 ; 语句 2 ; … done |
格式二:
for (( expr1 ; expr2 ; expr3 )); do
循环体
done
例如:添加3个用户user3、user4、user5就可以使用for循环语句来实现添加
useradd.sh脚本
1 2 3 4 5 6 7 | #!/bin/bash # # for i in user3 user4 user5; do # for 循环控制遍历列表为user3 user4 user5 将遍历列表中的值传参给i useradd $i #添加用户$i,$i 从遍历列表中逐个取出 echo $i | passwd --stdin $i #给用户赋予密码 --stdin将echo中的值传参给passwd命令 done |
sh –n useradd.sh 检查语法错误,赋予执行权限 chmod +x useradd.sh 并执行 ./useradd.sh
用户user3,user4,user5 添加成功
这样可以大大的减少我们需要输入的命令
表中user3、user4、user5只有最后一位数字变化,那么我们为了减少输入字符的长度,还可以这样写。
1 2 3 4 5 6 | #!/bin/bash # for i in 3 4 5; do useradd user$i echo user$i | passwd –-stdin user$i done |
这样也是可以执行成功的,前提是你需要删除你的user3、4、5用户,
userdel –r user3 user4user5
比如需要添加100个用户,将100个用户写入列表中,可以采用以下方式:
1、逐个给出,如:user1 user2 user3
2、使用通配符实现文件通配,如:for File in /var/*
比如我想要查看/var目录下的所有文件类型
使用for语句查看
1 2 3 4 5 6 7 | [root@myb362 ~] # vi filetype.sh #!/bin/bash # # for File in /var/ *; do file $File done |
添加执行权限 chmod +x filetype.sh ./filetype.sh查看文件类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@myb362 ~] # ./filetype.sh /var/cache : directory /var/cvs : directory /var/db : directory /var/empty : directory /var/games : directory /var/lib : directory /var/local : directory /var/lock : directory /var/log : directory /var/mail : symbolic link to `spool /mail ' /var/nis : directory /var/opt : directory /var/preserve : directory /var/run : directory /var/spool : directory /var/tmp : sticky directory /var/yp : directory |
3.使用命令生成列表,还以上一个示例来说
1 2 3 4 | #!/bin/bash for File in ` ls /var/ ` ; do # ls /var/ 列出var目录下的所有文件当遍历列表 file /var/ $File #这里别忘记了在$File前面加上文件的目录/var/ done |
显示结果一样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [root@myb362 ~] # ./filetype2.sh /var/cache : directory /var/cvs : directory /var/db : directory /var/empty : directory /var/games : directory /var/lib : directory /var/local : directory /var/lock : directory /var/log : directory /var/mail : symbolic link to `spool /mail ' /var/nis : directory /var/opt : directory /var/preserve : directory /var/run : directory /var/spool : directory /var/tmp : sticky directory /var/yp : directory |
4.生成数字列表
{}:{起始数字..结束数字},例如{1..100}表示从1到100
`seq [起始数字] [步长] 结束数字`
例如:`seq 1 2 100` 从1开始,步长为2,到100结束
结果: 1 3 5 7 9 …
比如:使用for循环添加10个用户,用户名从user11-20,并添加密码,密码同用户名。
1 2 3 4 5 6 7 8 | [root@myb362 ~] # vi useradd2.sh #!/bin/bash # # for User in ` seq 11 20`; do useradd user$User echo user$User | passwd --stdin user$User done |
:wq保存退出
chmod +x 添加执行权限 ./useradd2.sh执行脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | [root@myb362 ~] # chmod +x useradd2.sh [root@myb362 ~] # ./useradd2.sh Changing password for user user11. passwd : all authentication tokens updated successfully. Changing password for user user12. passwd : all authentication tokens updated successfully. Changing password for user user13. passwd : all authentication tokens updated successfully. Changing password for user user14. passwd : all authentication tokens updated successfully. Changing password for user user15. passwd : all authentication tokens updated successfully. Changing password for user user16. passwd : all authentication tokens updated successfully. Changing password for user user17. passwd : all authentication tokens updated successfully. Changing password for user user18. passwd : all authentication tokens updated successfully. Changing password for user user19. passwd : all authentication tokens updated successfully. Changing password for user user20. passwd : all authentication tokens updated successfully. [root@myb362 ~] # cat /etc/passwd | grep "^user" user2:x:6007:6007:: /home/user2 : /bin/bash user3:x:6008:6008:: /home/user3 : /bin/bash user4:x:6009:6009:: /home/user4 : /bin/bash user5:x:6010:6010:: /home/user5 : /bin/bash user11:x:6011:6011:: /home/user11 : /bin/bash user12:x:6012:6012:: /home/user12 : /bin/bash user13:x:6013:6013:: /home/user13 : /bin/bash user14:x:6014:6014:: /home/user14 : /bin/bash user15:x:6015:6015:: /home/user15 : /bin/bash user16:x:6016:6016:: /home/user16 : /bin/bash user17:x:6017:6017:: /home/user17 : /bin/bash user18:x:6018:6018:: /home/user18 : /bin/bash user19:x:6019:6019:: /home/user19 : /bin/bash user20:x:6020:6020:: /home/user20 : /bin/bash |
添加成功。
由于输出信息多,我们不想让他输出到屏幕上,可以在命令后添加&>/dev/null,信息就不会输出到屏幕上。
如下
1 2 3 4 5 6 7 8 | [root@myb362 ~] # vi useradd2.sh #!/bin/bash # # for User in ` seq 11 20`; do useradd user$User &> /dev/null echo user$User | passwd --stdin user$User &> /dev/null done |
这样无论错误输出和标准输出都不会输出到屏幕上了。如有疑问,请自行google标准输入、标准输出、错误输出、输入重定向和输出重定向。
想起了一个非常经典的题目,从1加到100,计算总和。
在shell脚本中进行算术运算。
1、shell不支持浮点数、计算结果中的浮点数会被圆整为整数:1.23=1 1.99=1
2、shell运算符
+(加)
-(减)
*(乘)
/(除)
%(取余)
3、算术运算的实现方式:假如 A=5,B=9
$[expression]: 例如:$[$A+$B]
$((expression)):例如:$(($A+$B))
let expression:例如:let E=$A+$B
expr expression:例如:F=`expr $A + $B`
一般在脚本中比较常用的是第一种和第三种方式。
写一个脚本计算1加到100的值
1 2 3 4 5 6 7 8 | #/bin/bash # # Sum=0 # 定义一个变量等于0 for i in {1..100}; do #定义列表范围从1-100 Sum=$[$Sum+$i] # done echo “Sum is $Sum” |
保存退出,赋予执行权限,执行脚本。结果如下
1 2 3 | [root@myb362 ~] # ./sum.sh Sum is 5050 [root@myb362 ~] # |
Sum=$[$Sum+$i] 解释:
第一次循环时,$Sum=0 $i=1 $[$Sum+$i]=1 然后将1重新赋值给Sum,
第二次循环时,$Sum=1 $i=2 $[$Sum+$i]=3 然后将3重新赋值给Sum,
第三次循环时,$Sum=3 $i=3 $[$Sum+$i]=6 然后将6重新赋值给Sum,
……
直至循环体结束。
那求100以内所有奇数的和、偶数的和也是使用这种方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@myb362 ~] # vi sum2.sh #!/bin/bash EvenSum=0 OddSum=0 for i in ` seq 1 2 100`; do #列表为1 3 5 7 9 … OddSum=$[$OddSum+$i] done for i in ` seq 2 2 100`; do EvenSum=$[$EvenSum+$i] #列表为2 4 6 8 10 … done echo "OddSum:$OddSum" echo "EvenSum:$EvenSum" |
赋予权限,执行。结果如下:
1 2 3 4 | [root@myb362 ~] # chmod +x sum2.sh [root@myb362 ~] # ./sum2.sh OddSum:2500 EvenSum:2550 |
这是使用for循环语句来实现1到100之间的奇偶数之和的方法。
参考:http://mybsir.blog.51cto.com/4618614/1383903
转载于:https://blog.51cto.com/hao360/1384046