循环语句与函数
echo简述
- 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前面的字符不会被覆盖 |
\ \ | 表示插入\本身 |
循环语句
for循环语句
- for循环操作也统称遍历操作
- 读取不同的变量值,用来逐个执行同一组命令
- 逻辑图释
表达式一
[root@localhost ~]# for a in {1..5}; do echo $a; done
1
2
3
4
5
【使用for循环语句输出1到5并赋值给变量a】
[root@localhost ~]# for i in {1..5..2}
> do
> echo $i
> done
1
3
5
【使用for循环语句每次间隔2输出1到5并赋值给变量i】
表达式二
[root@localhost ~]# seq 1 3 10
1
4
7
10
【使用seq每次间隔3从1到10开始赋值,seq仅仅执行数值的连续操作】
[root@localhost ~]# for a in $(seq 1 5)
> do
> echo "$(($a*2))"
> done
2
4
6
8
10
【提取seq连续操作值后赋值给变量a的值,并将此变量*2】
表达式三(变量值的迭代方式)
[root@localhost ~]# for ((i=1;i<5;i++))
> do
> echo $i
> done
1
2
3
4
【使用for语句进行循环操作,且需赋值的变量1=i<5且每次i自加1】
[root@localhost ~]# for ((i=1;i<8;i+=3)); do echo $i; done
1
4
7
【使用for语句进行循环操作,且需赋值的变量1=i<8且每次+3进行赋值】
表达式四
[root@localhost ~]# for ((i=0; i<=8; i+=2))
> do
> echo "$[$i+$i+$i]"
> done
0
6
12
18
24
【使用for语句进行循环操作,且需赋值的变量1=i<8且每次+2进行赋值,echo输出的是变量i+变量i+变量i的值】
批量添加用户且密码均为111222
[root@localhost ~]# vim name1.txt
[root@localhost ~]# vim dome.sh
#!/bin/bash
q=$(cat name1.txt)
for i in $q
do
useradd $i
echo "$111222" | passwd --stdin $i 【通过管道符号把111222输出给pasww $1】
#echo -e "111222\n111222\n" | passwd $i 【通过转义符-n的换行回车进行秘密的确认,从而实现变量i的密码输入】
done
[root@localhost ~]# chmod +x dome.sh
[root@localhost ~]# ./dome.sh
更改用户 qq 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 ww 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 ee 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 rr 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 tt 的密码 。
passwd:所有的身份验证令牌已经成功更新。
批量检测指定ip地址连通性
[root@localhost ~]# for i in 192.168.1.{0..5}; do ping -c 3 -i 0.5 -W 3 $i &> /dev/null && echo "$i 在线" || echo "$i 不在线";done
192.168.1.0 不在线
192.168.1.1 在线
192.168.1.2 不在线
192.168.1.3 不在线
192.168.1.4 在线
192.168.1.5 不在线
【使用for语句进行192.168.1.{0-5}网段的ping操作(共3个包,每次间隔0.5秒,3秒后超时)并赋值给i,并将变量i的值丢到黑洞文件。最终判断
条件是否成立,成立则输出变量i在线,不成立则输出变量i不在线】
while循环语句
- 重复测试某个条件,只要条件成立则立刻反复执行
- 赋完初始值后需要自己加入迭代方式,否则将陷入死循环
- 逻辑图释
[root@localhost ~]# vim text1.sh
#!/bin/bash
i=0 【定义变量i=0】
while [ $i -le 4 ] 【测试条件i小于等于4】
do
echo $i 【输出i的值】
let i++ 【自定义1个迭代方式】
【输出的值和迭代方式这两行如果放错位置,那么最终输出的结果也将不同】
done
[root@localhost ~]# chmod +x text1.sh
[root@localhost ~]# ./text1.sh
0
1
2
3
4
例一
- 批量添加用户
- 用户名称以qzqz开头,按数字顺序进行编号
- 共添加5个用户,初始密码均设为111222
[root@localhost ~]# vim text2.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
useradd qzqz$i
echo "111222" | passwd --stdin qzqz$i &> /dev/null 【将执行完的提示丢进黑洞文件】
i=$[$i+1] 【变量叠加方式为每次+1】
done
[root@localhost ~]# chmod +x text2.sh
[root@localhost ~]# ./text2.sh
例二
- 随机猜测水果价格
- 通过变量RANDOM获得随机数
- 提示用户猜测并记录猜测的次数,当用户猜中后则退出循环
- 价格区间在0-99
[root@localhost ~]# vim text3.sh
[root@localhost ~]# chmod +x text3.sh
[root@localhost ~]# vim text3.sh
#!/bin/bash
a=$[$RANDOM % 100] 【通过取余的方式将RANDOM随机值定义在0-99之间,RANDOM上限为99999】
b=0
d=0
echo "猜一猜该水果的价格:"
while [ $b -eq 0 ] 【当变量值b等于0时执行while语句操作】
do
let d++ 【每执行一次语句操作次数+1,并赋予变量名d,以便最终输出共猜测了几次】
read -p "输入你猜测的价格:" c 【提示用户输入猜测的价格并赋予变量c】
if [ $c -eq $a ];then 【如果用户输入的变量c等于RANDOM随机出来的数字】
echo "你猜对了!"
b=1 【因为变量b等于0时才执行while语句,所以这里b=1用于跳出while循环】
elif [ $c -gt $a ];then
echo "你猜多了!"
elif [ $c -lt $a ];then
echo "你猜少了!"
fi
done
echo "你总共猜了 $d 次。"
:wq
[root@localhost ~]# ./text3.sh
猜一猜该水果的价格:
输入你猜测的价格:50
你猜少了!
输入你猜测的价格:65
你猜多了!
输入你猜测的价格:57
你猜少了!
输入你猜测的价格:63
你猜少了!
输入你猜测的价格:64
你猜对了!
你总共猜了 5 次。
untli循环语句
- 重复测试某个条件,只要条件不成立则反复执行
- 逻辑图释
[root@localhost ~]# vim text5.sh
#!/bin/bash
a=0
until [ $a -gt 5 ] 【定义条件为a>5时untile语句不生效】
do
echo $a
let a++
done
[root@localhost ~]# chmod +x text5.sh
[root@localhost ~]# ./text5.sh
0
1
2
3
4
5
示例
- 通过循环累加的方式计算1-35的和值
[root@localhost ~]# vim text5.sh
#!/bin/bash
a=0
sum=0
until [ $a -gt 35 ] 【定义条件为a>35时untile语句不生效】
do
sum=$[$sum + $a]
let a++
done
echo $sum
:wq
[root@localhost ~]# ./text5.sh
630
break
- break可以跳出单个循环
[root@localhost ~]# vim text6.sh
#!/bin/bash
for ((b=1;b<=3;b++))
do
echo "外层循环为$b"
for ((c=1;c<=3;c++))
do
echo "内存循环为$c"
done
done
[root@localhost ~]# chmod +x text6.sh
[root@localhost ~]# ./text6.sh
外层循环为1
内存循环为1
内存循环为2
内存循环为3
外层循环为2
内存循环为1
内存循环为2
内存循环为3
外层循环为3
内存循环为1
内存循环为2
内存循环为3
[root@localhost ~]# vim text6.sh
#!/bin/bash
for ((b=1;b<=3;b++))
do
echo "外层循环为$b"
for ((c=1;c<=3;c++))
do
echo "内存循环为$c"
if [ $c -eq 2 ];then 【当变量c等于2时执行break操作,如果break 2则代表跳出2层循环】
break
fi
done
done
[root@localhost ~]# ./text6.sh
外层循环为1
内存循环为1
内存循环为2
外层循环为2
内存循环为1
内存循环为2
外层循环为3
内存循环为1
内存循环为2
continue
- continue中止某次循环中的命令,但不会完全中止整个命令
[root@localhost ~]# vim text6.sh
#!/bin/bash
for ((b=1;b<=5;b++))
do
echo "外层循环为$b"
if [ $b -gt 2 -a $b -lt 4 ];then 【当变量值b大于2且小于4时执行continue操作】
continue
fi
echo $[$b *2]
done
[root@localhost ~]# ./text6.sh
外层循环为1
2
外层循环为2
4
外层循环为3 【因为当执行到3时满足变量值b大于2且小于4的条件,所以执行continue操作,中止当前一次循环命令】
外层循环为4
8
外层循环为5
10
IFS字段分隔符
[root@localhost ~]# set | grep IFS
IFS=$' \t\n' 【默认包含“空格,制表符,换行符”】
...略...
local IFS='
[root@localhost ~]# oldifs=$IFS 【修改前先赋值给oldifs。以便使用完后好修改回初始值】
[root@localhost ~]# IFS=$'\n' 【修改成只换行】
[root@localhost ~]# set | grep IFS
IFS=$'\n'
local option option2 i IFS='
...略...
local IFS='
[root@localhost ~]# IFS=$oldifs 【修改回初始值】
[root@localhost ~]# set | grep IFS
IFS=$' \t\n'
...略...
local IFS='