while的条件可以是各种终端的命令。包括外部命令或bash内建(built-in)命令都可以。因为命令都是有返回值的(可以用echo $?查看),命令执行的成功与否就是while条件的真或假。

以read命令来举个例子

#!/bin/bash
while read var;do
    echo "您输入的是$var"
 

这个程序是个死循环,将不停地等待您的输入,并回显出来。

这里的命令可以是单个命令也可以是组合命令,比如用逻辑连接符连接的命令,或者管道、重定向组成的长命令

除了让while条件恒成立外,编程语言都有一种简洁的死循环写法。比如C语言中典型的死循环条件是while(1),而java中的写法是while(true)。 
而Bash中的写法则简单的多,只需要一个冒号。

#!/bin/bash
while :
    echo I love you forever
 

这是一个死循环,执行之后请用按组合键Ctrl+C来终止它。 
此外,还有一种死循环写法就是利用系统自带的true命令(/bin/true

#!/bin/bash
while /bin/true
    echo I love you forever
 

由于我们的系统环境变量(PATH)中一般都包含了路径/bin,所有我们也可以简写成while true

while实现菜单demo

我们或许曾经用C/C++在控制台上输出过菜单。这通常是一个do-while循环实现的,先输出菜单的每个选项,然后等待输入, 
根据不同的输入执行不同的操作,然后循环再次输出菜单……。 
bash中没有do-while风格的循环,但是我们很容易用替代的方案实现该功能。用死循环+if/case条件判断语句就够了。

#!/bin/bash
#菜单demo
while :
    echo   #输出空行
    echo "========================="
    echo "      1:输出成绩单"
    echo "      2:输出课程表"
    echo "      3:输出空闲教室"
    echo "      q:退出菜单"
    echo "========================="
    read -p"请输入:" input
    case $input in
        1)echo "稍等,正在为您输出成绩单";;
        2)echo "稍等,正在为您输出课程表";;
        3)echo "稍等,正在为您输出空闲教";;
        q|Q) exit
 

while与重定向

while语句可以联合重定向(>和<)一起使用。

while和输入重定向<

while 命令
done < 文件名

相当于将文件内容逐行传递给while后面的命令(类似管道),然后再执行循环体。 
循环体为空的时候,这个结构的功能通常和cat没有两样,比如:

while grep "love"
done < letter

从文件letter中查找love这个单词,其实和cat letter|grep “love”没什么两样。

这个结构更习惯的用法和read联用,来将文件内容逐行取出,赋值给read后面的变量。比如:

#!/bin/bash
#从/etc/passwd文件中读取用户名并输出
oldIFS=$IFS #IFS是文件内部分隔符
IFS=":"     #设置分隔符为:
while  read username var #var变量不可少
    echo "用户名:$username"
done < /etc/passwd 
IFS=$oldIFS

熟悉/etc/passwd文件结构的朋友都知道这个文件的每一行包含了一个用户的大量信息(用户名只是第一项)。 
这里我们实际只输出了用户名。但是注意while的read后面除变量username外还有个var,尽管我们并不输出这个变量的值。 
但它却必不可少,如果我们写成while read username那么username的值等于passwd文件这一整行的内容(IFS=”:”也就不起作用了)

bash中,只有当有多个变量要从一行文本赋值的时候,才尝试去用IFS来分割,然后赋值。

while和输出重定向>

while 命令
done > 文件名

这个结构会将命令的输出,以及循环体中的标准输出都重定向到指定的文件中。 
比如:

#!/bin/bash
#每隔10分钟,ping一下局域网内主机192.168.1.101,
#并把结果记录到ping.txt文件中
while date
    ping -c5 192.168.1.101 >/dev/null 2>&1 
    if [ $? = 0 ];then
        echo OK
        echo FAIL
    sleep 600 #600秒是10分钟
done > ping.txt

我们来cat一下ping.txt文件,看一看:

2015年 01月 31日 星期六 16:03:13 CST
 

这是ping.txt中的一条记录

本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html

和其他语言一样Bash的循环结构中也有while语句。它的基本结构为 while 条件;do 循环体;done 和其他语言不同的是,bash脚本中的while条件很丰富,可以是方括号[]就像if那样的条件,也可以是终端的命令作为条件。bash的死循环结构十分简洁不用while(1)不用while(true),只要while :。此外bash的while还能和重定向符号>和<联用。怎么样,有趣吧。
第一章 BashBash 脚本 .................................................................................................2 1.1.普通 shell 程序.....................................................................................................2 1.1.1. shell 的作用 ...............................................................................................2 1.1.2. shell 类型...................................................................................................2 1.2. Bash 的优势 ........................................................................................................2 1.2.1. Bash 是 GNU Shell......................................................................................2 1.2.2. Bash 独有的特性........................................................................................2 1.3. 执行命令 ............................................................................................................2 1.3.1. 概要 .........................................................................................................2 1.3.2. Shell 内部命令 ...........................................................................................2 1.3.3. 从脚本执行程序.........................................................................................2 1.4. 建立块................................................................................................................2 1.4.1. Shell 建立块...............................................................................................2 1.5. 开发优良脚本......................................................................................................2 1.5.1. 优良脚本的要素.........................................................................................2 1.5.2. 结构 .........................................................................................................2 1.5.3. 术语 .........................................................................................................2 1.5.4. 有序且有逻辑性.........................................................................................2 1.5.5. 一个 Bash 脚本的例子:mysystem.sh..........................................................2 1.5.6. 初始化脚本例子.........................................................................................2 1.6. 总结...................................................................................................................2 1.7. 练习...................................................................................................................2 第二章 编写和调试脚本.....................................................................................................2 2.1. 建立并且运行一个脚本........................................................................................2 2.1.1. 编写与命名 ...............................................................................................2 2.1.2. Script1.sh..................................................................................................2 2.1.3. 执行脚本...................................................................................................2 2.2. 脚本基础 ............................................................................................................2 2.2.1. 哪个 Shell 来执行脚本................................................................................2 2.2.2. 加入注释...................................................................................................2 2.3. 调试 Bash 脚本 ...................................................................................................2 2.3.1. 调试整个脚本............................................................................................2 2.3.2. 调试部分脚本............................................................................................2 Bash 新手指南 2.4. 总结...................................................................................................................2 2.5. 练习...................................................................................................................2 第三章 Bash 环境 .............................................................................................................2 3.1. Shell 初始化文件..................................................................................................2 3.1.1. 跨系统配置文件.........................................................................................2 3.1.2. 单独用户配置文件 .....................................................................................2 3.1.3. 改变 shell 配置文件....................................................................................2 3.2. 变量...................................................................................................................2 3.2.1. 变量的类型 ...............................................................................................2 3.2.2. 建立变量...................................................................................................2 3.2.3. 导出变量...................................................................................................2 3.2.4. 保留变量...................................................................................................2 3.2.5. 特殊参数...................................................................................................2 3.2.6. 脚本通过变量循环 .....................................................................................2 3.3. 引用字符 ............................................................................................................2 3.3.1. 为何?。。.................................................................................................2 3.3.2. 转义字符...................................................................................................2 3.3.3. 单引用......................................................................................................2 3.3.4. 双引用......................................................................................................2 3.3.5. ANSI−C 引用 .............................................................................................2 3.3.6. Locales..................46................................................................................2 3.4. Shell 扩展............................................................................................................2 3.4.1. 概要 .........................................................................................................2 3.4.2. 括号表达式............................................................................................2 3.4.3. 波浪表达式 ...............................................................................................2 3.4.4. Shell 参数和变量扩展..................................................................................2 3.4.5. 命令替换...................................................................................................2 3.4.6. 算术表达式 ...............................................................................................2 3.4.7. 替换的处理................................................................................................2 3.4.8. Word splitting ............................................................................................2 3.4.9. 文件名扩展 ...............................................................................................2 3.5. 别名...................................................................................................................2 3.5.1. 什么是别名 ...............................................................................................2 3.5.2. 建立和消除别名.........................................................................................2 3.6. 更多 Bash 选项 ...................................................................................................2 3.6.1. 显示选项...................................................................................................2 3.6.2. 改变选项...................................................................................................2 3.7. 总结...................................................................................................................2 3.8. 练习...................................................................................................................2 第四章 正则表达式 ...........................................................................................................2 4.1. 正则表达式.........................................................................................................2 4.1.1. 什么是正则表达式 .....................................................................................2 4.1.2. 正则表达式 metacharacters........................................................................2 4.1.3. Basic versus 扩展正则表达式......................................................................2 Bash 新手指南 4.2. 使用 Grep 的例子 ................................................................................................2 4.2.1. 什么是 Grep?.............................................................................................2 4.2.2. Grep 与正则表达式.....................................................................................2 4.3. 模式匹配使用 Bash 特性......................................................................................2 4.3.1. 字符范围...................................................................................................2 4.3.2. 字符 classes .............................................................................................2 4.4. 总结...................................................................................................................2 4.5. 练习...................................................................................................................2 第五章 GNU SED 流编辑器................................................................................................2 5.1. 介绍...................................................................................................................2 5.1.1. 什么是 sed?...............................................................................................2 5.1.2. sed 命令....................................................................................................2 5.2. 交互编辑 ............................................................................................................2 5.2.1. 打印包含 pattern 的行................................................................................2 5.2.2. 删除包含 pattern 的输入行.........................................................................2 5.2.3. 行的范围...................................................................................................2 5.2.4. 用 sed 查找替换.........................................................................................2 5.3. 非交互编辑 ..................................................................................................2 5.3.1. 从文件读取 sed 命令..................................................................................2 5.3.2. 写输出文件 ...............................................................................................2 5.4. 总结...................................................................................................................2 5.5. 练习...................................................................................................................2 第章 GNU AWK 编程语言...............................................................................................2 6.1. gawk 上路...........................................................................................................2 6.1.1. 什么是 gawk?............................................................................................2 6.1.2. Gawk 命令.................................................................................................2 6.2. 打印程序 ............................................................................................................2 6.2.1. 打印选择的域............................................................................................2 6.2.2. 格式化块...................................................................................................2 6.2.3. 打印命令和正则表达式...............................................................................2 6.2.4. 特殊的 pattern...........................................................................................2 6.2.5. Gawk 脚本.................................................................................................2 6.3. Gawk 变量...........................................................................................................2 6.3.1. 输入块的分隔符.........................................................................................2 6.3.2. 输出的分隔符............................................................................................2 6.3.3. 记录的数量 ...............................................................................................2 6.3.4. 用户定义变量............................................................................................2 6.3.5. 更多例子...................................................................................................2 6.3.6. printf 程序 .................................................................................................2 6.4. 总结...................................................................................................................2 6.5. 练习...................................................................................................................2 第七章 条件语句...............................................................................................................2 7.1. 介绍 if ................................................................................................................2 7.1.1. 概要..........................................................................................................2 Bash 新手指南 7.1.2.if 的简单应用...............................................................................................2 7.2.更多 if 的高级使用方法..........................................................................................2 7.2.1.if/then/else 结构..........................................................................................2 7.2.2. if/then/elif/else 结构...................................................................................2 7.2.3.if 嵌套语句..................................................................................................2 7.2.4.布尔操作.....................................................................................................2 7.2.5. 使用 exit 语句和 if......................................................................................2 7.3.使用 case 语句......................................................................................................2 7.3.1.简单的条件 .................................................................................................2 7.4.总结.....................................................................................................................2 7.5.练习.....................................................................................................................2 第八章 编写交互脚本........................................................................................................2 8.1.显示用户消息 .......................................................................................................2 8.1.1. 交互与否...................................................................................................2 8.1.2. 使用内建 echo 命令 ...................................................................................2 8.2. 捕获用户输入......................................................................................................2 8.2.1. 使用内建 read 命令....................................................................................2 8.2.2. 提示用户输入............................................................................................2 8.2.3. 重定向和文件描述符..................................................................................2 8.2.4. 文件输入和输出.........................................................................................2 8.3. 总结...................................................................................................................2 8.4. 练习...................................................................................................................2 第九章 重复性任务 ...........................................................................................................2 9.1. for 循环...............................................................................................................2 9.1.1. 如何工作...................................................................................................2 9.1.2. 例子 .........................................................................................................2 9.2. while 循环...........................................................................................................2 9.2.1. What is it?......................108 .....................................................................2 9.2.2. 例子 .........................................................................................................2 9.3. until 循环 ............................................................................................................2 9.3.1. What is it?......................111 .....................................................................2 9.3.2. 例子 .........................................................................................................2 9.4. I/O 重定向循环 ................................................................................................2 9.4.1. 输入重定向 ...............................................................................................2 9.4.2. 输出重定向 ...............................................................................................2 9.5. Break 和 continue ................................................................................................2 9.5.1.内建 break..................................................................................................2 9.5.2.内建 continue..............................................................................................2 9.5.3. 例子 .........................................................................................................2 9.6. Making menus with the select built−in...............115 .............................................2 9.6.1. 概要.........................115...........................................................................2 9.6.2. 子菜单......................................................................................................2 9.7.内建 shift..............................................................................................................2 9.7.1. What does it do?............117.......................................................................2 Bash 新手指南 9.7.2. 例子..........................................................................................................2 9.8. 总结...................................................................................................................2 9.9. 练习...................................................................................................................2 第十章 深入变量...............................................................................................................2 10.1. 变量种类 ..........................................................................................................2 10.1.1. 概要 assignment of values........120 .........................................................2 10.1.2. 使用内建 declare .....................................................................................2 10.1.3. 常量........................................................................................................2 10.2. 数组变量...........122..........................................................................................2 10.2.1. 创建数组.................................................................................................2 10.2.2. Dereferencing the 变量 in an array.....................122 ................................2 10.2.3. 删除数组变量 ..........................................................................................2 10.2.4. 数组例子.................................................................................................2 10.3. Operations on 变量 ...........................................................................................2 10.3.1. Arithmetic on 变量.................126 ............................................................2 10.3.2. 变量的长度..............................................................................................2 10.3.3. 变量的转变..............................................................................................2 10.4. 总结.................................................................................................................2 10.5. 练习.................................................................................................................2 第十一章 函数..................................................................................................................2 11.1. 介绍.................................................................................................................2 11.1.1. 什么是函数?............................................................................................2 11.1.2. 函数语法.................................................................................................2 11.1.3. 函数中参数的位置....................................................................................2 11.1.4. 显示函数.................................................................................................2 11.2. 脚本中函数的例子.............................................................................................2 11.2.1. 循环利用.................................................................................................2 11.2.2. 设置路径.................................................................................................2 11.2.3. 远程备份.................................................................................................2 11.3. 总结.................................................................................................................2 11.4. 练习.................................................................................................................2 第十二章 捕捉信号 ...........................................................................................................2 12.1. 信号.................................................................................................................2 12.1.1. 介绍........................................................................................................2 12.1.2. kill 信号的使用 .........................................................................................2 12.2. 陷阱.................................................................................................................2 12.2.1. 概要........................................................................................................2 12.2.2. Bash 怎样解释陷阱...................................................................................2 12.2.3. 更多例子.................................................................................................2 12.3. 总结.................................................................................................................2 12.4. 练习.................................................................................................................2 附录 A Shell 特性 ..............................................................................................................2 A.1.常用特性..............................................................................................................2 附录 B GNU 自由文档守则..................................................................................................2
2. Unicode和UTF-8 3. 在Linux C编程中使用Unicode和UTF-8 B. GNU Free Documentation License Version 1.3, 3 November 2008 C.2. Awk D. Exit Codes With Special Meanings E. A Detailed Introduction to I/O and I/O Redirection F. Standard Command-Line Options G. Important Files H. Important System Directories I. Localization J. History Commands K. A Sample .bashrc File L. Converting DOS Batch Files to Shell Scripts M. Exercises M.1. Analyzing Scripts M.2. Writing Scripts N. Revision History O. Mirror Sites P. To Do List 表格清单: 11-1. 作业标识符 30-1. Bash 选项 33-1. 转义序列中数值和彩色的对应 B-1. Special Shell Variables B-2. TEST Operators: Binary Comparison B-3. TEST Operators: Files B-4. Parameter Substitution and Expansion B-5. String Operations B-6. Miscellaneous Constructs C-1. Basic sed operators C-2. Examples of sed operators D-1. "Reserved" Exit Codes L-1. Batch file keywords / variables / operators, and their shell equivalents L-2. DOS commands and their UNIX equivalents N-1. Revision History 例子清单: 2-1. 清除:清除/var/log 下的log 文件 2-2. 清除:一个改良的清除脚本 2-3. cleanup:一个增强的和广义的删除logfile 的脚本 3-1. 代码块和I/O 重定向 3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环 3-4. 备份最后一天所有修改的文件. 4-1. 变量赋值和替换 4-2. 一般的变量赋值 4-3. 变量赋值,一般的和比较特殊的 4-4. 整型还是string? 4-5. 位置参数 4-6. wh,whois 节点名字查询 4-7. 使用shift 5-1. echo 一些诡异的变量 5-2. 转义符 6-1. exit/exit 状态 6-2. 否定一个条件使用! 7-1. 什么情况下为真? 7-2. 几个等效命令test,/usr/bin/test,[],和/usr/bin/[ 7-3. 算数测试使用(( )) 7-4. test 死的链接文件 7-5. 数字和字符串比较 7-6. 测试字符串是否为null 7-7. zmore 8-1. 最大公约数 8-2. 使用算术操作符 8-3. 使用&&和||进行混合状态的test 8-4. 数字常量的处理 9-1. $IFS 和空白 9-2. 时间输入 9-3. 再来一个时间输入 9-4. Timed read 9-5. 我是root? 9-6. arglist:通过$*和$@列出所有的参数 9-7. 不一致的$*和$@行为 9-8. 当$IFS 为空时的$*和$@ 9-9. 下划线变量 9-10. 在一个文本文件的段间插入空行 9-11. 利用修改文件名,来转换图片格式 9-12. 模仿getopt 命令 9-13. 提取字符串的一种可选的方法 9-14. 使用参数替换和error messages 9-15. 参数替换和"usage"messages 9-16. 变量长度 9-17. 参数替换中的模式匹配 9-18. 重命名文件扩展名 9-19. 使用模式匹配来分析比较特殊的字符串 9-20. 对字符串的前缀或后缀使用匹配模式 9-21. 使用declare 来指定变量的类型 9-22. 间接引用 9-23. 传递一个间接引用给awk 9-24. 产生随机数 9-25. 从一副扑克牌中取出一张随机的牌 9-26. 两个指定值之间的随机数 9-27. 使用随机数来摇一个骰子 9-28. 重新分配随机数种子 9-29. 使用awk 产生伪随机数 9-30. C 风格的变量处理 10-1. 循环的一个简单例子 10-2. 每个[list]元素带两个参数的for 循环 10-3. 文件信息:对包含在变量中的文件列表进行操作 10-4. 在for 循环中操作文件 10-5. 在for 循环中省略[list] 10-6. 使用命令替换来产生for 循环的[list] 10-7. 对于二进制文件的一个grep 替换 10-8. 列出系统上的所有用户 10-9. 在目录的所有文件中查找源字串 10-10. 列出目录中所有的符号连接文件 10-11. 将目录中的符号连接文件名保存到一个文件中 10-12. 一个C 风格的for 循环 10-13. 在batch mode 中使用efax 10-14. 简单的while 循环 10-15. 另一个while 循环 10-16. 多条件的while 循环 10-17. C 风格的while 循环 10-18. until 循环 10-19. 嵌套循环 10-20. break 和continue 命令在循环中的效果 10-21. 多层循环的退出 10-22. 多层循环的continue 10-23. 在实际的任务中使用"continue N" 10-24. 使用case 10-25. 使用case 来创建菜单 10-26. 使用命令替换来产生case 变量 10-27. 简单字符串匹配 10-28. 检查是否是字母输入 10-29. 用select 来创建菜单 10-30. 用函数中select 结构来创建菜单 11-1. 一个fork 出多个自己实例的脚本 11-2. printf 11-3. 使用read,变量分配 11-4. 当使用一个不带变量参数的read 命令时,将会发生什么? 11-5. read 命令的多行输入 11-6. 检测方向键 11-7. 通过文件重定向来使用read 11-8. 管道输出到read 中的问题 11-9. 修改当前的工作目录 11-10. 用"let"命令来作算术操作. 11-11. 显示eval 命令的效果 11-12. 强制登出(log-off) 11-13. 另一个"rot13"的版本 11-14. 在Perl 脚本中使用eval 命令来强制变量替换 11-15. 使用set 来改变脚本的位置参数 11-16. 重新分配位置参数 11-17. Unset 一个变量 11-18. 使用export 命令传递一个变量到一个内嵌awk 的脚本中 11-19. 使用getopts 命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source 自身的脚本 11-22. exec 的效果 11-23. 一个exec 自身的脚本 11-24. 在继续处理之前,等待一个进程的结束 11-25. 一个结束自身的脚本. 12-1. 使用ls 命令来创建一个烧录CDR 的内容列表 12-2. Hello or Good-bye 12-3. 删除当前目录下文件名中包含一些特殊字符(包括空白)的文件.. 12-4. 通过文件的 inode 号来删除文件 12-5. Logfile: 使用 xargs 来监控系统 log 12-6. 把当前目录下的文件拷贝到另一个文件中 12-7. 通过名字Kill 进程 12-8. 使用xargs 分析单词出现的频率 12-9. 使用 expr 12-10. 使用 date 命令 12-11. 分析单词出现的频率 12-12. 那个文件是脚本? 12-13. 产生10 进制随机数 12-14. 使用 tail 命令来监控系统log 12-15. 在一个脚本中模仿 "grep" 的行为 12-16. 在1913 年的韦氏词典中查找定义 12-17. 检查列表中单词的正确性 12-18. 转换大写: 把一个文件的内容全部转换为大写. 12-19. 转换小写: 将当前目录下的所有文全部转换为小写. 12-20. Du: DOS 到 UNIX 文本文件的转换. 12-21. rot13: rot13, 弱智加密. 12-22. Generating "Crypto-Quote" Puzzles 12-23. 格式化文件列表. 12-24. 使用 column 来格式化目录列表 12-25. nl: 一个自己计算行号的脚本. 12-26. manview: 查看格式化的man 页 12-27. 使用 cpio 来拷贝一个目录树 12-28. 解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释 12-30. Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令 12-32. 在一个脚本中使用 cmp 来比较2 个文件. 12-33. basename 和 dirname 12-34. 检查文件完整性 12-35. Uudecod 编码后的文件 12-36. 查找滥用的连接来报告垃圾邮件发送者 12-37. 分析一个垃圾邮件域 12-38. 获得一份股票报价 12-39. 更新 Fedora Core 4 12-40. 使用 ssh 12-41. 一个可以mail 自己的脚本 12-42. 按月偿还贷款 12-43. 数制转换 12-44. 使用 "here document" 来调用 bc 12-45. 计算圆周率 12-46. 将10 进制数字转换为16 进制数字 12-47. 因子分解 12-48. 计算直角三角形的斜边 12-49. 使用 seq 来产生循环参数 12-50. 字母统计 12-51. 使用getopt 来分析命令行选项 12-52. 一个拷贝自身的脚本 12-53. 练习dd 12-54. 记录按键 12-55. 安全的删除一个文件 12-56. 文件名产生器 12-57. 将米转换为英里 12-58. 使用 m4 13-1. 设置一个新密码 13-2. 设置一个擦除字符 13-3. 关掉终端对于密码的echo 13-4. 按键检测 13-5. Checking a remote server for identd 13-6. pidof 帮助杀掉一个进程 13-7. 检查一个CD 镜像 13-8. 在一个文件中创建文件系统 13-9. 添加一个新的硬盘驱动器 13-10. 使用umask 来将输出文件隐藏起来 13-11. killall, 来自于 /etc/rc.d/init.d 14-1. 愚蠢的脚本策略 14-2. 从循环的输出中产生一个变量 14-3. 找anagram(回文构词法, 可以将一个有意义的单词, 变换为1 个或多个有意义的单词, 但 是还是原来的子母集合) 16-1. 使用exec 重定向标准输入 16-2. 使用exec 来重定向stdout 16-3. 使用exec 在同一脚本重定向stdin 和stdout 16-4. 避免子shell 16-5. while 循环重定向 16-6. 另一种while 循环重定向 16-7. until 循环重定向 16-8. for 循环重定向 16-9. for 循环重定向 loop (将标准输入和标准输出都重定向了) 16-10. 重定向if/then 测试结构 16-11. 用于上面例子的"names.data"数据文件 16-12. 记录日志事件 17-1. 广播: 发送消息给每个登录上的用户 17-2. 仿造文件: 创建一个两行的仿造文件 17-3. 使用cat 的多行消息 17-4. 带有抑制tab 功能的多行消息 17-5. 使用参数替换的here document 17-6. 上传一个文件对到"Sunsite"的incoming 目录 17-7. 关闭参数替换 17-8. 一个产生另外一个脚本脚本 17-9. Here documents 与函数 17-10. "匿名" here Document 17-11. 注释掉一段代码块 17-12. 一个自文档化(self-documenting)的脚本 17-13. 在一个文件的开头添加文本 20-1. 子shell 中的变量作用域 20-2. 列出用户的配置文件 20-3. 在子shell 里进行串行处理 21-1. 在受限的情况下运行脚本 23-1. 简单函数 23-2. 带着参数的函数 23-3. 函数和被传给脚本的命令行参数 23-4. 传递间接引用给函数 23-5. 解除传递给函数的参数引用 23-6. 再次尝试解除传递给函数的参数引用 23-7. 两个数中的最大者 23-8. 把数字转化成罗马数字 23-9. 测试函数最大的返回值 23-10. 比较两个大整数 23-11. 用户名的真实名 23-12. 局部变量的可见范围 23-13. 用局部变量来递归 23-14. 汉诺塔 24-1. 脚本中的别名 24-2. unalias: 设置和删除别名 25-1. 使用"与列表(and list)"来测试命令行参数 25-2. 用"与列表"的另一个命令行参数测试 25-3. "或列表"和"与列表"的结合使用 26-1. 简单的数组用法 26-2. 格式化一首诗 26-3. 多种数组操作 26-4. 用于数组的字符串操作符 26-5. 将脚本的内容传给数组 26-6. 一些数组专用的工具 26-7. 关于空数组和空数组元素 26-8. 初始化数组 26-9. 复制和连接数组 26-10. 关于连接数组的更多信息 26-11. 一位老朋友: 冒泡排序 26-12. 内嵌数组和间接引用 26-13. 复杂数组应用: 埃拉托色尼素数筛子 26-14. 模拟下推的堆栈 26-15. 复杂的数组应用: 列出一种怪异的数学序列 26-16. 模拟二维数组,并使它倾斜 27-1. 利用/dev/tcp 来检修故障 27-2. 搜索与一个PID 相关的进程 27-3. 网络连接状态 28-1. 隐藏cookie 而不再使用 28-2. 用/dev/zero 创建一个交换临时文件 28-3. 创建ramdisk 29-1. 一个错误的脚本 29-2. 丢失关键字(keyword) 29-3. 另一个错误脚本 29-4. 用"assert"测试条件 29-5. 捕捉 exit 29-6. 在Control-C 后清除垃圾 29-7. 跟踪变量 29-8. 运行多进程 (在多处理器的机器里) 31-1. 数字和字符串比较是不相等同的 31-2. 子SHELL 缺陷 31-3. 把echo 的输出用管道输送给read 命令 33-1. shell 包装 33-2. 稍微复杂一些的shell 包装 33-3. 写到日志文件的shell 包装 33-4. 包装awk 的脚本 33-5. 另一个包装awk 的脚本 33-6. 把Perl 嵌入Bash 脚本 33-7. Bash 和 Perl 脚本联合使用 33-8. 递归调用自己本身的(无用)脚本 33-9. 递归调用自己本身的(有用)脚本 33-10. 另一个递归调用自己本身的(有用)脚本 33-11. 一个 "彩色的" 地址资料库 33-12. 画盒子 33-13. 显示彩色文本 33-14. "赛马" 游戏 33-15. 返回值技巧 33-16. 整型还是string? 33-17. 传递和返回数组 33-18. anagrams 游戏 33-19. 在shell 脚本中调用的窗口部件 34-1. 字符串扩展 34-2. 间接变量引用 - 新方法 34-3. 使用间接变量引用的简单数据库应用 34-4. 用数组和其他的小技巧来处理四人随机打牌 A-1. mailformat: Formatting an e-mail message A-2. rn: A simple-minded file rename utility A-3. blank-rename: renames filenames containing blanks A-4. encryptedpw: Uploading to an ftp site, using a locally encrypted password A-5. copy-cd: Copying a data CD A-6. Collatz series A-7. days-between: Calculate number of days between two dates A-8. Make a "dictionary" A-9. Soundex conversion A-10. "Game of Life" A-11. Data file for "Game of Life" A-12. behead: Removing mail and news message headers A-13. ftpget: Downloading files via ftp A-14. password: Generating random 8-character passwords A-15. fifo: Making daily backups, using named pipes A-16. Generating prime numbers using the modulo operator A-17. tree: Displaying a directory tree A-18. string functions: C-like string functions A-19. Directory information A-20. Object-oriented database A-21. Library of hash functions A-22. Colorizing text using hash functions A-23. Mounting USB keychain storage devices A-24. Preserving weblogs A-25. Protecting literal strings A-26. Unprotecting literal strings A-27. Spammer Identification A-28. Spammer Hunt A-29. Making wget easier to use A-30. A "podcasting" script A-31. Basics Reviewed A-32. An expanded cd command C-1. Counting Letter Occurrences K-1. Sample .bashrc file L-1. VIEWDATA.BAT: DOS Batch File L-2. viewdata.sh: Shell Script Conversion of VIEWDATA.BAT P-1. Print the server environment C.2. Awk D. Exit Codes With Special Meanings E. A Detailed Introduction to I/O and I/O Redirection F. Standard Command-Line Options G. Important Files H. Important System Directories I. Localization J. History Commands K. A Sample .bashrc File L. Converting DOS Batch Files to Shell Scripts M. Exercises M.1. Analyzing Scripts M.2. Writing Scripts N. Revision History O. Mirror Sites P. To Do List 表格清单: 11-1. 作业标识符 30-1. Bash 选项 33-1. 转义序列中数值和彩色的对应 B-1. Special Shell Variables B-2. TEST Operators: Binary Comparison B-3. TEST Operators: Files B-4. Parameter Substitution and Expansion B-5. String Operations B-6. Miscellaneous Constructs C-1. Basic sed operators C-2. Examples of sed operators D-1. "Reserved" Exit Codes L-1. Batch file keywords / variables / operators, and their shell equivalents L-2. DOS commands and their UNIX equivalents N-1. Revision History 例子清单: 2-1. 清除:清除/var/log下的log文件 2-2. 清除:一个改良的清除脚本 2-3. cleanup:一个增强的和广义的删除logfile的脚本 3-1. 代码块和I/O重定向 3-2. 将一个代码块的结果保存到文件 3-3. 在后台运行一个循环 3-4. 备份最后一天所有修改的文件. 4-1. 变量赋值和替换 4-2. 一般的变量赋值 4-3. 变量赋值,一般的和比较特殊的 4-4. 整型还是string? 4-5. 位置参数 4-6. wh,whois节点名字查询 4-7. 使用shift 5-1. echo一些诡异的变量 5-2. 转义符 6-1. exit/exit状态 6-2. 否定一个条件使用! 7-1. 什么情况下为真? 7-2. 几个等效命令test,/usr/bin/test,[],和/usr/bin/[ 7-3. 算数测试使用(( )) 7-4. test死的链接文件 7-5. 数字和字符串比较 7-6. 测试字符串是否为null 7-7. zmore 8-1. 最大公约数 8-2. 使用算术操作符 8-3. 使用&&和||进行混合状态的test 8-4. 数字常量的处理 9-1. $IFS和空白 9-2. 时间输入 9-3. 再来一个时间输入 9-4. Timed read 9-5. 我是root? 9-6. arglist:通过$*和$@列出所有的参数 9-7. 不一致的$*和$@行为 9-8. 当$IFS为空时的$*和$@ 9-9. 下划线变量 9-10. 在一个文本文件的段间插入空行 9-11. 利用修改文件名,来转换图片格式 9-12. 模仿getopt命令 9-13. 提取字符串的一种可选的方法 9-14. 使用参数替换和error messages 9-15. 参数替换和"usage"messages 9-16. 变量长度 9-17. 参数替换中的模式匹配 9-18. 重命名文件扩展名 9-19. 使用模式匹配来分析比较特殊的字符串 9-20. 对字符串的前缀或后缀使用匹配模式 9-21. 使用declare来指定变量的类型 9-22. 间接引用 9-23. 传递一个间接引用给awk 9-24. 产生随机数 9-25. 从一副扑克牌中取出一张随机的牌 9-26. 两个指定值之间的随机数 9-27. 使用随机数来摇一个骰子 9-28. 重新分配随机数种子 9-29. 使用awk产生伪随机数 9-30. C风格的变量处理 10-1. 循环的一个简单例子 10-2. 每个[list]元素带两个参数的for循环 10-3. 文件信息:对包含在变量中的文件列表进行操作 10-4. 在for循环中操作文件 10-5. 在for循环中省略[list] 10-6. 使用命令替换来产生for循环的[list] 10-7. 对于二进制文件的一个grep替换 10-8. 列出系统上的所有用户 10-9. 在目录的所有文件中查找源字串 10-10. 列出目录中所有的符号连接文件 10-11. 将目录中的符号连接文件名保存到一个文件中 10-12. 一个C风格的for循环 10-13. 在batch mode中使用efax 10-14. 简单的while循环 10-15. 另一个while循环 10-16. 多条件的while循环 10-17. C风格的while循环 10-18. until循环 10-19. 嵌套循环 10-20. break和continue命令在循环中的效果 10-21. 多层循环的退出 10-22. 多层循环的continue 10-23. 在实际的任务中使用"continue N" 10-24. 使用case 10-25. 使用case来创建菜单 10-26. 使用命令替换来产生case变量 10-27. 简单字符串匹配 10-28. 检查是否是字母输入 10-29. 用select来创建菜单 10-30. 用函数中select结构来创建菜单 11-1. 一个fork出多个自己实例的脚本 11-2. printf 11-3. 使用read,变量分配 11-4. 当使用一个不带变量参数的read命令时,将会发生什么? 11-5. read命令的多行输入 11-6. 检测方向键 11-7. 通过文件重定向来使用read 11-8. 管道输出到read中的问题 11-9. 修改当前的工作目录 11-10. 用"let"命令来作算术操作. 11-11. 显示eval命令的效果 11-12. 强制登出(log-off) 11-13. 另一个"rot13"的版本 11-14. 在Perl脚本中使用eval命令来强制变量替换 11-15. 使用set来改变脚本的位置参数 11-16. 重新分配位置参数 11-17. Unset一个变量 11-18. 使用export命令传递一个变量到一个内嵌awk的脚本中 11-19. 使用getopts命令来读取传递给脚本的选项/参数. 11-20. "Including"一个数据文件 11-21. 一个没什么用的,source自身的脚本 11-22. exec的效果 11-23. 一个exec自身的脚本 11-24. 在继续处理之前,等待一个进程的结束 11-25. 一个结束自身的脚本. 12-1. 使用ls命令来创建一个烧录CDR的内容列表 12-2. Hello or Good-bye 12-3. 删除当前目录下文件名中包含一些特殊字符(包括空白)的文件.. 12-4. 通过文件的 inode 号来删除文件 12-5. Logfile: 使用 xargs 来监控系统 log 12-6. 把当前目录下的文件拷贝到另一个文件中 12-7. 通过名字Kill进程 12-8. 使用xargs分析单词出现的频率 12-9. 使用 expr 12-10. 使用 date 命令 12-11. 分析单词出现的频率 12-12. 那个文件是脚本? 12-13. 产生10进制随机数 12-14. 使用 tail 命令来监控系统log 12-15. 在一个脚本中模仿 "grep" 的行为 12-16. 在1913年的韦氏词典中查找定义 12-17. 检查列表中单词的正确性 12-18. 转换大写: 把一个文件的内容全部转换为大写. 12-19. 转换小写: 将当前目录下的所有文全部转换为小写. 12-20. Du: DOS 到 UNIX 文本文件的转换. 12-21. rot13: rot13, 弱智加密. 12-22. Generating "Crypto-Quote" Puzzles 12-23. 格式化文件列表. 12-24. 使用 column 来格式化目录列表 12-25. nl: 一个自己计算行号的脚本. 12-26. manview: 查看格式化的man页 12-27. 使用 cpio 来拷贝一个目录树 12-28. 解包一个 rpm 归档文件 12-29. 从 C 文件中去掉注释 12-30. Exploring /usr/X11R6/bin 12-31. 一个"改进过"的 strings 命令 12-32. 在一个脚本中使用 cmp 来比较2个文件. 12-33. basename 和 dirname 12-34. 检查文件完整性 12-35. Uudecod 编码后的文件 12-36. 查找滥用的连接来报告垃圾邮件发送者 12-37. 分析一个垃圾邮件域 12-38. 获得一份股票报价 12-39. 更新 Fedora Core 4 12-40. 使用 ssh 12-41. 一个可以mail自己的脚本 12-42. 按月偿还贷款 12-43. 数制转换 12-44. 使用 "here document" 来调用 bc 12-45. 计算圆周率 12-46. 将10进制数字转换为16进制数字 12-47. 因子分解 12-48. 计算直角三角形的斜边 12-49. 使用 seq 来产生循环参数 12-50. 字母统计 12-51. 使用getopt来分析命令行选项 12-52. 一个拷贝自身的脚本 12-53. 练习dd 12-54. 记录按键 12-55. 安全的删除一个文件 12-56. 文件名产生器 12-57. 将米转换为英里 12-58. 使用 m4 13-1. 设置一个新密码 13-2. 设置一个擦除字符 13-3. 关掉终端对于密码的echo 13-4. 按键检测 13-5. Checking a remote server for identd 13-6. pidof 帮助杀掉一个进程 13-7. 检查一个CD镜像 13-8. 在一个文件中创建文件系统 13-9. 添加一个新的硬盘驱动器 13-10. 使用umask来将输出文件隐藏起来 13-11. killall, 来自于 /etc/rc.d/init.d 14-1. 愚蠢的脚本策略 14-2. 从循环的输出中产生一个变量 14-3. 找anagram(回文构词法, 可以将一个有意义的单词, 变换为1个或多个有意义的单词, 但是还是原来的子母集合) 16-1. 使用exec重定向标准输入 16-2. 使用exec来重定向stdout 16-3. 使用exec在同一脚本重定向stdin和stdout 16-4. 避免子shell 16-5. while循环重定向 16-6. 另一种while循环重定向 16-7. until循环重定向 16-8. for循环重定向 16-9. for循环重定向 loop (将标准输入和标准输出都重定向了) 16-10. 重定向if/then测试结构 16-11. 用于上面例子的"names.data"数据文件 16-12. 记录日志事件 17-1. 广播: 发送消息给每个登录上的用户 17-2. 仿造文件: 创建一个两行的仿造文件 17-3. 使用cat的多行消息 17-4. 带有抑制tab功能的多行消息 17-5. 使用参数替换的here document 17-6. 上传一个文件对到"Sunsite"的incoming目录 17-7. 关闭参数替换 17-8. 一个产生另外一个脚本脚本 17-9. Here documents与函数 17-10. "匿名" here Document 17-11. 注释掉一段代码块 17-12. 一个自文档化(self-documenting)的脚本 17-13. 在一个文件的开头添加文本 20-1. 子shell中的变量作用域 20-2. 列出用户的配置文件 20-3. 在子shell里进行串行处理 21-1. 在受限的情况下运行脚本 23-1. 简单函数 23-2. 带着参数的函数 23-3. 函数和被传给脚本的命令行参数 23-4. 传递间接引用给函数 23-5. 解除传递给函数的参数引用 23-6. 再次尝试解除传递给函数的参数引用 23-7. 两个数中的最大者 23-8. 把数字转化成罗马数字 23-9. 测试函数最大的返回值 23-10. 比较两个大整数 23-11. 用户名的真实名 23-12. 局部变量的可见范围 23-13. 用局部变量来递归 23-14. 汉诺塔 24-1. 脚本中的别名 24-2. unalias: 设置和删除别名 25-1. 使用"与列表(and list)"来测试命令行参数 25-2. 用"与列表"的另一个命令行参数测试 25-3. "或列表"和"与列表"的结合使用 26-1. 简单的数组用法 26-2. 格式化一首诗 26-3. 多种数组操作 26-4. 用于数组的字符串操作符 26-5. 将脚本的内容传给数组 26-6. 一些数组专用的工具 26-7. 关于空数组和空数组元素 26-8. 初始化数组 26-9. 复制和连接数组 26-10. 关于连接数组的更多信息 26-11. 一位老朋友: 冒泡排序 26-12. 内嵌数组和间接引用 26-13. 复杂数组应用: 埃拉托色尼素数筛子 26-14. 模拟下推的堆栈 26-15. 复杂的数组应用: 列出一种怪异的数学序列 26-16. 模拟二维数组,并使它倾斜 27-1. 利用/dev/tcp 来检修故障 27-2. 搜索与一个PID相关的进程 27-3. 网络连接状态 28-1. 隐藏cookie而不再使用 28-2. 用/dev/zero创建一个交换临时文件 28-3. 创建ramdisk 29-1. 一个错误的脚本 29-2. 丢失关键字(keyword) 29-3. 另一个错误脚本 29-4. 用"assert"测试条件 29-5. 捕捉 exit 29-6. 在Control-C后清除垃圾 29-7. 跟踪变量 29-8. 运行多进程 (在多处理器的机器里) 31-1. 数字和字符串比较是不相等同的 31-2. 子SHELL缺陷 31-3. 把echo的输出用管道输送给read命令 33-1. shell 包装 33-2. 稍微复杂一些的shell包装 33-3. 写到日志文件的shell包装 33-4. 包装awk的脚本 33-5. 另一个包装awk的脚本 33-6. 把Perl嵌入Bash脚本 33-7. Bash 和 Perl 脚本联合使用 33-8. 递归调用自己本身的(无用)脚本 33-9. 递归调用自己本身的(有用)脚本 33-10. 另一个递归调用自己本身的(有用)脚本 33-11. 一个 "彩色的" 地址资料库 33-12. 画盒子 33-13. 显示彩色文本 33-14. "赛马" 游戏 33-15. 返回值技巧 33-16. 整型还是string? 33-17. 传递和返回数组 33-18. anagrams游戏 33-19. 在shell脚本中调用的窗口部件 34-1. 字符串扩展 34-2. 间接变量引用 - 新方法 34-3. 使用间接变量引用的简单数据库应用 34-4. 用数组和其他的小技巧来处理四人随机打牌 A-1. mailformat: Formatting an e-mail message A-2. rn: A simple-minded file rename utility A-3. blank-rename: renames filenames containing blanks A-4. encryptedpw: Uploading to an ftp site, using a locally encrypted password A-5. copy-cd: Copying a data CD A-6. Collatz series A-7. days-between: Calculate number of days between two dates A-8. Make a "dictionary" A-9. Soundex conversion A-10. "Game of Life" A-11. Data file for "Game of Life" A-12. behead: Removing mail and news message headers A-13. ftpget: Downloading files via ftp A-14. password: Generating random 8-character passwords A-15. fifo: Making daily backups, using named pipes A-16. Generating prime numbers using the modulo operator A-17. tree: Displaying a directory tree A-18. string functions: C-like string functions A-19. Directory information A-20. Object-oriented database A-21. Library of hash functions A-22. Colorizing text using hash functions A-23. Mounting USB keychain storage devices A-24. Preserving weblogs A-25. Protecting literal strings A-26. Unprotecting literal strings A-27. Spammer Identification A-28. Spammer Hunt A-29. Making wget easier to use A-30. A "podcasting" script A-31. Basics Reviewed A-32. An expanded cd command C-1. Counting Letter Occurrences K-1. Sample .bashrc file L-1. VIEWDATA.BAT: DOS Batch File L-2. viewdata.sh: Shell Script Conversion of VIEWDATA.BAT P-1. Print the server environment
  在Linux系统的/etc目录下有这样一个文件passwd,该文件里包含系统中所有用户信息的记录,记录里包含每个用户的如下信息:用户名、密码、用户ID、组ID、用户全名、用户主目录和用户登录所用的shell。请设计一个脚本(shell)程序能实现增加、删除、查找和显示特定用户信息的功能。你们可以通过创建一些UNIX/LINUX shell 脚本文件来满足以上需求。   可以用任意一个文本编辑器打开passwd文件,该文件里包含用冒号分隔开的字段组成的记录,如下所示:   root:x:0:0:root:/root:/bin/bash   zxj:x:500:500:zxj303:/home/zxj:/bin/bash   在主Shell脚本文件里(必须以 menu 命名)要有一个多操作选项的菜单以便用户从中选择。在不同任务的中,这些操作能自动实现以下功能: 在屏幕上显示当前所有用户的记录 在屏幕上显示当前所有用户(经过格式化和排序的)的记录 只在屏幕上显示用户名和用户ID 只在屏幕上显示(经过格式化和排序的)用户名和用户ID 查询并显示特定用户的记录 往passwd文件里增加新的用户记录 从passwd文件里删除某个用户记录   你可以使用UNIX/LINUX中一些比较简单的命令或命令组合来执行1、2、3、4、5的任务。对于任务6和7,你需要编写单独的Shell脚本文件(必须分别命名为add和delete)并且在你的主脚本menu文件中调用这些脚本文件。   可能你还需要查询一些Unix/Linux命令,比如awk,、sort、tr、cut、paste、sed、grep;你也可能还需要查询其他的Unix/Linux命令。   建议你在主目录下建立一个以 xx xx xx(xx xx xx为学号)命名的目录,并且在本次作业中使用它作为工作目录。 主脚本文件中的菜单   在menu脚本文件里将创建如下菜单,菜单里包含供用户选择的一些操作。 用户信息主菜单 打印当前所有记录 打印当前所有记录(格式化后的) 打印用户名和用户ID 打印(格式化了的)用户名和用户ID 查询特定记录 增加新记录 Q——退出 你的选择是:(等待用户输入)   当用户做了选择且所选的操作完成之后,应再次显示主菜单以供用户做下一步选择。你必须用while循环和case条件语句配合来完成此操作。另外在显示主菜单前必须先清除用户屏幕。在以下所有步骤中,当显示主菜单前都需要先清屏。   在menu脚本文件的前面部分你首先要定义三个变量,这三个变量分别存放passwd、add、delete文件的文件名,并且能在所有涉及到passwd、add、delete文件的语句中使用他们。 比如,可以定义成:           record_file=passwd   在所有访问passwd文件的语句中,只要使用 $record_file 即可。这样做的一个优点就是,如果以后你需要重新命名记录或者需要在不同的记录文件中使用你的脚本的话,你只需要修改以上一个语句而不须在所有有关的记录文件里逐一修改语句。如下定义另外两个变量:   add_file=add   delete_file=delete   定义以上变量之后,你必须核对menu脚本文件,看看所需的文件(passwd、add、delete)是否准确存放在当前目录下。如果其中任何一个不存在,你的脚本menu文件就必须显示以下信息,然后退出:   Required file theMissingFile does not exist.(所需文件不存在)   比如,如果passwd文件不存在,就显示“Required file passwd does not exist.(所需文件记录不存在)”然后退出。   在以上等待用户做出选择的菜单中,如果用户偶尔输入了一个代码而不是1、2、3、4、5、6、7或Q,就有信息提示“无效的代码,请按回车键继续``````”(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。可以允许用户使用Q或q退出。   在以上等待用户做出选择的菜单中,如果用户简单地按了回车键(而不是输代码)的话,就会出现信息“Selection not entered. Press Enter to continue…"(务必保证光标停留在此信息行末尾而不是在下一行的开始处)。等用户按了回车键之后,再次显示主菜单供用户做其他选择。   当用户选择了第一项——打印当前所有用户记录   以下是当用户在主菜单中选择第一个选项后,menu脚本文件输出的内容的例子: (此处是主菜单—略) 你的选择:1(用户输入) root x 0 0 root /root /bin/bash zxj x 500 500 zxj303 /home/zxj /bin/bash 按回车键继续。。。(等用户按回车键。按后要再次显示主菜单) (注:以上输出内容与passwd文件不同之处在于:空格键代替了所有的冒号。你需要找找哪些Linux命令会这样做。)   当用户选择第二项时——打印当前经过格式化的用户记录后,   以下是当用户在主菜单中选择第二个选项后,menu脚本文件输出的例子: (此处是主菜单—略) 你的选择:2(用户输入) root x 0 0 root /root /bin/bash zxj x 500 500 zxj303 /home/zxj /bin/bash 按回车键继续。。。(等用户按回车键。按后再次显示主菜单) (说明:以上格式输出是按用户名排序的。每列应该左对齐。)   当用户选择3时,——打印用户名和用户ID   以下是当用户在主菜单中选择第三个选项后在脚本菜单输出的内容的例子: (此处是主菜单—略)   你的选择:3(用户输入)   root,0   zxj,500 按回车键继续。。。(等用户按回车键。按后再次显示主菜单) (注意 以上输出与passwd文件内容之间的不同之处。冒号已被逗号代替。每个表目[记录]只有显示姓名和电话号码。)   当用户选择4时,——打印(格式化的)用户名和用户ID   以下是当用户在主菜单中选择第四个选项后在脚本菜单输出的内容的例子: (此处是主菜单—略)   你的选择:4(用户输入)   root 0   zxj 500 按回车键继续。。。(等用户按回车键。按后再次显示主菜单)   当用户选择5时,——查找特定的记录   以下是当用户在主菜单中选择第五个选项后在脚本菜单输出的内容的例子:   (此处是主菜单—略)   你的选择:5(用户输入)   输入关键字:Jones (用户输入)   Jones:x:600:600:Jones Sarah:/home/Jones:/bin/sh 按回车键继续。。。(等用户按回车键。按后再次显示主菜单)   如果输入的关键字不在记录里,则必须输出相关信息,示例如下: (此处是主菜单—略) 你的选择是:5(用户输入) 输入关键字:Monks (用户输入) 没有找到Monks 按回车键继续。。。(等用户敲回车键。之后再次跳出主菜单)   如果用户简单地按回车键而不是输入关键字,就要产生以下输出: (此处是主菜单) 你的选择是:5(用户输入) 输入关键字:(用户简单地按回车键没有输入任何东西,即没有键入关键字) 没有输入关键字 输入关键字:(仍然等待用户的输入)   可以允许输入的关键字不区分大小写(例如JONE和jone的输出结果是一样的) 你的add脚本文件   当用户在主菜单里选择6时你的add脚本文件就要被调用,以下是增加功能的输出示例: (此处是主菜单—略) 你的选择是:6 (先清屏)             用户信息增加情况 输入新用户的具体情况 确认密码: 用户ID: 用户全名: 用户主目录: 登录shell:   你的脚本文件必须能使用户输入一个有效的用户ID(数字、一般非超级用户的ID大等于500)。你的脚本文件必须能够识别用户输入的ID。 如果用户只是简单的按回车键,就要输出以下内容: 用户ID(xxxx):(由用户简单的按回车) 没有键入ID 用户ID:(xxxx):(等待用户输入一个有效的ID) 如果用户输入的是一个无效的ID或者是不符合格式的ID,就要输出以下信息: 用户ID:(xxxx): abc123 (用户输入) 用户ID:(xxxx): (等待用户输入一个有效的ID) 对组ID的要求类似与用户ID 用户名:Warren (用户输入)   一个有效的用户名必须只含字母和数字。类似以上所说的,如果用户输入一个无效的用户名,就应该显示这样的信息:“用户名只包含字母和数字”,并且提示用户再次输入姓。如果用户只按回车没有输入的话,则显示信息:“没有输入用户名”,并提示用户再次输入姓。 密码:****** (用户输入)   输入密码时不显示或显示*,要求密码长度至少达到6位以上、且由大小写字母、数字和控制字符组成;确认密码如果与密码不符应该让用户重新输入。 主目录:Todd(非用户输入,但要根据用户名正确显示)   一个有效的主目录名必须根据用户名在/home目录下正确地添加,要求能在passwd文件中的相应记录上自动添加主目录名,还要在/home 目录下自动建立该名字的目录(可以暂不做)。 登录shell:bash(用户输入)   一个有效的shell必须只能是bash、sh、kash、csh中的一种。如果用户输入一个无效的shell名,就会显示这样的信息:“输入的shell名不在本系统范围内!”,并且提示用户再次输入。如果用户只按回车没有输入的话,则显示信息:“没有输入!”,并提示用户再次输入shell名。 (此信息只在成功增加新记录之后才显示,如果新的记录没有成功增加则不能显示次信息。在后面的例子里,用把内容添加到已存在文件上的UNIX命令显示一个标准的错误信息)。 再增加一个吗?(是)或(否):是(用户输入) (以上过程从“首先清理用户屏幕”开始,然后重复。   然而,如果用户输入了N,增加记录操作就要退出,然后显示主菜单,以便用户能做其他选择,(比如,现在用户可能想要浏览记录文件中的内容以便确认新记录是否已经添加进文件。)   如果用户偶然打进一个代码而非Y或N,就会退出增加记录操作并显示主菜单。   在add脚本文件的开始,你必须定义一个变量,这个变量存放passwd文件的文件名,并且能在所有涉及到passwd文件的语句中使用它。 在你的shell程序全部完成后你可以自己编三条记录添加到passwd文件中。 你的delete脚本文件    当用户在主菜单中选择7时,你的delete脚本文件必须被调用。下面是示例: (主菜单如下) 你的选择:7(用户输入) (先清屏)删除用户记录 输入用户ID(xxxx): 500(用户输入) zxj:x:500:500:zxj303:/home/zxj:/bin/bash   你的delete脚本必须要求用户输入有效的用户ID,要求同add脚本。若有用户输入一个无效的用户ID,应显示信息:“无效的用户ID!”,并再次提示用户输入一个用户ID。如果用户简单的按回车键而没有任何输入,显示信息:“没有输入!”,并提示用户再次输入一个用户ID。) 确认删除:(是)或(否):是(用户输入) 记录删除。(此信息只在成功删除新记录之后才显示,如果记录没有成功删除则不能显示此信息。在后面的例子里,UNIX系统将会显示一个标准的错误提示信息)。 (如果用户输入N或者除了Y或N以外的字母的话,删除操作应该退出并显示主菜单。这样能保证用户按Y来删除一个记录) Delete another? (y)es or (n)o: y (user input) 再删除一个?(是)或(否):是(用户输入) (以上过程从清屏开始并不断重复) 如果用户输入N或者除了Y或N的字母外,就退出删除操作,显示主菜单。 然而,如果找不到包含有键入用户ID的记录的话,就要输出以下信息: 删除用户记录 输入用户ID(xxxx):5555 (用户输入) 没有找到5555 按回车继续…… (务必使鼠标停留在信息末尾。等用户按了回车后,跳出主菜单。)   在你的delete脚本文件的开始处,你必须定义一个变量,这个变量存放passwd文件的文件名,并且能在所有涉及到passwd文件的语句中使用它。 对大作业的要求:    必须包含你的姓名,学生号以及你的SHELL脚本文件如何使用的简介。你还必须确认在Bash SHELL中可以运行你的脚本文件。为了使你的脚本文件输出更具有可读性,请在合适的地方用”\n”和注释。还要考虑脚本结构和布局。 如何交你的作业:    你需要分别以硬拷贝(书面形式)和电子文档形式(副本)提交你的shell编程大作业。   你必须提交一份硬拷贝(有一个写上名字的装订好的封面)和一份含下面四个文件的电子拷贝(三份SHELL脚本和一份文本文件)。   menu、add、delete、passwd
当以某个输入值的True和False为条件,终止某个操作时,常规的解题思路是啥?例如: 写一个程序 ,输入很多人的姓名,年龄,成绩, 把这些人的信息存入到列表中,以空格键为结束符号: 张三 20 100 李四 21 96 解题:一般套路如下 L = [] while True: n = input(‘请输入姓名:’) if not n:#如果条件为Fals... while循环是一种在Linux下使用shell脚本循环结构,它可以重复执行一组命令,直到满足某个条件为止。while循环的语法格式如下: while [ condition ] command1 command2 其中,condition是一个条件表达式,如果它的值为真,则会执行循环体中的命令,否则跳出循环循环体中可以包含任意数量的命令,每个命令都必须以换行符结束。当循环体中的所有命令都执行完毕后,会再次检查条件表达式的值,如果仍为真,则继续执行循环体中的命令,直到条件表达式的值为假为止。 ### 回答2: 在Linux下,shell脚本是一种用于自动化任务的脚本语言,while循环是其中比较重要的控制结构之一。 while循环可用于执行一个命令序列,直到条件不再为真。其基本语法为: while condition command(s) 其中condition是一个用于检查循环是否继续执行的判断条件,可以是任何语句,但必须以非零退出状态码表示false,零退出状态码表示true。 在循环体内,可使用任何shell命令和语句,包括if-then语句、break、continue等。 while循环的实例: 我们可以用while循环输出0到9之间的数字: #!/bin/bash while [ $i -lt 10 ] echo $i i=$((i+1)) 这个脚本首先用i=0初始化一个变量i,然后在while loop中,我们检查i是否小于10。如果是,我们输出i的值,并将i递增。循环继续执行,直到i不小于10为止。 总之,while循环是编写Linux脚本中不可或缺的控制结构之一,能够有效地帮助我们完成各种任务,提高工作效率。 ### 回答3: Shell脚本是一种在Linux系统下使用的编程语言,它支持大量的命令行操作和自动化任务。其中,while循环是Shell脚本中最常用的循环结构之一,它允许我们根据某个条件不断地重复执行一段代码块。在本文中,我们将详细介绍linux下Shell脚本中的while循环。 1. while循环语法 while循环语法如下: while [ condition ] command1 command2 command3 其中,`condition`是一个测试条件,每次循环开始之前都会被检查。如果`condition`为真,则会执行循环体中的多个`command`。之后再次检查`condition`,如果仍为真,则会一直重复执行多个`command`,直到`condition`为假为止。 2. while循环实例 以下是使用Shell脚本while循环的几个实例: # 打印数字1至10 while [ $x -le 10 ] echo $x x=$((x+1)) # 读取文件中的每一行,并打印 while read line echo $line done < filename.txt # 无限循环,直到用户输入"quit" while true read x if [ $x == "quit" ] break 在上述示例中,第一个例子是使用while循环打印数字1至10。我们使用`x`变量来跟踪循环次数,并在循环体中递增`x`的值,直到达到目标值。 第二个例子是从文件中读取每一行并将其打印。我们使用`read`命令来读取文件中的每一行,并将其存储在`line`变量中。然后,我们可以在循环体中使用`echo`命令打印行。 第三个例子是使用while循环创建一个无限循环。我们使用`true`命令作为无限循环的测试条件。在循环体中,我们使用`read`命令从标准输入读取一个字符串,并检查它是否等于"quit"。如果是,我们使用`break`命令退出循环。 3. 总结 在Linux下使用Shell脚本时,while循环是非常有用的。它使我们能够执行一些基本的重复任务,例如打印数字或读取文件。使用while循环还可以创建无限循环,例如等待用户输入命令。掌握while循环语法和样例之后,我们可以将它们集成到我们的Shell脚本中,从而实现更多的自动化任务和工作流程。