第一部分 课堂笔记一、课程总览本节课核心内容for 循环列表遍历、C 语言风格 forwhile 循环条件成立持续循环until 循环条件不成立持续循环嵌套循环、循环处理文件数据循环控制break、continue循环输出重定向文件、管道一 for 循环语句基础语法for 变量 in 列表 do 循环执行命令 done作用遍历一组数据每次迭代取出列表中一个值赋值给变量执行 do~done 内部代码。列表 6 种赋值方式直接写死列表值for user in root haolin wang复杂带引号 / 单引号值for var in I don\t know where shell going.从变量读取列表先定义name_listroot haolin wang再for user in $name_list从命令读取列表for city in $(cat 文件)修改 IFS 字段分隔符默认空格 / 换行 / 制表符可自定义分隔符IFS$\n、IFS:通配符遍历目录文件for file in ./*遍历当前目录所有文件C 语言风格 for 循环for (( 变量初始化; 循环条件; 迭代更新 )) do 命令 done支持多变量同时迭代for ((a1,b10;a10;a,b--))特点仅支持整数数学运算无需[]、[[]]测试符号。二 while 循环语句基础语法while 测试命令/条件 do 循环内命令 done运行规则每次循环开头执行测试命令测试退出码 0条件成立→执行循环体测试退出码≠0 → 终止循环循环内必须修改判断变量否则死循环支持多条测试命令所有命令都会执行。三 until 循环语句基础语法until 测试命令/条件 do 循环内命令 done和 while 完全相反测试退出码≠0 → 执行循环体测试退出码 0 → 结束循环。四 嵌套循环循环内部再套一层 / 多层循环执行总次数 外层次数 × 内层次数。 常用场景打印九九乘法表、逐行解析文件配合 IFS 分割每行字段。五循环处理文件数据核心搭配嵌套 for 循环 修改 IFS 分隔符IFS$\n按行分割文件保证带空格行完整读取IFS:按冒号分割一行文本适配 /etc/passwd 用户文件。六循环流程控制break直接跳出当前一层循环break n跳出 n 层嵌套循环continue终止本次迭代直接进入下一次循环不退出整体循环。七循环输出重定向两种用法写在done后方输出到文件done 文件名所有打印内容存入文件不输出屏幕管道处理done | 命令循环输出交给管道后续命令处理如 sort 排序。本章小结for 适合已知固定列表、数字区间、遍历文件目录while 条件成立循环until 条件不成立循环多层循环可嵌套break/continue 控制循环走向IFS 修改分隔符实现文件逐行、逐字段解析done 后加 或 |统一重定向循环全部输出。第二部分 课堂示例脚本示例 1基础 for 列表遍历 for.sh#!/bin/bash echo ***** Using for command***** # 1.直接列表值 for user in root haolin wang do echo This is $user done echo -e \n*****for list from variable***** # 2.变量存储列表 name_listroot haolin wang name_list$name_list dongxu for user in $name_list do echo This is $user done echo -e \n*****in for command complex word***** # 3.带特殊符号复杂值 for var in I don\t know where shell going. do echo word:$var done示例 2从文件读取 修改 IFS forfile.sh#!/bin/bash # 先创建测试文件forfile.txt cat forfile.txt EOF New York Sichuan:Chengdu Beijing Shanghai EOF echo *****for command:read from a command***** fileforfile.txt # 默认分隔符空格、换行 for city in $(cat $file) do echo Visit $city done echo -e \n*****Using internal field separator. IFS$\n***** # 仅以换行分割保留冒号内容 IFS$\n for city in $(cat $file) do echo Visit $city done示例 3通配符遍历目录文件 dir_for.sh#!/bin/bash echo *****using * in for command***** for file in ./* do if [ -d $file ];then echo $file is a directory. elif [ -f $file ];then echo $file is a file. fi done示例 4C 语言风格 for 循环 cfor.sh#!/bin/bash echo ***** Using for command in C style***** # 单变量循环 for ((i1;i 5;i)) do echo The number is $i done echo -e \n***** Using multiple variables***** # 双变量同步迭代 for ((a1,b10;a 10; a,b--)) do echo $a-$b done示例 5while 循环示例 while.sh#!/bin/bash echo ***** while command test***** var15 while [ $var1 -gt 0 ] do echo $var1 var1$[ $var1-1 ] done echo -e \n*****Using multiple test command***** var15 while echo $var1 [ $var1 -ge 0 ] do echo This is inside the loop var1$[ $var1-1 ] done示例 6until 循环 until.sh#!/bin/bash echo ***** until command test***** var15 until [ $var1 -eq 0 ] do echo Inside the loop: $var1 var1$[$var1-1] done echo 循环结束示例 7嵌套循环 nest_for.sh#!/bin/bash echo *****Nested loop***** for ((a 1;a 3; a)) do echo Starting loop $a: for ((b1;b3;b)) do echo Inside loop:$b done done示例 8循环解析 /etc/passwd 文件 file_loop.sh#!/bin/bash echo *****preprocess file with loop # 按行读取后按冒号分割字段 IFS$\n for entry in $(tail -2 /etc/passwd) do echo Values: $entry IFS: for value in $entry do echo $value done done示例 9break 与 continue 循环控制 break.sh#!/bin/bash echo ***** Using break command***** for((a1;a4;a)) do echo Outer loop: $a for((b1;b10;b)) do if [ $b -gt $a ] then break fi echo Inner loop:$b done done echo -e \n***** Using break n command***** for ((a1;a4;a)) do echo Outer loop: $a for ((b1;b10;b)) do if [ $b -gt $a ] then break 2 fi echo Inner loop:$b done done echo -e \n*****Using continue command***** for((var11;var16;var1)) do if [ $var1 -gt 2 ] [ $var1 -lt 4 ] then continue fi echo Iteration number:$var1 done示例 10循环输出重定向 pip.sh#!/bin/bash echo *****Using ***** var15 until [ $var1 -eq 0 ] do echo Inside the loop: $var1 var1$[$var1-1] done pip.out echo You can find the output in pip.out echo -e \n*****Using|***** for((a1;a 3;a)) do for((b5;b1;b--)) do echo $[$b$a] done done | sort第三部分 课堂练习题练习 1for 循环检测当前目录文件权限需求遍历当前目录所有文件判断输出可执行文件可写文件完整代码#!/bin/bash echo 当前目录文件权限检测 for file in ./* do if [ -f $file ];then flag if [ -x $file ];then flag【可执行】 fi if [ -w $file ];then flag【可写】 fi if [ -n $flag ];then echo $file $flag fi fi done练习 2until 循环输出 100 以内 7 的倍数需求使用 until 循环打印 1~100 所有 7 的倍数完整代码#!/bin/bash echo 100以内7的倍数 num7 until [ $num -gt 100 ] do echo $num num$[$num7] done练习 3嵌套 for 循环打印九九乘法表需求双层 C 风格 for 循环输出标准九九乘法表完整代码#!/bin/bash echo 九九乘法表 for ((i1;i9;i)) do for ((j1;ji;j)) do echo -n $j*$i$[$i*$j] done echo done练习 4循环批量创建用户 文件夹 输出目录文件需求批量创建 Tom、Jerry、Spike 三个用户每个用户家目录创建 download、Picture、Document 三个文件夹将所有用户主目录文件信息统一输出到 output.txt完整代码#!/bin/bash # 用户列表 user_listTom Jerry Spike # 文件夹列表 dir_listdownload Picture Document # 1.批量创建用户 for user in $user_list do useradd $user echo 已创建用户$user # 2.为每个用户创建子文件夹 for dir in $dir_list do mkdir -p /home/$user/$dir done done # 3.所有用户目录内容写入output.txt output.txt for user in $user_list do echo 用户$user 家目录文件 output.txt ls -la /home/$user output.txt done echo 全部目录信息已存入output.txt第四部分 注意事项打开 vim 弹出交换文件按D删除临时文件正常编辑不想保存修改退出Esc→:q!回车保存并退出Esc→:wq代码粘贴乱码切换英文输入法再粘贴运行脚本提示权限不足执行chmod x 脚本名.sh
Shell 编程:更多结构化命令
发布时间:2026/7/11 4:03:03
第一部分 课堂笔记一、课程总览本节课核心内容for 循环列表遍历、C 语言风格 forwhile 循环条件成立持续循环until 循环条件不成立持续循环嵌套循环、循环处理文件数据循环控制break、continue循环输出重定向文件、管道一 for 循环语句基础语法for 变量 in 列表 do 循环执行命令 done作用遍历一组数据每次迭代取出列表中一个值赋值给变量执行 do~done 内部代码。列表 6 种赋值方式直接写死列表值for user in root haolin wang复杂带引号 / 单引号值for var in I don\t know where shell going.从变量读取列表先定义name_listroot haolin wang再for user in $name_list从命令读取列表for city in $(cat 文件)修改 IFS 字段分隔符默认空格 / 换行 / 制表符可自定义分隔符IFS$\n、IFS:通配符遍历目录文件for file in ./*遍历当前目录所有文件C 语言风格 for 循环for (( 变量初始化; 循环条件; 迭代更新 )) do 命令 done支持多变量同时迭代for ((a1,b10;a10;a,b--))特点仅支持整数数学运算无需[]、[[]]测试符号。二 while 循环语句基础语法while 测试命令/条件 do 循环内命令 done运行规则每次循环开头执行测试命令测试退出码 0条件成立→执行循环体测试退出码≠0 → 终止循环循环内必须修改判断变量否则死循环支持多条测试命令所有命令都会执行。三 until 循环语句基础语法until 测试命令/条件 do 循环内命令 done和 while 完全相反测试退出码≠0 → 执行循环体测试退出码 0 → 结束循环。四 嵌套循环循环内部再套一层 / 多层循环执行总次数 外层次数 × 内层次数。 常用场景打印九九乘法表、逐行解析文件配合 IFS 分割每行字段。五循环处理文件数据核心搭配嵌套 for 循环 修改 IFS 分隔符IFS$\n按行分割文件保证带空格行完整读取IFS:按冒号分割一行文本适配 /etc/passwd 用户文件。六循环流程控制break直接跳出当前一层循环break n跳出 n 层嵌套循环continue终止本次迭代直接进入下一次循环不退出整体循环。七循环输出重定向两种用法写在done后方输出到文件done 文件名所有打印内容存入文件不输出屏幕管道处理done | 命令循环输出交给管道后续命令处理如 sort 排序。本章小结for 适合已知固定列表、数字区间、遍历文件目录while 条件成立循环until 条件不成立循环多层循环可嵌套break/continue 控制循环走向IFS 修改分隔符实现文件逐行、逐字段解析done 后加 或 |统一重定向循环全部输出。第二部分 课堂示例脚本示例 1基础 for 列表遍历 for.sh#!/bin/bash echo ***** Using for command***** # 1.直接列表值 for user in root haolin wang do echo This is $user done echo -e \n*****for list from variable***** # 2.变量存储列表 name_listroot haolin wang name_list$name_list dongxu for user in $name_list do echo This is $user done echo -e \n*****in for command complex word***** # 3.带特殊符号复杂值 for var in I don\t know where shell going. do echo word:$var done示例 2从文件读取 修改 IFS forfile.sh#!/bin/bash # 先创建测试文件forfile.txt cat forfile.txt EOF New York Sichuan:Chengdu Beijing Shanghai EOF echo *****for command:read from a command***** fileforfile.txt # 默认分隔符空格、换行 for city in $(cat $file) do echo Visit $city done echo -e \n*****Using internal field separator. IFS$\n***** # 仅以换行分割保留冒号内容 IFS$\n for city in $(cat $file) do echo Visit $city done示例 3通配符遍历目录文件 dir_for.sh#!/bin/bash echo *****using * in for command***** for file in ./* do if [ -d $file ];then echo $file is a directory. elif [ -f $file ];then echo $file is a file. fi done示例 4C 语言风格 for 循环 cfor.sh#!/bin/bash echo ***** Using for command in C style***** # 单变量循环 for ((i1;i 5;i)) do echo The number is $i done echo -e \n***** Using multiple variables***** # 双变量同步迭代 for ((a1,b10;a 10; a,b--)) do echo $a-$b done示例 5while 循环示例 while.sh#!/bin/bash echo ***** while command test***** var15 while [ $var1 -gt 0 ] do echo $var1 var1$[ $var1-1 ] done echo -e \n*****Using multiple test command***** var15 while echo $var1 [ $var1 -ge 0 ] do echo This is inside the loop var1$[ $var1-1 ] done示例 6until 循环 until.sh#!/bin/bash echo ***** until command test***** var15 until [ $var1 -eq 0 ] do echo Inside the loop: $var1 var1$[$var1-1] done echo 循环结束示例 7嵌套循环 nest_for.sh#!/bin/bash echo *****Nested loop***** for ((a 1;a 3; a)) do echo Starting loop $a: for ((b1;b3;b)) do echo Inside loop:$b done done示例 8循环解析 /etc/passwd 文件 file_loop.sh#!/bin/bash echo *****preprocess file with loop # 按行读取后按冒号分割字段 IFS$\n for entry in $(tail -2 /etc/passwd) do echo Values: $entry IFS: for value in $entry do echo $value done done示例 9break 与 continue 循环控制 break.sh#!/bin/bash echo ***** Using break command***** for((a1;a4;a)) do echo Outer loop: $a for((b1;b10;b)) do if [ $b -gt $a ] then break fi echo Inner loop:$b done done echo -e \n***** Using break n command***** for ((a1;a4;a)) do echo Outer loop: $a for ((b1;b10;b)) do if [ $b -gt $a ] then break 2 fi echo Inner loop:$b done done echo -e \n*****Using continue command***** for((var11;var16;var1)) do if [ $var1 -gt 2 ] [ $var1 -lt 4 ] then continue fi echo Iteration number:$var1 done示例 10循环输出重定向 pip.sh#!/bin/bash echo *****Using ***** var15 until [ $var1 -eq 0 ] do echo Inside the loop: $var1 var1$[$var1-1] done pip.out echo You can find the output in pip.out echo -e \n*****Using|***** for((a1;a 3;a)) do for((b5;b1;b--)) do echo $[$b$a] done done | sort第三部分 课堂练习题练习 1for 循环检测当前目录文件权限需求遍历当前目录所有文件判断输出可执行文件可写文件完整代码#!/bin/bash echo 当前目录文件权限检测 for file in ./* do if [ -f $file ];then flag if [ -x $file ];then flag【可执行】 fi if [ -w $file ];then flag【可写】 fi if [ -n $flag ];then echo $file $flag fi fi done练习 2until 循环输出 100 以内 7 的倍数需求使用 until 循环打印 1~100 所有 7 的倍数完整代码#!/bin/bash echo 100以内7的倍数 num7 until [ $num -gt 100 ] do echo $num num$[$num7] done练习 3嵌套 for 循环打印九九乘法表需求双层 C 风格 for 循环输出标准九九乘法表完整代码#!/bin/bash echo 九九乘法表 for ((i1;i9;i)) do for ((j1;ji;j)) do echo -n $j*$i$[$i*$j] done echo done练习 4循环批量创建用户 文件夹 输出目录文件需求批量创建 Tom、Jerry、Spike 三个用户每个用户家目录创建 download、Picture、Document 三个文件夹将所有用户主目录文件信息统一输出到 output.txt完整代码#!/bin/bash # 用户列表 user_listTom Jerry Spike # 文件夹列表 dir_listdownload Picture Document # 1.批量创建用户 for user in $user_list do useradd $user echo 已创建用户$user # 2.为每个用户创建子文件夹 for dir in $dir_list do mkdir -p /home/$user/$dir done done # 3.所有用户目录内容写入output.txt output.txt for user in $user_list do echo 用户$user 家目录文件 output.txt ls -la /home/$user output.txt done echo 全部目录信息已存入output.txt第四部分 注意事项打开 vim 弹出交换文件按D删除临时文件正常编辑不想保存修改退出Esc→:q!回车保存并退出Esc→:wq代码粘贴乱码切换英文输入法再粘贴运行脚本提示权限不足执行chmod x 脚本名.sh