目录
for循环
循环:在一定的条件下,避免进入死循环,重复的执行命令或者代码,节约了大量的时间,也提高了脚本的复用率
遍历:对一组数据中的每一个元素进行访问的过程,进行操作或者输出
二者的区别在于
循环是一种控制流程的结构,用于重复执行代码
遍历是访问,访问数据
在绝大多数情况下,循环遍历是结合使用的
for语句
for 变量名 in 取值范围
do
命令序列
done
for 已知的循环次数场景
for((;;))死循环
批量创建用户读取opt目录下已经创建好的文本文件里的内容作为用户
根据IP地址检查主机状态
IP地址存放在ipadds.txt文件中,每行一个
使用ping命令检测各主机的连通性
ping通的ip地址保存到/opt/hosts.txt文件中
这个脚本可以正确地实现从ipadds.txt中读取IP地址并ping测试,如果ping测试成功(即退出状态码为0),则将该IP地址追加到/opt/hosts.txt文件中。它的执行过程如下:
-
循环读取ipadds.txt文件中的每个IP地址。
-
对每个IP地址执行ping测试,测试次数为3次。
-
检查ping测试的退出状态码,如果为0,则将该IP地址追加到/opt/hosts.txt文件中。
-
继续下一个IP地址的ping测试,直到所有IP地址都被测试过。
需要注意的是,这个脚本没有对ping测试中的标准输出进行处理,如果一个IP地址ping测试成功,输出将会打印到终端上。如果需要将输出重定向到另一个文件中,需要使用重定向命令来实现,例如:
for i in $(cat /ipadds.txt)
do
ping -c 3 $i >> /opt/ping.log 2>&1
if [ $? -eq 0 ]
then
echo $i >> /opt/hosts.txt
fi
done
在这个修改后的脚本中,将标准输出重定向到/opt/ping.log文件中,并将标准错误重定向到与标准输出相同的文件描述符中。通过使用重定向将输出写入另一个文件中,可以避免输出干扰ping测试结果的判断。
循环的次数
for i in {1..5}
do
echo $i
done
这条命令将会循环执行5次,每次循环将会将变量i赋值为从1到5的整数。在每次循环中,将会输出变量i的值。将这段脚本保存为test.sh文件,然后通过bash命令运行,将会得到下面的输出:
$ bash test.sh 1 2 3 4 5
这个for循环可以用来遍历一些需要执行多次的操作,例如对一组文件进行批量操作、向多个URL发送请求等。在循环内部,可以根据不同的需求来编写具体的命令和操作。
类c语言格式
for((i=1;i<=5;i++))
for ((i=1; i<=5; i++))
do
echo $i
done
这条命令将会循环执行5次,每次循环将会将变量i赋值为从1到5的整数。在每次循环中,将会输出变量i的值。将这段脚本保存为test.sh文件,然后通过bash命令运行,将会得到下面的输出:
$ bash test.sh 1 2 3 4 5
使用基于C语言的for循环写法可以支持更丰富的循环控制语法,例如跳出循环、修改循环变量等。然而,这个写法在一些情况下也可能会造成代码的可读性和维护性降低,需要根据具体的需求来选择合适的for循环写法。
1-100 1一直追加到100求和
mrj=0
for i in {1..100}
do
mrj=$((mrj+i))
done
echo "1~100的和为:$mrj"
set -x
sum=0
for ((i=1;i<=10;i++))
do
sum=$[ $i+$sum ]
echo $sum
done
set +x
执行结果
[root@localhost ~]# sh ip.sh
+ sum=0
+ (( i=1 ))
+ (( i<=10 ))
+ sum=1
+ echo 1
1
+ (( i++ ))
+ (( i<=10 ))
+ sum=3
+ echo 3
3
+ (( i++ ))
+ (( i<=10 ))
+ sum=6
+ echo 6
6
+ (( i++ ))
+ (( i<=10 ))
+ sum=10
+ echo 10
10
+ (( i++ ))
+ (( i<=10 ))
+ sum=15
+ echo 15
15
+ (( i++ ))
+ (( i<=10 ))
+ sum=21
+ echo 21
21
+ (( i++ ))
+ (( i<=10 ))
+ sum=28
+ echo 28
28
+ (( i++ ))
+ (( i<=10 ))
+ sum=36
+ echo 36
36
+ (( i++ ))
+ (( i<=10 ))
+ sum=45
+ echo 45
45
+ (( i++ ))
+ (( i<=10 ))
+ sum=55
+ echo 55
55
+ (( i++ ))
+ (( i<=10 ))
+ set +x
这个代码主要是用来计算1~10的整数和,并输出每次循环后的累加结果。你提到的 set -x
和 set +x
命令是用来开启和关闭 bash 调试模式,它们能够输出每一行命令执行的详细信息,包括变量赋值和命令执行的返回结果等,并会输出当前执行的函数和执行的命令。具体的代码含义如下:
set -x #命令用于开启bash调试模式,这会输出每一行命令执行的详细信息。
sum=0 #命令用于初始化sum变量,用来保存每次循环后的累加结果。
for ((i=1;i<=10;i++))# 命令用于循环迭代1到10的整数,每次循环会将当前整数的值加到sum变量中去。
sum=$[ $i+$sum ] #命令用于将当前整数的值加到sum变量中去,并将结果赋值给sum变量。
echo $sum #命令用于输出当前循环位置时sum变量的值,即每次循环后的累加结果。
set +x #命令用于关闭bash调试模式,停止输出详细的命令执行信息。
这段代码的主要执行过程是:先将sum变量初始化为0,然后循环1到10的整数范围,每次循环将当前i的值加到sum变量中去,并输出当前循环完毕后累加的结果。最后,代码关闭了调试模式。所以,当你运行这个脚本后,它会输出1到10的每个整数以及它们累加和的结果。
1-100偶数求和
sum=0
for i in {i=2;i<=100;i+=2}
do
sum=$[$i+$sum]
done
echo $sum
在这个示例中,首先将sum变量初始化为0。然后使用for循环遍历2到100范围内的偶数,将每个偶数累加到sum变量中。循环结束后,输出累加结果。
将这个脚本保存为sum_even.sh文件,然后通过bash命令运行,将会得到下面的输出:
$ bash sum_even.sh # 假设脚本文件名为sum_even.sh 2550 # 输出偶数之和
或者还有一种方法
步长
sum=0
for i in `seq 2 2 10`
do
sum=$(($i+$sum))
done
echo $sum
这个脚本用来计算2-10之间的所有偶数之和。代码主要使用了for循环和shell命令seq
来生成由2、4、6、8、10组成的一列偶数,并将所有偶数相加求和,最后输出结果。具体的代码含义如下所示:
-
sum=0
这一行代码用来初始化变量sum
,用于后续累加每个偶数的值。 -
for i in
seq 2 2 10` 是一个for循环语句,其中使用了shell命令
seq来生成由2、4、6、8、10组成的一列偶数。
seq 2 2 10`表示生成一个从2开始,步长为2,不超过10的整数序列。 -
sum=$(($i+$sum))
这一行代码将当前变量i的值加入变量sum中,并将累加结果重新赋值给变量sum。 -
echo $sum
输出结果。
将这个脚本保存为sum_even.sh文件,然后通过bash命令运行,将会得到下面的输出:
$ bash sum_even.sh # 假设脚本文件名为sum_even.sh
30 # 输出偶数之和
注意,这个脚本仅仅是用来计算2到10之间的偶数之和,如果要计算其他范围内的偶数之和,可以修改此脚本中的循环范围和参数。
![](https://img-blog.csdnimg.cn/e479a8d9a91f479787a8bf53deabb477.png)
转义符
常用转义字符 echo -n 表示不换行输出 echo -e 输出转义字符,将转义后的内容输出到屏幕上 echo -ne 只有加了-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"前面的字符不会被覆盖
\ 表示插入""本身;