面向程序员的Linux Shell脚本编程深度指南

本文介绍了Shell作为命令解释器的作用,涵盖了基础操作、文件管理、脚本编写、条件控制、函数定义、应用场景(如自动化任务、系统维护和数据处理)、可执行文件和PATH环境变量,以及内置和外部命令的区别,以及获取帮助的方法。

Shell

Shell 可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我们可以通过终端控制台来输入命令,由shell进行解释并最终交给内核执行。

Shell教程基础

1. 基础操作与命令

  • 文件和目录操作

    • 创建目录:mkdir directory_name

    • 更改工作目录:cd path/to/directory

    • 列出目录内容:ls

    • 删除空目录:rmdir directory_name

    • 删除文件或目录(递归删除):rm -rf file_or_directory

  • 执行命令与输出重定向

    • 执行命令:如 echo "Hello, World!" 输出文本

    • 管道符(|):将一个命令的输出作为另一个命令的输入,如 ls -l | grep ".txt" 查找所有.txt文件

    • 输出重定向:command > output_file 将命令输出写入文件;command >> output_file 追加输出到文件

  • 变量与字符串操作

    • 定义变量:var="value"

    • 使用变量:${var}

    • 字符串连接:echo "${var} is my variable"

2. Shell脚本编写

  • 创建脚本:在文本编辑器中创建一个.sh文件,例如 script.sh,并在开头添加执行权限声明 #!/bin/bash

  • 脚本示例:

 #!/bin/bash
 # 创建目录
 mkdir /usr/directory
 cd /usr/directory || exit 1
 # 创建子目录
 mkdir code util test
  • 条件判断与流程控制

    • if 条件语句:

       if [ condition ]; then
           commands
       fi
    • case 语句用于多分支选择:

       case $variable in
           pattern1)
               commands;;
           pattern2)
               commands;;
           *)
               default_commands;;
       esac
  • 循环结构

    • for 循环:

       for var in item1 item2 item3; do
           echo "$var"
       done
    • while 循环:

       while [ condition ]; do
           commands
       done

3. 函数定义与调用

  • 定义函数:

     function my_function() {
         # 函数体
     }
  • 调用函数:

     my_function arg1 arg2

使用场景

场景一:自动化任务

  • 自动备份特定目录下的文件。

  • 每天定时检查服务器状态并发送报告邮件。

场景二:系统管理

  • 在多个服务器上批量安装软件或更新配置。

  • 清理临时文件、日志滚动、资源监控等维护任务。

场景三:数据处理

  • 处理大批量的日志文件,从中提取有用信息。

  • 对数据库查询结果进行格式化输出或进一步分析。

场景四:构建工具

  • 编写自动化构建脚本,如编译源代码、运行测试套件、打包部署等。

场景五:批处理作业

  • 批量转换文件格式,如图片转换、文本编码转换等。

可执行文件

在Unix/Linux系统中,如果一个文件具有可执行权限,并且位于系统的PATH环境变量所包含的路径下,那么这个文件就可以作为命令来直接运行。当你在终端输入该文件名并按回车时,Shell会查找PATH中的目录找到该文件并执行它。

例如,假设你有一个名为mycommand的可执行文件,存放在 /usr/local/bin 目录下(而此目录通常包含在PATH环境变量中),你可以像运行内置或外部命令一样,在终端直接输入 mycommand 来执行它。

要使一个文件成为可执行文件,你需要给它添加执行权限,可以使用 chmod 命令:

 chmod +x /path/to/mycommand

然后,无需指定完整路径,只需输入文件名即可运行它:

 mycommand

这种机制使得用户可以根据需要编写自己的程序或脚本,并将其设置为可执行文件,从而扩展系统的功能。

其中有哪些目录包含在PATH中?

在Unix/Linux系统中,PATH 是一个环境变量,它定义了一个目录列表,当你在命令行输入一个命令时,Shell会按照这个列表中的顺序依次查找该命令对应的可执行文件。

PATH 环境变量的内容是一系列路径名,用冒号(:)分隔。例如:

 echo $PATH

输出可能是这样的:

 

 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

这里 /usr 目录并不是 PATH 的一部分,而是 PATH 中包含的一些路径下的子目录。比如 /usr/bin/usr/sbin 这两个目录通常包含在 PATH 里,它们用于存放系统级的用户和管理员可执行程序。

以下是在Linux系统中常见的放置可执行文件的目录:

  1. /bin: 存放对所有用户都重要的、基本的可执行文件,这些程序是启动系统和运行shell所必需的。

  2. /sbin: 同样包含重要系统程序,但主要是面向系统管理员的工具,如启动脚本、服务管理命令等。

  3. /usr/bin: 放置大部分用户使用的可执行文件,包括各种应用软件的命令行工具。

  4. /usr/local/bin: 用户自行安装或编译的软件通常被放在这一目录下,这里的程序对所有用户可用。

  5. /usr/sbin: 类似于 /sbin,但是针对的是非核心的系统级别的管理命令。

  6. /usr/local/sbin: 同样为本地安装的系统管理命令,但使用频率相对较低或仅限超级用户使用。

当需要运行一个命令时,Shell会首先检查当前工作目录(.),然后按照 PATH 环境变量列出的目录顺序搜索指定的可执行文件。如果找到多个同名的可执行文件,那么最先出现在 PATH 路径中的那个将被执行。

内置命令(Built-in Commands): 内置命令是Shell程序本身的一部分,它们不需要外部程序或文件来执行。当你在Shell中输入一个内置命令时,Shell直接在其内部处理这个命令,无需创建新的进程。内置命令通常用于管理Shell自身的环境和功能,例如:

  • cd 改变当前工作目录

  • echo 输出文本到终端

  • export 设置或显示环境变量

  • history 显示命令历史记录

  • exit 退出当前Shell

外部命令(External Commands): 外部命令则是指独立于Shell程序之外的、存储在磁盘上的可执行文件。当在Shell中输入一个外部命令时,Shell需要查找该命令对应的文件(通常是通过PATH环境变量指定的路径列表进行搜索),然后创建一个新的子进程来执行这个文件。外部命令可以完成各种系统级别的操作,例如:

  • ls 列出目录内容

  • mkdir 创建新目录

  • grep 在文件中搜索匹配模式

  • cat 查看或合并文件内容

总结起来,Shell就像是一个控制台工具箱,内置命令相当于工具箱内自带的小工具,可以直接使用;而外部命令则是工具箱外额外挂载的各种专业工具,需要从磁盘加载后才能使用。通过Shell,用户能够方便地管理和操控整个操作系统。

常用快捷键

快捷键功能
ctrl + c停止进行
ctrl + l清屏,等同于 clear(往上翻能看到记录);彻底清屏:reset
tab提示(防止敲错,高效)
上下键查看执行过的命令

帮助命令

manhelp--help 是在Unix/Linux系统中用于获取命令或程序帮助信息的不同方法,它们的区别如下:

  1. man (manual)

    • 功能man 命令是用来查看系统手册页(Manual Pages)的工具,手册页包含了几乎所有Linux命令、系统调用、库函数、设备文件等详细说明和使用方法。

    • 范围man 提供的信息通常更为详尽且结构化,它会显示多章节的手册内容,每个命令可能有多个部分(例如,1表示用户命令,2表示系统调用,3表示库函数等)。

    • 示例man ls 会打开ls命令的手册页。

  2. help

    • 功能:对于Bash Shell或其他shell内置命令,可以使用 help 来获取简要的帮助信息。这主要用于Shell本身的内部命令。

    • 范围help 的适用范围限于当前Shell环境下的内置命令,不适用于外部命令或系统级别的命令。

    • 示例help cd 会显示关于cd内置命令的简单帮助信息。

  3. --help

    • 功能:许多GNU工具及现代软件遵循的一个约定是提供一个 --help 参数选项,通过运行命令加上 --help 可以直接从命令行获得该命令的基本使用方法和参数选项列表。

    • 范围--help 主要针对的是具体的可执行程序,尤其是GNU项目以及其他遵循这一规范的程序,无论它们是否是shell内置命令还是外部命令。

    • 示例ls --help 或者 gcc --help 将分别显示ls命令和gcc编译器的简洁帮助信息。

总结来说,如果你想要详细了解一个命令的所有细节和选项,首选 man;如果你只需要查看shell内置命令的基本帮助,使用 help;而如果一个命令提供了 --help 选项,则可以通过该命令直接获取快速参考指南。

本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的文字处理以及少量的系统管理问题。本书内容全面、文字简洁流畅,适合Shell编程人员学习、参考。 目 录 译者序 前言 第一部分 shell 第1章 文件安全与权限 1 1.1 文件 1 1.2 文件类型 2 1.3 权限 2 1.4 改变权限位 4 1.4.1 符号模式 4 1.4.2 chmod命令举例 5 1.4.3 绝对模式 5 1.4.4 chmod命令的其他例子 6 1.4.5 可以选择使用符号模式或绝对模式 7 1.5 目录 7 1.6 suid/guid 7 1.6.1 为什么要使用suid/guid 8 1.6.2 设置suid/guid的例子 8 1.7 chown和chgrp 9 1.7.1 chown举例 9 1.7.2 chgrp举例 9 1.7.3 找出你所属于的用户组 9 1.7.4 找出其他用户所属于的组 10 1.8 umask 10 1.8.1 如何计算umask值 10 1.8.2 常用的umask值 11 1.9 符号链接 12 1.9.1 使用软链接来保存文件的多个映像 12 1.9.2 符号链接举例 12 1.10 小结 13 第2章 使用find和xargs 14 2.1 find命令选项 14 2.1.1 使用name选项 15 2.1.2 使用perm选项 16 2.1.3 忽略某个目录 16 2.1.4 使用user和nouser选项 16 2.1.5 使用group和nogroup选项 16 2.1.6 按照更改时间查找文件 17 2.1.7 查找比某个文件新或旧的文件 17 2.1.8 使用type选项 17 2.1.9 使用size选项 18 2.1.10 使用depth选项 18 2.1.11 使用mount选项 18 2.1.12 使用cpio选项 18 2.1.13 使用exec或ok来执行shell命令 19 2.1.14 find命令的例子 20 2.2 xargs 20 2.3 小结 21 第3章 后台执行命令 22 3.1 cron和crontab 22 3.1.1 crontab的域 22 3.1.2 crontab条目举例 23 3.1.3 crontab命令选项 23 3.1.4 创建一个新的crontab文件 24 3.1.5 列出crontab文件 24 3.1.6 编辑crontab文件 24 3.1.7 删除crontab文件 25 3.1.8 恢复丢失的crontab文件 25 3.2 at命令 25 3.2.1 使用at命令提交命令或脚本 26 3.2.2 列出所提交的作业 27 3.2.3 清除一个作业 27 3.3 &命令 27 3.3.1 向后台提交命令 28 3.3.2 用ps命令查看进程 28 3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 tee 39 5.6 标准输入、输出和错误 40 5.6.1 标准输入 40 5.6.2 标准输出 40 5.6.3 标准错误 40 5.7 文件重定向 40 5.7.1 重定向标准输出 41 5.7.2 重定向标准输入 42 5.7.3 重定向标准错误 42 5.8 结合使用标准输出和标准错误 43 5.9 合并标准输出和标准错误 43 5.10 exec 44 5.11 使用文件描述符 44 5.12 小结 45 ... ...
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值