for
依次访问列表里的元素。
由空格或回车分隔的串就是列表。
for var in 列表 ; do
done
列表的生成方式
-
直接写:
for num in 1 2 3 4 5 6 ist in ; do done for username in us1 us2 us3 ist in ; do done
-
展开
for num in {1..2}; do echo $num done
-
使用seq命令生成
seq [OPTION]... LAST seq [OPTION]... FIRST LAST seq [OPTION]... FIRST INCREMENT LAST
FIRST:起始
INCREMENT:步长
LAST:结尾
例子:
# seq 2 1 2 # seq 3 1 2 3 # seq 2 4 2 3 4 # seq 2 3 9 2 5 8
for n1 in `seq 20 22`; do echo -n "$n1" done
-
命令的返回值是列表
ls
,cat
命令的返回值都是列for var in `ls /root`; do echo $var done for var in `cat /etc/fstab `; do echo $var done
-
glob也能返回列表
for var in /etc/pu*; do echo $var done
-
变量引用:$@,$*
name=/etc/pu* name=`ls -d /etc/p*` name=`cat /etc/fstab` for var in $name; do echo $var done
for练习
1,分别求100以内所有偶数之和,所有奇数之和
#!/bin/bash
declare -i sum1=0
declare -i sum2=0
for var in {1..100}; do
if [ $[var % 2] -eq 0 ]; then
sum1=$[$sum1+$var]
else
sum2=$[$sum2+$var]
fi
done
echo $sum1,$sum2
2,计算当前系统上的所有用户的id之和
#!/bin/bash
declare -i sum=0
for var in `cat /etc/passwd | cut -d: -f3`; do
sum=$[$sum+$var]
done
echo $sum
3,参数是一个目录,计算此目录下所有文本文件的行数之和,并有多少文本文件
#!/bin/bash
declare -i sum=0
declare -i lines=0
#在参数1后面加了/*,也就是取得给定目录下的所有文件
for var in $1/*; do
#file命令的返回值,如果是文本文件,则返回值里有字符串ASCII
#如果是可执行文件,则返回值里有字符串ELF
if [[ `file $var` =~ ASCII ]]; then
sum=$[$sum+1]
#wc -l得到文本文件的行数,使用了重定向
lines=$[$lines+$[`wc -l < $var`]]
fi
done
echo "ascii lines is: $lines"
echo "acsii file's number is $sum"
emacs 生成for代码块的快捷键:c-c c-f
特殊用法:for ((i=0;i<=100;i++)); do
#!/bin/bash
#
declare -i sum=0
for ((i=0;i<=100;i++)); do
let sum+=$i
done
echo $sum
while
语法:
条件为真则进入循环体。
while condition; do
done
例子:求1到100的整数之和。
#!/bin/bash
declare -i sum=0
declare -i i=1
# -le是小于等于
while [ $i -le 100 ]; do
let sum+=$i
let i++
done
echo $sum
emacs 生成while代码块的快捷键:c-c c-w
特殊用法:读取文件的每一行
while read VAR; do
done < /path/from/file
例子:找出ID号为偶数的用户,显示其用户名,id和默认shell
#!/bin/bash
#
while read lines ;do
username=`echo $lines | cut -d: -f1`
userid=`echo $lines | cut -d: -f3`
usershell=`echo $lines | cut -d: -f7`
if [ $[$userid % 2] -eq 0 ]; then
echo "userid:$userid,username:$username, shell:$usershell"
fi
done < /etc/passwd
until
语法:
条件为假则进入循环体。
until condition; do
done
例子:求1到100的整数之和。
#!/bin/bash
declare -i sum=0
declare -i i=1
until [ $i -gt 100 ]; do
let sum+=$i
let i++
done
echo $sum
循环控制
- continue:结束本次循环
- break:结束整个循环
emacs 生成while代码块的快捷键:c-c c-u
练习:分别使用for,while,until实现
1,分别求100以内所以偶数之和,100以内所以奇数之和
-
for实现:
#!/bin/bash declare -i sum=0 for i in `seq 0 2 100` ; do let sum+=i done echo $sum declare -i sum1=0 for i in `seq 1 2 100` ; do let sum1+=i done echo $sum1
-
while实现:
#!/bin/bash declare -i i=0 declare -i sum=0 while [ $i -le 100 ]; do let sum+=i let i+=2 done echo $sum declare -i i1=1 declare -i sum1=0 while [ $i1 -le 100 ]; do let sum1+=i1 let i1+=2 done echo $sum1
-
unitl实现:
#!/bin/bash declare -i i=0 declare -i sum=0 until [ $i -gt 100 ]; do let sum+=i let i+=2 done echo $sum declare -i i1=1 declare -i sum1=0 until [ $i1 -gt 100 ]; do let sum1+=i1 let i1+=2 done echo $sum1
2,创建10个用户,user101~user110,密码同用户名
-
for实现:
#!/bin/bash for i in {100..110} ; do if `id user$i &> /dev/null` ; then echo "user:user$i exist!" exit 1 fi #-M选项:不创建家目录 useradd -M "user$i" &> /dev/null && echo "user$i" | passwd --stdin "user$i" > /dev/null done
-
while实现:
#!/bin/bash declare -i i=100 while [ $i -le 101 ]; do if `id user$i &> /dev/null` ; then echo "user:user$i exist!" exit 1 fi useradd -M "user$i" &> /dev/null && echo "user$i" | passwd --stdin "user$i" > /dev/null let i+=1 done
3,每隔2秒检测ys用户是否登录了,如果发现其登录了,则退出循环。
#!/bin/bash
#
while [ true ]; do
if `who | grep ays &> /dev/null`; then
break
fi
sleep 2
done
echo `date +"%F %T"` ays logged on >> /tmp/userlogon.log
查看/tmp/userlogon.log
# cat /tmp/userlogon.log
2018-05-25 11:29:21 ays logged on
2018-05-25 11:29:37 ays logged on