Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户能够用Shell来启动、挂起、中止甚至时编写一些程序。Shell仍是一个功能至关强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中能够直接调用Linux系统命令java
for循环的运做方式,是讲串行的元素意义取出,依序放入指定的变量中,而后重复执行含括的命令区域(在do和done 之间),直到全部元素取尽为止。
其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。
web
for #条件 do #执行命令 done #结束
行1,讲串行中的字段迭代放入变量中
行2-4,接着将重复执行do和done之间的命令区域,直到串行中每个字段军处理过为止。shell
#!/bin/bash for ((a=10;a>0;a--)) do echo -n " TIME $a" echo -ne "\r " #不换行覆盖输出 sleep 1 done
echo [-ne][字符串]或 echo [--help][--version] 补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开, 并在最后加上换行号。 参 数: -n 不要在最后自动换行 -e 若字符串中出现如下字符,则特别加以处理,而不会将它当成通常 文字输出: \a 发出警告声; \b 删除前一个字符; \c 最后不加上换行符号; \f 换行但光标仍旧停留在原来的位置; \n 换行且光标移至行首; \r 光标移至行首,但不换行; \t 插入tab; \v 与\f相同; \\ 插入\字符; \nnn 插入nnn(八进制)所表明的ASCII字符; --help 显示帮助 --version 显示版本信息 范例 : [root@localhost ~]# echo "what is your name "
[root@server1 ~]# vi 1.txt tom jerry wendy [root@server1 ~]# vim 1.sh #!/bin/bash a=$(cat /root/1.txt) for b in $a do useradd $b echo "654321" | passwd --stdin $b echo "建立{$b}完成" done [root@server1 ~]# sh 1.sh 更改用户 tom 的密码 。 passwd:全部的身份验证令牌已经成功更新。 建立{ tom}完成 更改用户 jerry 的密码 。 passwd:全部的身份验证令牌已经成功更新。 建立{ jerry}完成 更改用户 wendy 的密码 。 passwd:全部的身份验证令牌已经成功更新。 建立{ wendy}完成
语法2:编程
for ((初始化;;循环控制条件;变量变化)) do 程序 done
须要注意如下几点:vim
初始值:在循环开始时,须要给某个变量赋予初始值,如 i=1。bash
循环控制条件:用于指定变量循环的次数,i<=100,则只要 i 的值小于等于 100,循环就会继续。编程语言
变量变化:每次循环以后,变量该如何变化,如 i=i+1,表明每次循环以后,变量的值都加 1。svg
语法二和其余语言中的 for 循环相似,也就是事先决定循环次数的固定循环。先举一个简单的例子。
+、-、*、/测试
(++) 自身变量+1spa
(- -)自身变量-1
(+=5) 自身变量
(-=)5 自身变量-5
( * )5自身变量*5
lt 能够单独使用 % 自身变量 %5
+=5 自身变量 +5自身变量 %5
-=5 自身变量-5 * 5自身变量*5
/= 自身变量/5
##continue和break区别)# 1.14:100之内不能整除3的数
[root@server1 ~]# vim c.sh #!/bin/bash i=100 while [ $i -gt 0 ] do if [ `expr $i % 3` -eq 0 ];then let i-- continue else echo -n " $i" fi let i-- done [root@server1 ~]# sh c.sh 100 98 97 95 94 92 91 89 88 86 ……
let 对整数进行数学运算
let和双小括号 (( )) 同样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。
语法格式 let 表达式 或 let "表达式" 或 let '表达式' 以上方式都等价于 ((表达式))
while 循环主要用于无限次的循环状况,例如登陆认证,你不知道多少次能够登陆成功,固然能够认为限制登陆次数。
#!/bin/bash i=0 while [ $i -le 10 ] do echo $i let i++ done [root@server1 ~]# sh d.sh 0 1 2 3 4 5 6 7 8 9 10
while true:死循环有时候也有奇效,可与用户交互
#!/bin/bash while true do read -p '输入tom才可退出:' a if [ $a = tom ] then break fi done echo '退出' [root@server1 ~]# sh f.sh 输入tom才可退出:a 输入tom才可退出:tom 退出 [root@server1 ~]#
用户名称以shuai开头,按照顺序进行排序
一共添加了5个帐户,即hua1…hua5
#!/bin/bash a=0 while [ $a -le 5 ] do let a++ useradd tom$a echo "123123" | passwd --stdin tom$a &> /dev/null echo "tom$添加完毕" done echo "结束" [root@server1 ~]# sh g.sh tom$添加完毕 tom$添加完毕 tom$添加完毕 tom$添加完毕 tom$添加完毕 tom$添加完毕 结束
#!/bin/bash num=1 while [ $num -lt 10 ] do a=$(expr $num \* $num) echo $a let num++ done [root@server1 ~]# sh 2.sh 1 4 9 16 25 36 49 64 81
猜商品价格游戏
经过变量RANDOM得到随机数
提示用户猜想并记录次数,猜中后退出循环
#!/bin/bash #猜商品价格 RR=$(expr $RANDOM % 1000) #$RANDOM 生成1000之内的随机数 i=0 echo "猜价格游戏" while true do read -p "请输入商品价格(0-999):" num let i++ if [ $num -eq $RR ];then echo "恭喜猜中了" echo "恭喜猜中了$i" break elif [ $num -gt $RR ];then echo "猜高了" else echo "猜低了" fi done [root@server1 ~]# sh 3.sh 猜价格游戏 请输入商品价格(0-999):500 猜高了 请输入商品价格(0-999):255 猜低了 请输入商品价格(0-999):400 猜高了 请输入商品价格(0-999):350 猜高了 请输入商品价格(0-999):300 猜高了 请输入商品价格(0-999):275 猜低了 请输入商品价格(0-999):285 猜低了 请输入商品价格(0-999):293 猜低了 请输入商品价格(0-999):296 猜低了 请输入商品价格(0-999):299 恭喜猜中了 一共猜了了10次
break 命令能够带一个参数,一个不带参数的break 循环只能退出最内层的循环,而break N能够退出N 层循环
continue 命令也能够带一个参数,一个不带参数的continue 命令只去掉本次循环的剩余代码,而continue N 将会把N 层循环剩余的代码都去掉,可是循环的次数不变
#!/bin/sh for i in a b c d do echo echo -n "$i " for j in `seq 10` do if [ $j == 5 ]; then # break # break 2 # continue continue 2 fi echo -n "$j " done echo done echo
break结果: a 1 2 3 4 b 1 2 3 4 c 1 2 3 4 d 1 2 3 4 break 2的结果: a 1 2 3 4 continue结果: a 1 2 3 4 6 7 8 9 10 b 1 2 3 4 6 7 8 9 10 c 1 2 3 4 6 7 8 9 10 d 1 2 3 4 6 7 8 9 10 continue 2的结果: a 1 2 3 4 b 1 2 3 4 c 1 2 3 4 d 1 2 3 4 # 四:untli循环语句 !
重复测试某个条件,只要条件不成立则反复执行
until 条件测试操做
do
命令序列
done
while 未超过20 do 数字依次增长 done:
行1,若是条件测试结果为假(传回值不为0),就进入循环。
行3,执行命令区域。这些命令中,应该有改变条件测试的命令,这样子,才有机会在有限步骤后结束执行until 循环(除非你想要执行无穷循环)。
行4,回到行1,执行until命令
经过循环累计的方式计算1-20的和
until跟whlie相反是命令不成立就会进入循环=whlie前面加!
#!/bin/bash k=1 s=0 until [ $k -eq 11 ] #当取值为21就会成立就不会进入循环' do let s+=$k let k++ done echo "和:$s" [root@server1 ~]# sh b.sh 和:55
为指定用户发送在线消息
#!/bin/bash username=$1 #判断格式参数是否为空 if [ $# -lt 1 ] then echo "Usage:`basename $0` <username> [<message>]" exit 1 fi #判断帐号是否存在 if grep "^$username:" /etc/passwd &> /dev/nell;then : else echo "用户不存在" exit 2 fi #判断用户是否在线 until who | grep "$username" &> /dev/null do echo "用户不在线,正在尝试链接" sleep 5 done ------------------------------------------------ `basename $0`值显示当前脚本或命令的名字 Message:定义发送内容
oot@localhost opt]# bash test.sh Usage:test.sh <username> [<message>] #测试不存在用户 [root@localhost opt]# sh test.sh sushan 用户不存在 #用户不在线时 [root@localhost opt]# ./mes.sh sushan 用户不在线,正在尝试链接 用户不在线,正在尝试链接 用户不在线,正在尝试链接
准备了好多天肝了出来 若是以为对您有用的话,点个赞再走吧!!!