Bash 编程精粹:从新手到高手的全面指南之逻辑控制

news/2024/11/28 23:49:31/

在 Unix 和 Linux 系统中,Bash(Bourne-Again Shell)是一种广泛使用的 shell,提供了强大的脚本编程能力。本文将详细介绍 Bash 脚本中的逻辑控制结构,包括条件判断、分支选择、循环控制以及退出控制等内容。

条件判断:if

在 Bash 脚本中,我们常常需要根据某些条件来决定是否执行某个命令或者某段代码,这时就需要用到 if 语句。

  1. 基础的 if 结构:
if [ condition ] ; then ...;fi

如果 condition 为真,则执行 then 后面的代码块,否则跳过。

  1. if-else 结构:
if [ condition ] ; then ...;else ...;fi

如果 condition 为真,则执行 then 后面的代码块,否则执行 else 后面的代码块。

  1. if-elif-else 结构:
if [ condition ] ; then ...;elif ...;fi

如果 condition 为真,则执行 then 后面的代码块,否则检查 elif 的条件,如果为真则执行 elif 后的代码块,否则执行 else 后的代码块。

  1. 使用 && 和 || 替代 if:
[ -f file ] && echo file exist || echo file not exist

如果 -f file 为真,则输出 “file exist”,否则输出 “file not exist”。

分支选择:case、select

在某些情况下,我们可能需要根据变量的值来执行不同的代码块,这就需要使用到 case 或 select 语句。

  1. case 结构:
case $var in
p1) ... ;;
p2) ... ;;
...
pn) ... ;;
*) ...;;
esac

根据变量 var 的值,选择执行相应的代码块。

  1. select 结构:
Select var in var_list;do ....;done;

用户从 var_list 中选择一个值赋给 var,然后执行相应的代码块。

循环控制:for、while、until

在 Bash 脚本中,我们可以使用 for、while 或 until 语句来重复执行某段代码。

  1. for 循环:
for(( c1 ; c2 ; c3 ));
do
... ;
done

在 c1 和 c3 之间,每次增加 c2,执行一次循环体。

  1. for 遍历循环:
for f in $array[*];
do
.....
done

遍历数组 array 的每个元素,对每个元素执行一次循环体。

  1. while 循环:
i=0;
while ((i<3)) ;do
echo $i; ((i=i+1));
done

当 i 小于 3 时,执行一次循环体,并使 i 加 1。

  1. until 循环:
i=0;
until ((i>3));do
echo $i;
((i+=1));
done

当 i 不大于 3 时,执行一次循环体,并使 i 加 1。注意,until 循环与 while 循环的功能是相同的,只是判断条件的方向不同。

退出控制:return、exit、break、continue

在 Bash 脚本中,我们可以使用 return、exit、break 或 continue 语句来控制程序的流程。

  1. return:用于函数的返回,返回一个整数值。

  2. exit:用于结束当前的 shell 进程,后面可以跟一个整数值作为退出状态。

  3. break:用于跳出当前的循环。

  4. continue:用于跳过当前循环的剩余部分,进入下一次循环。

高级条件判断

在复杂的脚本中,我们经常需要基于多个条件进行判断。这时可以使用逻辑运算符 -a (AND), -o (OR), 和 ! (NOT) 来组合条件。

if [ $var -eq 1 -a $other -eq 2 ]; thenecho "Both conditions are true."
elif [ $var -eq 1 -o $other -eq 2 ]; thenecho "At least one condition is true."
elseecho "Neither condition is true."
fi

我们还可以使用括号 () 来对条件进行分组,以及使用 ! 对条件取反。

if [ $var -eq 1 ] && [ $other -eq 2 ]; thenecho "Both conditions are true."
fiif ! [ $var -eq 1 ]; thenecho "var is not equal to 1."
fi

循环控制技巧

在处理文件和数据时,我们经常需要编写复杂的循环。这里有一些有用的技巧:

  • 使用 {start..end} 进行整数序列的迭代:

    for i in {1..5}; doecho $i
    done
    
  • 使用 seq 命令生成数字序列:

    for i in $(seq 1 5); doecho $i
    done
    
  • 利用 {start..end..step} 指定步长:

    for i in {0..10..2}; doecho $i
    done
    
  • 使用 {commands;...} 在循环体中执行一组命令:

    for file in *; doif [ -d "$file" ]; thenls "$file"fi
    done
    

代码组织与函数

随着脚本的增长,我们需要更好地组织代码以提高可读性和可维护性。在 Bash 中,我们可以使用函数来封装重复的任务或逻辑。

function greet() {echo "Hello, $1"
}greet "World"

我们也可以使用源代码文件包含的方式来重用代码段。使用 source. 命令可以包含其他脚本文件。

source common_functions.sh
or
. common_functions.sh

信号处理

Bash 脚本还可以处理来自用户或系统的中断信号,如 Ctrl+C。我们可以捕获这些信号,并定义自己的处理行为。

trap 'echo "Interrupted!"; exit 1' INT

上面的代码会在用户按下 Ctrl+C(发送 INT 信号)时输出一条消息并退出脚本。

结论

通过掌握 Bash 的逻辑控制结构,你可以编写出功能复杂且强大的脚本。记住,好的脚本不仅仅是工作的,还应该是其他人(包括未来的你)能够理解和维护的。因此,始终关注代码的清晰性、一致性和文档。当你的脚本变得越来越复杂时,不妨考虑使用函数、源代码包含和注释来保持代码的整洁和有序。最后,不要忘记测试你的脚本以确保它们按预期工作,特别是在不同的边缘情况下。


http://www.ppmy.cn/news/1418534.html

相关文章

hibernate缓存

hibernate缓存 hibernate提供了两个级别的缓存 一级缓存 session级别的缓存&#xff0c;属于事务范围的缓存&#xff0c;由hibernate来管理 二级缓存 sessionFactory级别的缓存&#xff0c;属于进程范围内的缓存 一级缓存 一级缓存是session级别的缓存&#xff0c;且是一种强制…

EasyUI Jquery 学习笔记 ——DataGrid(数据网格)与 Tree(树)详细版

1. DataGrid(数据网格)与 Tree(树) 1.1 Datagrid 数据网格 扩展自 $.fn.panel.defaults。通过 $.fn.datagrid.defaults 重写默认的 defaults。 数据网格(datagrid)以表格格式显示数据,并为选择、排序、分组和编辑数据提供了丰富的支持。数据网格(datagrid)的设计目…

【C++题解】1601. 挖胡萝卜

问题&#xff1a;1601. 挖胡萝卜 类型&#xff1a;基本运算、小数运算 题目描述&#xff1a; 小兔朱迪挖了 x 个胡萝卜&#xff0c;狐狸尼克挖到胡萝卜数量是小兔挖到的 3 倍&#xff0c;小羊肖恩挖到胡萝卜的数量比狐狸尼克少 8 个。 请你编程计算一下狐狸尼克和小羊肖恩分别…

GET与POST:详述HTTP两大请求方法的语义、数据处理机制、安全特性与适用场景

GET和POST方法在HTTP请求中具有明确的角色分工和特性差异。GET适用于读取操作和不敏感数据的传递&#xff0c;强调可缓存性和安全性&#xff0c;而POST适用于写入操作和敏感数据的提交&#xff0c;提供了更大的数据承载能力和更强的隐私保护。本文详细介绍了GET与POST请求方法的…

IDEA中sql语句智能提示设置

选中一句sql语句&#xff0c;点击鼠标右键 指定数据库

SE78图片迁移下载

SAP好像并没有标准的事务码可以方便下载已上传至SAP服务器上的图片&#xff0c;通常的解决方法写一个专门下载这类图片的简单程序来处理。 REPORT Ydownload. DATA : g_bytecount TYPE i,g_content TYPE STANDARD TABLE OFbapiconten INITIAL SIZE …

第24次修改了可删除可持久保存的前端html备忘录:文本编辑框不再隐藏,又增加了哔哩哔哩搜索和必应搜索

第24次修改了可删除可持久保存的前端html备忘录:文本编辑框不再隐藏&#xff0c;又增加了哔哩哔哩搜索和必应搜索. <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"…

mbti,ENFP型人格的心理问题分析

什么是ENFP型人格&#xff1f; ENFP型人格是富有自由精神的人格&#xff0c;拥有这种人格的人&#xff0c;有一种与生俱来的自我表现力&#xff0c;他们总是希望自己能在各种各样的场合中成为焦点&#xff0c;也很喜欢和别人打交道&#xff0c;并且展现出自己富有魅力&#xf…