目录
shell脚本 常用的循环语句
-
for 循环:用于遍历一个已知的列表或范围内的值,比如数组、文件列表或数字范围。它会按照顺序迭代列表中的每个值,并执行相应的操作。这种循环适合于已知迭代次数的情况。
-
while 循环:在给定条件为真时,循环执行一系列语句。它会根据条件的真假来控制循环是否继续执行。这种循环适合于不确定迭代次数的情况,因为条件可以在循环内部改变。
-
until 循环:与 while 循环类似,但在给定条件为假时循环执行。也就是说,当条件为假时,until 循环会继续执行,直到条件为真为止。这种循环适用于需要等待条件变为真的情况。
for 循环语句
for 循环语句的格式:
for 变量 in 列表
do
# 在这里执行循环体的代码
done
- for: 表示这是一个循环语句。
- 变量: 这是用来迭代列表中每个元素的临时变量名。
- 列表: 表示被迭代的元素列表,可以是文件列表、命令输出、固定的值列表等。
- 循环体的代码: 在 do 和 done 之间编写需要重复执行的代码。
for循环示例
1~2023的累和
#!/bin/bash
sum=0
for ((i=1; i<=2023; i++))
do
sum=$((sum + i))
done
echo "Sum using for loop: $sum"
制作九九乘法表
#!/bin/bash
for j in {1..9}
do
for i in `seq $j`
do
echo -e "${i}*${j}=`echo $[i*j]`\t\c"
done
echo
done
批量改文件后缀
#面试题#
#!/bin/bash
cd 目标目录
for i in *
do
alhpa= `echo $i | awk -F '[0-9]+' '{print $1}'`
alnum= `echo $i |grep -oE '[0-9]+' `
mv $i ${almun}${alpha}.aa
done
批量添加用户密码
#!/bin/bash
vim user.txt #在此文件添加用户
vim user.sh #脚本
#!/bin/bash
for i in `cat ./user.txt`
do
echo 123132 | passwd $i --stdin
done
#批量删除用户
#!/bin/bash
for i in `cat /user.txt`
do
userdel -r $i
done
查看某网段下所有主机的状态并导入指定文件中
for i in {1..254}
do
{
ping -c2 -W1 192.168.91.$i &>/dev/null
if [ $? -eq 0 ]
then
echo "host $i is online" >> online.txt
else
echo "host $i is offline" >> offline.txt
fi
} &
done
总结
#遍历数组
#!/bin/bash
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"
do
echo "Fruit: $fruit"
done
#遍历目录中的文件
#!/bin/bash
for file in /path/to/directory/*
do
echo "File: $file"
done
#使用数字范围进行循环
#!/bin/bash
for i in {1..10}
do
echo "Number: $i"
done
#遍历命令输出
#!/bin/bash
for user in $(cat /etc/passwd | cut -d':' -f1)
do
echo "User: $user"
done
#嵌套循环
#!/bin/bash
for i in {1..3}
do
for j in {1..3}
do
echo "Outer loop: $i, Inner loop: $j"
done
done
#遍历命令行参数
#!/bin/bash
for arg in "$@"
do
echo "Argument: $arg"
done
#使用 seq 命令生成数字序列进行循环
#!/bin/bash
for num in $(seq 1 5)
do
echo "Number: $num"
done
#遍历文件内容行
#!/bin/bash
filename="sample.txt"
for line in $(cat "$filename")
do
echo "Line: $line"
done
while循环语句
while循环语句的格式
while 条件
do
# 在这里执行循环体的代码
done
死循环由于缺少结束条件,循环会一直持续下去
while true
do
echo "这是一个死循环"
done
#除了true,还可以用 :
while循环示例
1~2023的累和
#!/bin/bash
sum=0
i=1
while [ $i -le 2023 ]
do
sum=$((sum + i))
i=$((i + 1))
done
echo "Sum using while loop: $sum"
竞猜价格游戏
#!/bin/bash
#1-1000 不限次数 猜高会提示高 猜低会提示低 统计猜了多少次
p=`echo $[RANDOM%1000+1]`
t=0
while true
do
read -p "你猜是多少(1-1000)" price
let t++
if [ $price -eq $p ]
then
echo "你真聪明"
echo "你一共猜了${t}次"
exit
elif [ $price -gt $p ]
then
echo "友情提示,太高了"
else
echo "友情提升,低了"
fi
done
总结
#读取文件内容行
#!/bin/bash
filename="sample.txt"
while read line
do
echo "Line: $line"
done < "$filename"
#等待直到某个条件满足
#!/bin/bash
while true
do
echo "Waiting for condition to be met..."
# 在这里可以检查条件,如果条件满足,则 break 退出循环
sleep 1
done
#遍历命令输出直到满足条件
#!/bin/bash
while IFS= read -r line
do
echo "Line: $line"
# 在这里可以检查条件,如果条件满足,则 break 退出循环
done < <(command_here)
#处理命令行参数
#!/bin/bash
while [ $# -gt 0 ]
do
echo "Argument: $1"
shift
done
#循环直到用户输入满足条件
#!/bin/bash
while true
do
read -p "Enter a number (0 to exit): " num
if [ $num -eq 0 ]; then
break
fi
echo "You entered: $num"
done
#使用条件判断循环
#!/bin/bash
count=1
while [ $count -le 10 ]
do
if [ $((count % 2)) -eq 0 ]; then
echo "Even number: $count"
fi
count=$((count + 1))
done
#使用命令输出作为循环条件
#!/bin/bash
while ping -c 1 google.com > /dev/null
do
echo "Internet connection is active."
sleep 10
done
until 循环语句
until 条件
do
# 在这里执行循环体的代码
done
1~2023的累和
#!/bin/bash
sum=0
i=1
until [ $i -gt 2023 ]
do
sum=$((sum + i))
i=$((i + 1))
done
echo "Sum using until loop: $sum"
通过给指定用户发送消息吗,直到上线
#!/bin/bash
#用位置变量表示输入的用户名,第一位
username=$1
if [ $# -lt 1 ]
then
echo " 输入目标用户名和要发的消息:"
exit 1
fi
if grep "^$username" /etc/passwd &>/dev/null
then :
else
echo "查无此人"
exit 1
fi
until who|grep $username &>/dev/null
do
echo "用户暂时不在线"
#等待5秒,再次发送信息
sleep 5
done
#用位置变量表示要发送的信息
mes=$2
echo $mes | write $username
退出循环
exit
当执行 exit
语句后,脚本将立即终止,并且不会再执行后续的代码。
#!/bin/bash
while true
do
# 条件判断
if [ 条件 ]
then
exit # 退出脚本
fi
# 循环体代码
done
break
break
语句会立即终止最内层的循环,并跳出该循环体执行循环后的代码。
while true
do
# 条件判断
if [ 条件 ]
then
break # 退出循环
fi
# 循环体代码
done
continue
continue
语句会跳出当前循环,但是不会终止命令。
while true
do
# 条件判断
if [ 条件 ]
then
continue # 跳过本次循环迭代,继续下一次迭代
fi
# 循环体代码
done