for loop statement
For loop syntax structure
List loop
List for loop: used to execute a set of commands a known number of times
Basic grammatical structure
#!/bin/bash
for i in a b c
do
echo $i
done
for i in {
1..10}
do
echo $i
done
#!/bin/bash
for i in $(seq 10)
do
echo $i
done
#!/bin/bash
for i in $(seq 1 2 10) # 设置步长
do
echo $i
done
Without list loop
When a for loop without a list is executed, the user specifies the parameters and the number of parameters
Basic grammatical structure
for i
do
command
command
…
done
Instance
#!/bin/bash
if [ $# -eq 0 ];then
echo "Usage: $0 加上参数"
fi
for i
do
echo $i
done
[root@maomao 3.27]# bash for.sh 1 2 3
1
2
3
#!/bin/bash
zhu=(2 4 6 8 10)
echo "${zhu[*]}"
fun() {
local niu=()
for i
do
niu[j++]=$[ $i * 5 ]
done
echo "${niu[@]}"
}
result=`fun ${
zhu[@]}`
echo "新数组的所有值:${result[@]}"
C-like for loop
Basic grammatical structure
for(( expr1;expr2;expr3 ))
do
command
command
…
done
for (( i=1;i<=5;i++))
do
echo $i
done
expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出
Loop control statement
- continue: continue; that the code below the loop body will not be executed, restart the next loop
- break: interrupt; immediately stop executing this loop and execute the code behind the loop body
- exit: means to jump out of the program directly
Applications
Nine-Nine Multiplication Table
#!/bin/bash
# 方法一
# by stanZ
#!/bin/bash
for ((i=1;i<=9;i++))
do
for((n=1;n<=$i;n++))
do
echo -n "$i*$n=`expr $i \* $n` "
done
echo
done
#!/bin/bash
# 方法二
# by stanZ
#九九乘法表
for i in `seq 1 9`
do
for j in $(seq 1 $i)
do
echo -n "$i*$j=$[ $i * $j ]"
done
echo
#let i++
done
Right triangle
#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=1;i<=$h;i++))
do
for j in `seq $i`
do
echo -n "*"
done
echo
done
Isosceles triangle
#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=1;i<=$h;i++))
do
a=$[ $h - $i ]
for j in `seq $a`
do
echo -n " "
done
b=$((2*$i - 1 ))
for k in `seq $b`
do
echo -n "*"
done
echo
done
Inverted isosceles triangle
#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=0;i<=$h;i++))
do
for((j=1;j<=$i;j++))
do
echo -n " "
done
a=$(( 2*($h-$i) -1 ))
for((j=$a;j>=1;j--))
do
echo -n "*"
done
echo
done
diamond
#!/bin/bash
# by stanZ
read -p "请输入菱形半径:" h
for((i=0;i<=$h;i++))
do
a=$[ $h -$i ]
for((j=1;j<=$a;j++))
do
echo -n " "
done
b=$((2*$i - 1))
for((k=1;k<=$b;k++))
do
echo -n "*"
done
echo
done
for((u=1;u<=$h;u++))
do
for((n=1;n<=$u;n++))
do
echo -n " "
done
l=$(( 2*($h-$u)-1 ))
for((m=1;m<=$l;m++))
do
echo -n "*"
done
echo
done
Hollow triangle
#!/bin/bash
# by stanZ
read -p "请输入三角形的高:" h
for((i=1;i<=h;i++))
do
a=$[ $h - $i ]
for((j=1;j<=$a;j++))
do
echo -n " "
done
b=$[ 2*$i -1 ]
for((k=1;k<=$b;k++))
do
if [ $k -eq 1 ];then
echo -n "*"
elif [ $i -eq $h ];then
echo -n "*"
elif [ $k -eq $((2*$i-1)) ];then
echo -n "*"
else
echo -n " "
fi
done
echo
done
Hollow diamond
#!/bin/bash
# by stanZ
read -p "请输入菱形的半径:" h
for((i=1;i<=$h;i++))
do
a=$[ $h - $i ]
for((j=1;j<=$a;j++))
do
echo -n " "
done
b=$[ 2*$i - 1]
for((k=1;k<=$b;k++))
do
if [ $k -eq 1 -o $k -eq $b ];then
echo -n "*"
else
echo -n " "
fi
done
echo
done
for((u=1;u<=$h;u++))
do
for((n=1;n<=$u;n++))
do
echo -n " "
done
c=$((2*($h-$u)-1))
for((m=1;m<=$c;m++))
do
if [ $m -eq 1 -o $m -eq $c ];then
echo -n "*"
else
echo -n " "
fi
done
echo
done
The script calculates the odd sum of 1-100
#!/bin/bash
# 方法1:
sum=0
for i in {
1..100..2}
do
sum=$[$i+$sum]
done
echo "1-100的奇数和为:$sum"
# 方法2:
#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
let sum=$i+$sum
done
echo "1-100的奇数和为:$sum"
# 方法3:
sum=0
for ((i=1;i<=100;i++))
do
if [ $[$i%2] -ne 0 ];then
let sum=$sum+$i
fi
或者
test $[$i%2] -ne 0 && let sum=$sum+$i
done
echo "1-100的奇数和为:$sum"
# 方法4:
sum=0
for ((i=1;i<=100;i++))
do
if [ $[$i%2] -eq 0 ];then
continue
else
let sum=$sum+$i
fi
done
echo "1-100的奇数和为:$sum"
#!/bin/bash
sum=0
for ((i=1;i<=100;i++))
do
test $[$i%2] -eq 0 && continue || let sum=sum+$i
done
echo "1-100的奇数和是:$sum"
Determine whether the integer entered is a prime number
#!/bin/bash
#定义变量来保存用户所输入数字
read -p "请输入一个正整数字:" number
#先排除用户输入的数字1和2
[ $number -eq 1 ] && echo "$number不是质数" && exit
[ $number -eq 2 ] && echo "$number是质数" && exit
#循环判断用户所输入的数字是否质数
for i in `seq 2 $[$number-1]`
do
[ $[$number%$i] -eq 0 ] && echo "$number不是质数" && exit
done
echo "$number是质数"
优化思路:没有必要全部产生2~$[$number-1]序列,只需要产生一半即可。
更好解决办法:类C风格完美避开了生成序列的坑
for (( i=2;i<=$[$number-1];i++))
do
[ $[$number%$i] -eq 0 ] && echo "$number不是质数" && exit
done
echo "$number是质数"
# 方法二
#!/bin/bash
read -p "输入一个数字:" num
if [ $num -eq 1 ];then
echo "$num不是质数"
exit 1
elif [ $num -eq 2 ];then
echo "$num是质数"
exit 2
fi
for i in `seq 2 $[$num-1]`
do
if [ $[$num%$i] -eq 0 ];then
echo "$num不是质数"
exit 3
else
echo "$num是质数"
exit 4
fi
done
Create users in bulk
#!/bin/bash
read -p "请输入创建用户的数量:" num
read -p "请输入创建用户的前缀:" frefix
read -p "请输入创建用户的密码:" password
for((i=1;i<=$num;i++))
do
user=$frefix$i
useradd $user
echo "$password" |passwd --stdin $user &>/dev/null
if [ $? -eq 0 ];then
echo "$user is created"
fi
done
Test network segment surviving host
#!/bin/bash
# by stanZ
#for i in `seq 254`
#for i in {1..254}
read -p "请输入想检测的网段(默认192.168.188.0):" net
for((i=1;i<=254;i++))
do
{
if [ -z $net ];then
ip=192.168.188.$i
ping -c 3 -W 1 -i 0.2 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up."
else
echo "$ip is donw."
fi
else
ip=$net.$i
ping -c 3 -W 1 -i 0.2 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up."
else
echo "$ip is down."
fi
fi
}& # 放入后台并发执行
done
wait
echo "all finish.."