你该认识这样的Linux_shell之循环控制
Posted ShenLiang2025
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你该认识这样的Linux_shell之循环控制相关的知识,希望对你有一定的参考价值。
Linux shell之循环使用案例
声明与简介
Shell是系统的用户界面,它提供了用户跟内核进行交互的桥梁。Shell是一个命令解释器,它接收用户输入的命令并送到内核去执行。
本文主要介绍围绕Shell循环的常见使用方法。
循环控制
for循环
For循环是以for为关键字,访问列表进行进行遍历的一种简单的循环方式。
默认情况下遍历元素时以空格来分割。
# 通过for循环遍历所有元素
for i in 2 3 4;
> do
> echo $i
> done;
#结果
2
3
4
引号与for循环
#for循环时以空格作为列表元素的分隔符,如果元素里已经有空格,那么需要加双引号,遍历时仍以空格作为分隔符。
for i in "Say Nothing" "What is" "I'm a space";
> do
> echo $i;
> done;
# 结果
Say Nothing
What is
I'm a space
IFS结合FOR循环
#如果For遍历元素时不是空格(默认),那么可以通过IFS变量进行设置。当前演示的是以制表符(\\t)来分割for里的元素。当然也可以用其它的字符,如’\\n’、’\\r’。
cat shellinput.txt
#结果
first parameter second paramete third parameter fourth parameter
#!/bin/bash
IFS=$'\\t'
for i in $(cat "$1")
do
echo $i
done;
#结果
first parameter
second paramete
third parameter
fourth parameter
遍历目录与文件
# 遍历指定的目录下所有内容,并按照文件类型输出(目录和文件)。
#!/bin/bash
for path in /home/shenliang/workdata/*
do
if [ -d $path ]
then
echo "$path是文件夹"
elif [ -f $path ]
then
echo "$path是文件"
fi
done
#结果
./shell_ifs.sh
/home/shenliang/workdata/BERT-BiLSTM-CRF-NER-master.zip是文件
/home/shenliang/workdata/build_medicalgraph.py是文件
/home/shenliang/workdata/chinese_L-12_H-768_A-12.zip是文件
/home/shenliang/workdata/data是文件夹
/home/shenliang/workdata/ner是文件夹
/home/shenliang/workdata/news是文件夹
变量自增For循环
# 类似C语言的写法编写for循环,这里利用内置的变量自增的方式。
# 注意,这种情况下“()”需要两个。
for (( i=1; i<5; i++ ))
> {
> echo $i
> }
#结果
1
2
3
4
嵌套循环
#循环嵌套即,循环是两层或者更多层的情况。
for (( i=1;i<=2;i++ ))
> do
> echo "当前在第一层循环:$i"
> for (( j=1;j<=3;j++ ))
> do
> echo " 当前在第二层循环:$j"
> done
> done
#执行结果
当前在第一层循环:1
当前在第二层循环:1
当前在第二层循环:2
当前在第二层循环:3
当前在第一层循环:2
当前在第二层循环:1
当前在第二层循环:2
当前在第二层循环:3
重定向循环输出
#重定向循环输出是对循环的结果进行重定向,即结果可以输出到一个文件内。
#!/bin/bash
for path in /home/shenliang/workdata/*
do
if [ -d $path ]
then
echo "$path是文件夹"
elif [ -f $path ]
then
echo "$path是文件"
fi
done > output_sh.txt
#查看执行后的文件内容
cat output_sh.txt
# 部分
/home/shenliang/workdata/BERT-BiLSTM-CRF-NER-master.zip是文件
/home/shenliang/workdata/build_medicalgraph.py是文件
/home/shenliang/workdata/chinese_L-12_H-768_A-12.zip是文件
/home/shenliang/workdata/data是文件夹
/home/shenliang/workdata/ner是文件夹
/home/shenliang/workdata/news是文件夹
注: >> 亦可,即追加的意思,而>是覆盖。
循环控制
#1 通过break结束整个循环
for (( i=1;i<=3;i++ ))
> do
> echo "循环内数$i"
> if [ $i -eq 2 ];
> then
> break
> fi
> done
#结果
循环内数1
循环内数2
#2 通过break终止循环,结合条件判断,即满足条件即终止。
for d in ./*
> do
> [ -d $d ] && break
> echo "找到文件$d"
> done
#结果
找到文件./BERT-BiLSTM-CRF-NER-master.zip
找到文件./build_modle.py
找到文件./chinese_L-12_H-768_A-12.zip
#3 通过continue略过某次循环
for (( i=1;i<=3;i++ ))
> do
> if [ $i -eq 2 ];
> then
> continue
> fi
> echo "循环内数$i"
> done
#结果
循环内数1
循环内数3
#4 通过continue控制循环,结合条件判断,即满足条件时继续。
for d in ./*
> do
> [ -d $d ] || continue
> echo "$d是文件夹"
> done
#结果
./data是文件夹
./ner是文件夹
./news是文件夹
./QASystemOnMedicalKG-master是文件夹
./Rasa_NLU_Chi-master是文件夹
./shellspace是文件夹
./word2vec是文件夹
WHILE循环
#通过while循环打印数字
#!/bin/bash
num=1
while ((num<10));
do
echo -e "$num \\c"
((num++))
done;echo
#结果
1 2 3 4 5 6 7 8 9
Until循环
# Until循环的判断逻辑与WHILE相反。WHILE条件是临界范围内,而Until是超过临界范围时终止,两者do的内容都类似。只是判断条件不同。
#!/bin/bash
num=1
until (( num >9 ));
do
echo -e "$num \\c"
(( num++ ))
done;echo
#结果
1 2 3 4 5 6 7 8 9
从文件读参数循环执行
#定义含IP地址的server文件
cat servers.txt
192.169.111.128
127.0.0.1
#!/bin/bash
#IFS=$'\\t'
#for i in $(cat "$1")
#do
#echo $i
#done;
while read server;
do
ping -c2 "$server"
done < servers.txt
#结果
PING 192.168.111.128 (192.168.111.128) 56(84) bytes of data.
64 bytes from 192.168.111.128: icmp_seq=1 ttl=64 time=0.343 ms
64 bytes from 192.168.111.128: icmp_seq=2 ttl=64 time=0.263 ms
--- 192.168.111.128 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.263/0.303/0.343/0.040 ms
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.027 ms
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.027/0.027/0.027/0.000 ms
以上是关于你该认识这样的Linux_shell之循环控制的主要内容,如果未能解决你的问题,请参考以下文章