文章目录
一、循环语句
1、for循环
读取不同的变量值,用来逐个执行同一组命令
for 变量名 in 取值列表
do
命令序列
done
示例1、1~100求和
#!/bin/bash
sum=0
for i in {1..100}
do
sum=$[$i+$sum]
done
echo "0-100的和为:" $sum
#如果算的是1~100之间每隔两位数的和,即{1、3、5、7、...、99},for循环如下:
for i in {1..100..2}
#其他都是一样的。
也可以使用 i++ 自加的方法:
示例 2、1~a,(a<=100)求和
#!/bin/bash
read -p "请输入1~100任意一个数:" a
sum=0
for ((i=1;i<=$a;i++))
do
sum=$[ $sum+$i ]
done
echo "$sum"
验证:
示例 3、1~100求奇偶数和
sum=0
sum1=0
for ((i=1;i<=100;i++))
do
a=$[ $i%2 ]
if [ $a = 0 ]
then
sum=$[ $sum+$i ]
else sum1=$[ $sum1+$i ]
fi
done
echo "偶数和:"
echo "$sum"
echo "奇数和: "
echo "$sum1"
验证:
示例 4、 过滤1~100 所有奇偶数
#!/bin/bash
echo -n "偶数 "
for ((i=1;i<=100;i++))
do
a=$[ $i%2 ]
if [ $a == 0 ]
then
echo -n "$i,"
fi
done
echo -n "奇数 "
for ((i=1;i<=100;i++))
do
a=$[ $i%2 ]
if [ $a == 1 ]
then
echo -n "$i,"
fi
done
示例 5、检测指定范围主机
检测指定范围主机是否通信,并将通信主机IP输出到文件 host_ip.txt 中
touch host_ip.txt
for i in 192.168.1.{1..10}
do
ping -c 1 -i 0.2 -w 1 $i &>/dev/sull
if [ $? = 0 ]
then
echo $i>>host_ip.txt
fi
done
示例 6、筛选文件
输出/dev 目录中所有的可执行文件
# 筛选可执行文件
for a in /dev/*
do
[ -x "$a" ]
if [ $? = 0 ]
then
echo "$a"
fi
done
验证:
示例 7、创建用户
1) 批量添加用户
用户名以use开头,按数字顺序进行编号
一共1-20,添加20个用户
初始密码均设为123456
#!/bin/bash
i=1
for i in {1..20}
do
useradd user$i
echo "123456" | passwd --stdin user$i
i++
done
- 执行脚本输入用户名,若该用户存在,输出提示该用户已存在;若该用户不存在,提示用户输入密码,建立用户并设立其密码
#/bin/bash
a=`awk -F : '{ print $1 }' /etc/passwd`
for i in $a
do
read -p "请输入用户名:" b
if [ $b = $i ];then
echo "该用户已存在"
exit
else
useradd $b
case $? in
0)
echo "你将创建此用户"
read -p "请输入密码:" c
echo -e "$c\n$c\n" | passwd $b
;;
*)
esac
exit
fi
done
二、while循环
- 根据特定条件反复执行一个命令序列,直到不满足条件为止。
- 编写时可能会出现死循环,要避免这种情况发生
- true(真)和false(假)为特殊条件测试操作,也可以在if语句的条件测试中使用。
- true作为条件时,表示条件永远成立,无限执行,也就是死循环,需要强制终止
- false作为条件时,表示条件不成立,不执行命令序列
#while语句结构
while 条件测试操作
do
命令序列
done
示例1、1~100求和
#!/bin/bash
#1~100 求和
i=1
sum=0
while [ $i -le 100 ]
do
sum=$[$sum+$i]
let i++
done
echo "1-100所有整数和:" $sum
执行结果:
示例 2、1~a,(a<=100)求和
#!/bin/bash
#1~a 求和:
i=1
sum=0
read -p "请输入:(1-100)" a
while [ $i -le $a ]
do
sum=$[$sum+$i]
let i++
done
echo "1-a所有整数和:" $sum
执行结果:
示例 3、1~100求奇偶数和
#!/bin/bash
# 奇偶数和:
sum1=0
sum2=0
i=1
while [ $i -le 100 ]
do
a=$[$i%2]
if [ $a = 0 ];then
sum1=$[$sum1+$i]
else
sum2=$[$sum2+$i]
fi
let i++
done
echo "偶数和:$sum1"
echo "奇数和:$sum2"
验证结果:
示例 4、 过滤1~100 所有奇偶数
#!/bin/bash
# 过滤1~100 奇偶数
i=1
echo "奇数:"
while
[ $i -lt 100 ]
do
a=$[ $i % 2 ]
if
[ $a -eq 1 ]
then
echo "$i "
fi
let i++
done
o=1
echo "偶数:"
while
[ $o -le 100 ]
do
p=$[ $o % 2 ]
if
[ $p -eq 0 ]
then
echo "$o "
fi
let o++
done
示例 5、检测指定范围主机
#!/bin/bash
# 检测指定范围主机
i=1
while [ $i -le 254 ]
do
ping -i 0.5 -c 1 -w 1 192.168.1.$i &>/dev/null
if [ $? = 0 ]
then
echo "192.168.1.$i 在线">>host_ip.txt
else
echo "192.168.1.$i 不在线"
fi
let i++
done
示例7、猜商品价格
#!/bin/bash
#
a=$[$RANDOM % 1000]
i=0
b=0
while [ $b -eq 0 ]
do
read -p "猜猜是哪个数,范围在0~999:" shu
let i++
if [ $shu -eq $a ];then
echo "祝贺你,猜了$i 次就猜中了。"
let b++
elif [ $shu -gt $a ];then
echo "你猜大了"
elif [ $shu -lt $a ];then
echo "你猜小了"
fi
done
echo "你总共猜了 $i 次"
~
三、until循环语句
- 与while相反,重复测试某个条件,只要条件不成立则反复执行
#!/bin/bash
#
a=0
sum=0
until [ $a -gt 100 ]
do
sum=$[$sum+$a]
let a++
done
echo "1~100的和:$sum"
四、结束循环----break和continue
- break跳出单个循环
#!/bin/bash
for ((a=1; a<=10; a++))
do
echo "outer loop: $a"
for ((b=1; b<=20; b++))
do
if [ $b -eq 5 ]
then
break
fi
echo "inter loop: $b"
done
done
- continue中止某次循环中的命令,但不会完全中止整个命令
#!/bin/bash
for ((a=1; a<=15; a++))
do
if [ $a -gt 5 ] && [ $a -lt 10 ]
then
continue
fi
echo "current value: $a"
done
五、IFS字段分隔符
默认包含 空格,制表符,换行符
查看命令:set | grep IFS
IFS=$' \t\n'
修改成只换行
IFS=$'\n'
IFS=:
IFS=','
IFS.OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD
输出环境变量PATH所包含的所有目录以及其中的所有可执行文件
六、转义字符
echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:
\b 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;"\b"表示删除前一个字符,"\b\b"表示删除前两个字符。
\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
\n 换行,被输出的字符从"\n"处开始另起一行。
\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;
\v 与\f相同;
\t 转以后表示插入tab,即横向制表符;
\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
\\ 表示插入"\"本身;
-n的演示: