目录
在前面的Linux系统的基础学习中,我们已经学习了很多命令行操作。尤其是在我们学习awk结构化操作操作后,相信大家对结构化的操作更加清晰了。
当然,有些时候,我们不知是针对文本进行操作,我们会写一些Linux的操脚本来实现自动化操作,比如说,如果你想打开100个文本文件,同时,查看这些文件中是否存在一个关键字“work”。
那么,你一定不会机械化的一个个点开,你一定会想一个便捷的办法去做这些机械化的事情。
所以,今天我们来学习一下Linux的结构化条件控制语句。本文将详细介绍Linux中的条件控制语句,包括if、if else、if else-if else、for、while、until、case、break、continue等,并给出相应的示例代码。
相信今天的学习,你一定会解决上面的疑问。
1.简介
语法 | 描述 |
if | 条件语句 |
if else | 条件判断语句 |
if else-if else | 多条件判断语句 |
for | 循环执行命令 |
while | 循环执行命令 |
until | 直到条件为真时停止循环 |
case ... esac | 多选择语句 |
break | 跳出循环 |
continue | 跳出当前循环 |
2.条件语句
2.1 if语句
if语句是Linux中最基本的条件控制语句,很容易发现,它与C、Python这些语言不同,它的判断语句后,需要用 then 指明,结束部分用 fi 指明。语言它的语法格式如下:
if [ condition ]
then
command1
command2
...
fi
其中,condition是一个条件表达式,如果它的值为真,则执行then后面的命令。
写成test.sh脚本,内容如下:
#!/bin/bash
# 判断当前用户是否为root用户
if [ $USER == "root" ]
then
echo "You are the root user."
fi
执行脚本,
# 执行脚本
bash test.sh
# 输出如下:
You are the root user.
如果不想写脚本,可以写出一行,但是要以;分开:
if [ $USER == "root" ]; then echo "You are the root user."; fi
2.2 if else语句
if else语句是if语句的扩展,它可以在条件不满足时执行另一段代码。语法格式如下:
if [ condition ]
then
command1
command2
...
else
command3
command4
...
fi
例如,以下代码判断当前目录下是否存在一个名为file.txt的文件:
# 判断当前目录下是否存在一个名为file.txt的文件,图方便写成一行。
if [ -f file.txt ]; then echo "file.txt exists."; else echo "file.txt does not exist."; fi
# 输出如下:
file.txt exists.
2.3 if else-if else语句
if else-if else语句是if else语句的进一步扩展,它可以判断多个条件并执行相应的代码块。不过需要注意的是,Linux中的if语句并不直接支持else-if语法,但可以通过嵌套if语句来实现类似的功能。例如:
if [ condition1 ]
then
command1
elif [ condition2 ]
then
command2
else
command3
fi
这里使用了elif来替代else-if。注意,elif和else都是可选的,可以根据需要省略。
这里创建一个testIF.sh,内容如下:
#!/bin/bash
a=1
b=2
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
执行代码:
# 执行代码
$ bash testIF.sh
# 输出结果:
a 小于 b
3.循环语句
3.1 for语句
for语句,定量循环,可以遍历一个列表或数组中的元素一,并对每个元素执行相应的操作。语法格式如下:
for variable in list
do
command1
command2
...
done
示例,以下代码遍历当前目录下的所有文件,并输出每个文件的名称:
# 遍历当前目录下的所有文件,并输出每个文件的名称
for file in *; do echo $file; done
3.2 while语句
while语句,入口循环语句,可以根据条件重复执行一段代码,语法如下:
while [ condition ]
do
command1
command2
...
done
我们写一个bash脚本,testWhile.sh内容如下:
#!/bin/bash
while true
do
echo "Hello, world!"
sleep 1 # 等待1秒钟后再次输出
done
运行这个脚本:
# 运行这个脚本
$ bash testWhile.sh
# 输出:
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
代码会不断输出"Hello, world!",直到用户手动中断程序为止,按住 Ctrl + C ,停止输出。
3.3 until语句
until语句也可以根据条件重复执行一段代码。只不过它的条件判断是相反的:只要condition的值为假,就会一直执行do和done之间的命令。
until condition
do
command
done
例如以下代码会不断询问用户是否要退出程序,并在用户输入"yes"时退出程序:
#!/bin/bash
until [ "$answer" == "yes" ]
do
echo "Do you want to exit? (yes/no)"
read answer # 读取用户的输入并保存到answer变量中
done
echo "Exiting..." # 当用户输入"yes"时执行此命令并退出程序
4.跳出语句
4.1 case 语句
case
语句用于执行多个条件测试,每个条件称为一个case
,并根据第一个匹配的条件执行相应的代码块。这个类似于C语言的Swith语句。
case 语句的结构如下:
case variable in
pattern1)
# 执行当 variable 匹配 pattern1 时的命令
;;
pattern2)
# 执行当 variable 匹配 pattern2 时的命令
;;
...
*)
# 如果 variable 不匹配任何模式,则执行这里的命令
;;
esac
;; 表示一个模式的结束。*) 是一个通配符模式,匹配任何值。
示例,创建一个testCase.sh脚本,内容如下:
#!/bin/bash
day="Monday"
case $day in
Monday)
echo "Today is Monday."
;;
Tuesday)
echo "Today is Tuesday."
;;
Wednesday)
echo "Today is Wednesday."
;;
*)
echo "It's not Monday, Tuesday, or Wednesday."
;;
esac
执行脚本:
# 执行脚本
bash testCase.sh
# 输出
Today is Monday.
4.2 break 语句
break 语句用于跳出当前循环(for、while 或 until 循环),并终止循环的执行。如果 break 语句用在 case 语句中,则用于跳出 case 语句,终止模式匹配。
示例1:
# 创建脚本 testBreak.sh ,内容如下:
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]; then
break
fi
echo $i
done
# 执行脚本
bash testBreak.sh
# 输出结果:
1
2
3
4
这个脚本会打印从 1 到 4 的数字,当 $i 等于 5 时,break 语句会终止 for 循环。
示例2(在 case 语句中使用 break):
# 创建一个脚本 testBreak2.sh
#!/bin/bash
while true
do
read -p "Enter a number (1-3): " num
case $num in
1|2|3)
echo "You entered $num."
break
;;
*)
echo "Invalid number. Please try again."
;;
esac
done
# 执行代码
bash testBreak2.sh
# 输出结果,输入3
Enter a number (1-3): 3
You entered 3.
在这个脚本中,break 语句用于在输入 1、2 或 3 后退出 while 循环。
4.3 continue 语句
continue 语句用于跳过当前循环迭代的剩余部分,并开始下一次迭代。如果 continue 语句用在 case 语句中,则用于跳过当前模式,并继续匹配下一个模式。
示例1:
# 创建一个脚本 testcon1.sh 内容如下:
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]; then
continue
fi
echo $i
done
# 执行脚本
bash testcon1.sh
# 输出结果
1
2
3
4
6
7
8
9
10
这个脚本会打印从 1 到 10 的数字,但会跳过数字 5,因为当 $i 等于 5 时,continue 语句会跳过循环体的剩余部分。
示例(在 case 语句中使用 continue):
# 创建一个脚本 testcon2.sh 内容如下:
#!/bin/bash
while true
do
read -p "Enter a number (1-3): " num
case $num in
1|2|3)
echo "You entered $num."
;;
*)
echo "Invalid number. Please try again."
continue
;;
esac
break # 终止 while 循环,因为 continue 已经处理了无效输入的情况
done
# 执行脚本
bash testcon2.sh
# 输出结果
Enter a number (1-3): 3
You entered 3.
在这个脚本中,如果输入的不是 1、2 或 3,continue 语句会跳过 case 语句的剩余部分,并继续下一次 while 循环的迭代。由于紧接着有一个 break 语句,所以循环会在处理完无效输入后终止。
5.解决疑问
好了,学习了那么多,可以前面提到的问题了:如果你想打开100个文本文件,同时,查看这些文件中是否存在一个关键字“work”。
首先,创建一个名为:testProblem.sh的文件,内容如下:
#!/bin/bash
# 假设你的文件都位于同一个目录中,并且文件名以.txt结尾
# 使用for循环遍历文件
for file in *.txt; do
# 使用grep命令查找关键字"work"
if grep -q "work" "$file"; then
echo "关键字'work'在文件$file中找到"
else
echo "关键字'work'未在文件$file中找到"
fi
done
运行代码:
# 执行脚本
bash testProblem.sh
# 这是我的目录,具体输出要看你自己的,输出如下:
关键字'work'未在文件file1.txt中找到
关键字'work'未在文件file2.txt中找到
关键字'work'未在文件file.txt中找到
关键字'work'未在文件grades.txt中找到
如果您是跟着我一起敲代码学习的,相信您一定懂得了很多。
如果感觉阅读对您还有些作用,可以评论留言,关注我。谢谢您的阅读!
敬请关注!
往期学习笔记: