Shell十三问:ChinaUnix精华帖详解

需积分: 9 3 下载量 107 浏览量 更新于2024-10-04 收藏 395KB PDF 举报
"Shell十三问-ChinaUnix精华贴整理.pdf" 这篇文档是ChinaUnix论坛上关于Shell编程的精华问答整理,由用户Lkydeer于2007年编纂。文档涵盖了13个关于Shell的重要问题,旨在帮助读者深入理解Shell的工作原理和用法。 1. **为何叫做shell?** Shell被称为“外壳”,是因为它是用户与操作系统内核(kernel)之间的接口。用户通过Shell来执行命令,而Shell将这些命令解析并传递给内核执行,起到了用户与系统之间的桥梁作用。 2. **shellprompt(PS1)与CarriageReturn(CR)的关系?** shellprompt(PS1)是Shell提示符,用于显示在命令行界面中提示用户输入命令。Carriage Return(CR)是回车字符,在文本编辑和输出中用于将光标移动到当前行的开始。PS1中的CR可以控制提示符在新的一行开始显示。 3. **echo与echo的区别** echo命令用于在终端输出字符串,双引号(" ")内的特殊字符会被解析,而单引号(' ')内的字符不会被解析,保持原样输出。 4. **""(双引号)与''(单引号)的区别** 双引号允许变量扩展和特殊字符解析,如`$var`会输出变量var的值;而单引号则阻止这种扩展,所有内容原样输出。 5. **var=value与export的区别** `var=value`定义了一个局部变量,只在当前shell会话中有效;`export var=value`将变量设置为环境变量,使得子shell也可以访问。 6. **exec与source的区别** exec命令用于替换当前shell进程,执行指定的命令或脚本,原有shell进程的环境变量等信息会被新命令替代;而source(或`. filename`)是在当前shell上下文中执行脚本,不会创建新的shell进程,因此环境变量的改变会立即生效。 7. **()与{}的区别** ()用于启动子shell,其中的命令在子shell环境中执行,对父shell环境无直接影响;{}是bash中的命令组,用于在同一shell进程中执行一组命令。 8. **$(())与$()和${}的区别** $(())和$()都是算术扩展,用于计算表达式,区别在于$(())支持C-style的语法,而$()内部的表达式更简洁;${}是变量扩展,可以用来提取变量的一部分或者进行其他复杂的变量操作。 9. **$@与$*的区别** $@表示所有位置参数,每个参数作为一个单独的元素;$*将所有位置参数视为一个整体,用单个字符串表示。 10. **&&与||的区别** &&和||是逻辑运算符,用于连接多个命令。前者表示前一个命令成功后才执行下一个命令,后者表示前一个命令失败后才执行下一个命令。 11. **>与<的区别** >用于重定向输出,将命令的输出覆盖到文件中;<用于重定向输入,将文件内容作为命令的输入。 12. **重定向的相关知识** - 重定向可以使用单个大于号(>)或双大于号(>>),前者覆盖文件内容,后者追加到文件末尾。 - 使用小于号(<)可以从文件读取输入。 - 重定向还可以结合管道(|)和其他命令组合使用,实现复杂的数据流处理。 13. **if与case的选择** if语句用于条件判断,根据条件执行不同代码块;case语句适用于多分支选择,结构更加灵活,适合处理多种情况。 14. **for与while/until的区别** for循环通常用于已知迭代次数的情况,如遍历数组或列表;while和until循环则根据条件持续执行,直到条件满足或不满足为止。 15. **[^]与[!]的区别** 在正则表达式中,`[^...]`表示匹配除括号内字符之外的任何字符,而`[!]`在某些shell中可能表示否定字符类,但在标准的POSIX shell中,`[!]`可能被解释为不正确的字符类表达式。 这份文档通过一系列问题,深入浅出地介绍了Shell编程的基础知识和高级特性,对于初学者和进阶者都有很好的参考价值。