SHELL-FOR

作者dmxsp

4月 29, 2024

1.for 循环详解

for 循环语句的一般形式为:

for (表达式1; 表达式2; 表达式3) { 语句; }

首先要强调两点: 1) 表达式1、表达式2和表达式3之间是用分号;隔开的,千万不要写成逗号。

2) for(表达式1;表达式2;表达式3)的后面千万不要加分号,很多新手都会犯这种错误——会情不自禁地在后面加分号。

因为 for 循环只能控制到其后的一条语句,而在C语言中分号也是一个语句——空语句。所以如果在后面加个分号,那么 for 循环就只能控制到这个分号,下面大括号里面的语句就不属于 for 循环了。

下面来看看它的执行过程:

求解表达式1。

求解表达式2。若其值为真,则执行 for 语句中指定的内嵌语句,然后执行第3步;若表达式2值为假,则结束循环,转到第5步。

求解表达式3。

转回上面第2步继续执行。

循环结束,执行 for 语句下面的语句。

从这个执行过程中可以看出,“表达式1”只执行一次,循环是在“表达式2”“表达式3”和“内嵌语句”之间进行的。

for语句最简单的形式是:
for (循环变量赋初值; 循环条件; 循环变量增值) { 语句; }

2.for循环的两种语法

基本语法

for 自定义变量名 in 元素列表;do
        ......
done

取元素列表中的成员,每取一个执行……位置所写的代码。直到取完结束。

下面列一下这种语法的常用格式

for line in $(ls) #对ls的结果进行循环执行
for file in /home/test/* #对/home/test/下所有的文件和文件夹执行循环
for n in $(seq 1 10) #对1-10中每一个数据进行循环,刚才已经讲到过。
for log in /log/*.log #对/log/目录中所有以.log结尾的文件进行循环。
for n in {1…10} #对1-10中每一个数据进行循环
for Iine in $(< file) #对file文件中的内容每一行执行循环
for arg in “$@” #对传入的参数进行循环

bash支持的语法

#!/bin/bash
for ((i=1; i<10; i++));do
        echo $i
done

上面就是类C的循环语法。也很常用

shell脚本中几个特殊的指令

$@: 所有命令行传入的参数或者给函数传入的参数内容
$#: 传入参数的个数
$0: 文件名,是指这个脚本的名字
$n: 取传入的参数的第几个参数的内容。
$*: 所有命令行传入的参数或者给函数传入的参数内容

3.案例

从1加到100

[root@shell /server/scripts]$ cat for100.sh
#!/bin/sh
for i in `echo {1..100}`
do
let count=$[$count+$i]
done
echo $count
[root@shell /server/scripts]$ sh for100.sh
5050

#!/bin/bash
sum=0
# 使用for循环从1加到100
for (( i=1; i<=100; i++ ))
do
sum=$((sum + i))
done
echo “从1加到100的总和是: $sum

批量获取10.0.0.0/24位的在线的主机 可以ping通则认为在线

[root@shell /server/scripts]$ cat forip.sh
#!/bin/sh
for i in `seq 254`
do
{
IP=10.0.0.$i
ping -c1 -W1 $IP &>/dev/null
if [ $? -eq 0 ];then
echo “$IP 在线”
fi } &

done
wait
echo “在线取IP完成…………….”
[root@shell /server/scripts]$ sh forip.sh
10.0.0.65 在线
10.0.0.56 在线
10.0.0.2 在线
在线取IP完成…………….

wait命令用于等待所有在后台执行的子进程(即通过&符号放入后台执行的命令)执行完毕后再继续执行脚本中的后续命令。在这个脚本中,wait命令的作用是等待所有ping命令(用于检查IP地址在线状态)执行完毕后再输出”在线IP取完成”。

创建删除用户

[root@shell /server/scripts]$ cat foruser.sh
#!/bin/sh
read -p “请输入用户名的前缀: ” prefix
read -p “请输入用户的个数: ” num
for i in `seq $num`
do
   echo ${prefix}$i
done
echo “1.删除”
echo “2.创建”
read -p “请选择删除以上用户或者是创建用户: ” num1
if [ $num1 -eq 2 ];then
read -p “你确定要创建以上用户吗?[y|Y|yes|n|N|NO]: ” re
case $re in
          y|Y|yes|YES)
          for a in `seq $num`
          do
              user=${prefix}$a
              id $user &>/dev/null
              if [ $? -eq 0 ];then
          echo “用户存在”
              else
          useradd  $user
          if [ $? -eq 0 ];then
          echo “$user 创建成功”
          fi
              fi
          done
          ;;
  n|N|no|NO)
   echo “玩啥呢”
          ;;
          *)
   echo “USAGE $0 [y|Y|n|N]”
esac
elif [ $num1 -eq 1 ];then
              for b in `seq $num`
                do
                    user=${prefix}$b
                    id $user &>/dev/null
                    if [ $? -eq 0 ];then
                         userdel -r $user
         if [  $? -eq 0 ];then
         echo “$user 删除成功”
fi
                    else
        echo “用户不存在”
                    fi
          done
fi
[root@shell /server/scripts]$ sh foruser.sh
请输入用户名的前缀: qiang
请输入用户的个数: 2
qiang1
qiang2
1.删除
2.创建
请选择删除以上用户或者是创建用户: 2
你确定要创建以上用户吗?[y|Y|yes|n|N|NO]: y
qiang1 创建成功
qiang2 创建成功

[root@shell /server/scripts]$ sh foruser.sh
请输入用户名的前缀: qiang
请输入用户的个数: 2
qiang1
qiang2
1.删除
2.创建
请选择删除以上用户或者是创建用户: 1
qiang1 删除成功
qiang2 删除成功

 

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。