shell的进阶编程
关于for
??for 变量名字 in 列表;do
????循环体
??done
??例如for: for NAME [in WORDS ... ] ; do COMMANDS; don
其中前面的name就是个变量名,而且不需要加$,每次循环和中间列表中的值有关,中间的列表可以使用花括号来表示指定范围,也可以使用一些命令来生成列表,但是需要加$(),要把前面的变量名和后面的循环体连接起来。例如:
??[[email?protected] data]#touch f1,txt
??[[email?protected] data]#touch f2.txt
??[[email?protected] data]#touch f3.txt
??[[email?protected] data]#for file in *.txt;do echo
??filename is $file;done
??filename is f2.txt
??filename is f3.txt
??其中的通配符来表示的话是不需要加双引号的。
??但是如果要在脚本里面引用文件可以使用命令cat filename
,前提是命令需要反向单引号。例如:
??#!/bin/bash
??for USER in ` cat userlist.txt
;do
????useradd $USER
??done
??如果说数据量比较大的话可以实行并行运行,使用{}
括起来然后最后加&
,例如:
??#!/bin/bash
??NETID=172.16.128
??for HOSTID in {1..245};do
???? {
????if ping -c1 -w1 $NETID.$HOSTID &> /dev/null;then
??????echo $NETID.$HOSTID is up | tee -a hostlist.txt
????fi
???? } &
??done
??wait
??for也是可以套嵌的,例如:
??#!/bin/bash
??for i in {1..10};do
????for j in {1..10};do
??????echo -e ‘*c‘
????done
????echo
??done
关于for还可以使用(( ))
里面只要不是数字就认为是变量,例如:
??#!/bin/bash
??n=10
??for ((sum=0,i=1;i<=n;i++));do
????let sum+=i
??done
??echo sum=$sum
??像continue
只是临时结束一次循环,并不影响大循环。例如:
??#!/bin/bash
??for ((i=0;i<10;i++));do
???? if [ $i -eq 5 ];then
????continue
???? fi
????echo i=$i
??done
??如果说确定终止循环可以使用break
,但是并不是退出脚本,只是退出循环而已,退出脚本可以使用exit
。例如:
??#!/bin/bash
??for ((i=0;i<10;i++));do
????if [ $i -eq 5 ];then
??????break
????fi
????echo i=$i
??done
??这个例子就是打印到4,5以后就不再循环了,但是不会整个脚本的结束,以后的脚本还会继续运行。
??shift可以接连执行,例如创建不同用户吧:
??#!/bin/bash
??while [ "$1" ];do
???? useradd $1
???? echo user:$1 is created
????shift
??done
??echo finish
??这个脚本如果执行的话,后面跟几个用户名都可以创建。