Unix系列shell程序编写
- 格式:pdf
- 大小:527.79 KB
- 文档页数:30
Shell脚本编写的高级技巧利用定时任务实现定时操作Shell脚本编写的高级技巧:利用定时任务实现定时操作Shell脚本是一种在Unix/Linux系统下编写的脚本语言,它可以通过命令行解释器(如Bash)执行一系列的命令。
在Shell脚本编写的过程中,掌握一些高级技巧可以提高脚本的可用性和灵活性。
其中,利用定时任务实现定时操作是一项常见且有用的技巧。
本文将介绍利用定时任务实现定时操作的方法和技巧。
1. 使用crontab定时任务crontab是Unix/Linux系统中的一个定时任务管理工具,它可以根据用户的定义,定期执行某个脚本或命令。
在Shell脚本中,我们可以通过编辑crontab文件来设置定时任务。
具体步骤如下:1. 打开终端,输入命令 "crontab -e",进入crontab编辑界面。
2. 在编辑界面中,按照一定的格式添加定时任务。
例如,要每天的上午9点执行一个脚本,可以在文件中添加以下内容:```0 9 * * * /path/to/script.sh```这行代码表示在每天上午9点执行指定路径下的script.sh脚本。
3. 保存文件并退出编辑界面。
crontab将自动根据设置的定时任务在指定时间执行。
2. 参数详解在上述示例中,0 9 * * * 是crontab的时间表达式之一,用于设置任务的执行时间。
这个时间表达式由5个字段组成,分别代表分钟、小时、日期、月份和星期。
这5个字段可以使用特定的符号进行表示。
例如,星号(*)代表任意值,逗号(,)表示多个值,连字符(-)表示范围,斜线(/)表示间隔。
下面是一些常用的时间表达式示例:- `* * * * *`:每分钟执行一次。
- `0 * * * *`:每小时的第0分钟执行。
- `0 9 * * *`:每天上午9点执行。
- `0 9,18 * * *`:每天的上午9点和下午6点执行。
- `*/15 * * * *`:每15分钟执行一次。
高级Shell脚本编写技巧利用进程间通信实现数据传递Shell脚本是一种在Unix系统下执行命令的脚本语言,它通过命令行界面运行,可以自动执行多个命令,实现一系列复杂的任务。
在Shell脚本编写中,进程间通信是一种重要的技巧,可以实现不同进程之间的数据传递与共享。
本文将介绍高级Shell脚本编写技巧,重点讨论如何利用进程间通信实现数据传递。
一、管道(Pipe)通信管道是一种最常用的进程间通信方式,它可以将一个进程的输出连接到另一个进程的输入,实现数据的传递。
在Shell脚本中,可以使用竖线符号(|)将两个命令连接起来,将前一个命令的输出作为后一个命令的输入。
例如,下面的命令将列出当前目录下的文件,并将结果通过管道传递给grep命令进行过滤:```ls | grep "*.txt"```管道通信非常方便,但只能实现简单的单向通信,无法实现双向通信。
二、命名管道(Named Pipe)通信命名管道是一种特殊的文件,可以用于实现进程间的通信。
它将一个特殊文件与一个或多个进程相关联,这些进程可以通过读取或写入该文件来进行通信。
在Shell脚本中,可以使用mkfifo命令创建一个命名管道,然后通过重定向符号(<和>)将数据写入或读取到该管道文件。
例如,下面的命令将创建一个命名管道文件,并将该文件作为输出重定向到另一个进程:```mkfifo mypipecommand > mypipe```命名管道通信可以实现双向通信,但需要注意的是,读取和写入命名管道的操作必须在不同的进程中进行,否则可能会出现死锁的情况。
三、共享内存通信共享内存是一种在多个进程之间共享数据的方法,它通过将一块内存区域映射到不同进程的地址空间中,实现数据的传递与共享。
在Shell脚本中,可以使用共享内存通信工具ipcs来创建和管理共享内存。
例如,下面的命令将创建一个共享内存,并将数据写入到该共享内存中:```ipcs | grep "Shared Memory"ipcmk -M 1024ipcs | grep "Shared Memory"```共享内存通信可以实现高效的数据传递与共享,但需要注意的是,由于多个进程可以同时访问共享内存,需要进行适当的同步操作,以免出现竞争条件和数据不一致等问题。
Shell脚本编写如何递归遍历并执行操作Shell脚本是一种在Unix/Linux系统环境下执行的脚本语言,它通过命令行解释器将用户输入的命令逐行执行。
脚本可以编写一系列命令,并通过递归遍历的方式执行这些命令,从而自动完成一些重复性的工作。
本文将介绍如何编写Shell脚本来实现递归遍历并执行操作的功能。
1. 了解递归遍历的基本概念递归遍历是指在程序执行过程中,通过反复调用自身来遍历数据结构或目录结构的过程。
它常用于处理复杂的层次结构,如文件目录、树形结构等。
2. 遍历目录结构的基本语法在Shell脚本中,我们可以使用`find`命令来实现目录结构的递归遍历。
`find`命令的基本语法如下:```shellfind [路径] [选项] [动作]```其中,`路径`表示待遍历的目录路径,可以是相对路径或绝对路径;`选项`用于指定遍历的条件,如`-name`用于指定文件名匹配模式;`动作`指定对匹配的文件执行的操作,如`-exec`用于执行指定的命令。
3. 编写脚本实现递归遍历并执行操作下面是一个示例的Shell脚本,用于递归遍历目录结构,并计算所有文件的行数:```shell#!/bin/bash# 定义递归遍历函数traverse() {for file in "$1"/*doif [ -d "$file" ]thentraverse "$file" # 递归遍历子目录elif [ -f "$file" ]then# 执行操作,统计文件的行数lines=$(wc -l < "$file")echo "File $file has $lines lines"fidone}# 调用递归遍历函数,传入起始目录路径traverse "/path/to/directory"```在上述脚本中,通过定义一个递归遍历函数`traverse`,通过循环遍历目录中的所有文件和子目录。
如何编写交互式的shell脚本Shell脚本是一种在Unix或类Unix系统下编写的脚本程序,它可以与操作系统进行交互,并执行一系列的命令。
编写交互式的shell脚本能够使用户更方便地输入参数并获得结果。
本文将介绍如何编写交互式的shell脚本,以提高用户体验和脚本的可用性。
一、使用read命令获取用户输入Shell脚本可以使用read命令获取用户输入的数据,并保存在变量中。
通过在脚本中添加read命令,我们可以在脚本执行期间与用户进行交互。
以下是一个简单的例子:```shell#!/bin/bashecho "请输入您的姓名:"read nameecho "您好,$name!欢迎使用本脚本!"```在执行这个脚本时,脚本会提示用户输入姓名,用户输入后,脚本会输出一句问候语,并使用用户输入的姓名进行动态替换。
二、添加提示信息和默认值为了使用户能够更好地理解需要输入的内容,我们可以在read命令前添加提示信息。
另外,为了提高脚本的可用性,我们还可以为变量设置默认值。
以下是一个示例:```shell#!/bin/bashread -p "请输入您的年龄(默认为18岁):" ageage=${age:-18}echo "您的年龄是:$age"```在这个脚本中,通过添加-p参数,read命令会显示一个带有提示信息的提示符。
用户可以根据提示信息输入内容,如果用户没有输入,则会使用默认值。
在输出时,脚本会显示用户输入的年龄。
三、使用选项菜单除了使用read命令获取用户输入外,还可以使用选项菜单使用户从多个选项中进行选择。
以下是一个示例:```shell#!/bin/bashecho "请选择您的操作:"echo "1. 查看系统信息"echo "2. 查看磁盘空间"echo "3. 查看内存使用情况"read -p "请输入选项(1-3):" choice case $choice in1)echo "系统信息:"uname -a;;2)echo "磁盘空间:"df -h;;3)echo "内存使用情况:"free -h;;*)echo "无效的选项!"esac```在这个脚本中,我们使用echo命令输出选项菜单,并使用read命令获取用户输入的选项。
cshell语法Cshell是一种Unix Shell程序,主要用于在命令行界面下与操作系统进行交互。
Cshell语法是Cshell编程中必须掌握的一部分,它允许用户编写脚本来自动化一系列操作。
Cshell语法的基本结构与C语言类似,包含命令、参数和控制结构等。
以下是一些常用的Cshell语法:1. 命令和参数:Cshell中,命令和参数是以空格分隔的。
命令用来执行特定的任务,而参数用来给命令传递额外的信息。
例如,在Cshell中执行"ls -l"命令可以列出当前目录下的文件和文件夹,并显示详细信息。
2. 注释:在Cshell中,使用"#"符号来注释一行代码。
注释通常用来解释脚本的功能或提醒自己后续需要添加的代码。
例如,可以在脚本中添加注释,说明某一行代码的作用。
3. 变量:可以在Cshell中使用变量来存储值和临时数据。
变量名不需要预先声明,直接使用即可。
变量赋值使用"="符号,例如"var=100"。
使用变量时需要使用"$"前缀,例如"echo $var"将会输出"100"。
4. 控制结构:Cshell中提供了多种控制结构,用于根据条件执行不同的代码块。
常见的控制结构包括if语句、for循环和while循环。
if语句用于条件判断,for循环用于重复执行一段代码块,while循环用于在满足条件时执行一段代码块。
5. 输入和输出重定向:Cshell提供了输入和输出重定向的功能,允许用户将命令的输入和输出重定向到文件或其他设备。
输出重定向使用">"符号,例如"ls > output.txt"将目录列表输出到名为output.txt的文件中。
输入重定向使用"<"符号,例如"wc -l < input.txt"将会统计input.txt文件中的行数。
高级Shell脚本编写技巧掌握并发处理和多线程的实现方式高级Shell脚本编写技巧:掌握并发处理和多线程的实现方式Shell脚本是一种基于Unix/Linux操作系统的脚本语言,常被用于自动化任务的编写和系统管理。
在实际应用中,往往需要处理大量的数据或者并行执行多个任务,这时候掌握并发处理和多线程的实现方式就显得尤为重要。
本文将介绍一些高级的Shell脚本编写技巧,帮助读者掌握并发处理和多线程的实现方法。
一、并发处理的基本概念并发处理是指同时执行多个任务,提高系统资源的利用率和任务执行的效率。
在Shell脚本中,可以通过以下两种方式实现并发处理:后台执行和多线程。
1. 后台执行后台执行是指将一个任务放在后台执行而不阻塞当前的Shell进程,让其后台执行。
在Shell脚本中,可以使用&符号将命令放在后台执行。
例如:```shell#!/bin/bash# 脚本名:background_example.shlong_running_task1 &long_running_task3 &waitecho "所有任务执行完毕"```在上述脚本中,long_running_task1、long_running_task2、long_running_task3 表示需要长时间执行的任务。
通过在任务后面添加&符号,将任务放在后台执行。
通过wait命令等待所有任务执行完毕后,输出提示信息。
2. 多线程多线程是指同时执行多个线程,每个线程独立执行一段代码。
在Shell脚本中,可以使用多种方式实现多线程,例如使用子进程、使用内置的工具或者借助第三方工具。
二、后台执行和多线程的实现方式1. 后台执行在Shell脚本中,使用&符号将命令放在后台执行。
后台执行的任务将不会阻塞当前的Shell进程,可以同时执行其他任务。
例如:```shell#!/bin/bash# 脚本名:background_example.shlong_running_task2 &long_running_task3 &waitecho "所有任务执行完毕"```在上述脚本中,long_running_task1、long_running_task2、long_running_task3 表示需要长时间执行的任务。
学会在macOS终端中创建和编辑Shell脚本Shell脚本是一种运行在Unix操作系统上的脚本语言,能够通过一系列命令来实现自动化任务和批量处理。
在macOS操作系统中,终端(Terminal)是使用Shell脚本的主要工具。
学会在macOS终端中创建和编辑Shell脚本对提高工作效率和便捷性非常重要。
本文将介绍如何在macOS终端中创建和编辑Shell脚本的基本步骤和技巧。
一、准备工作在开始创建和编辑Shell脚本之前,首先需要打开终端应用程序。
可以通过在Launchpad中找到终端图标,或者通过Spotlight搜索栏中输入"终端"来打开。
二、创建Shell脚本在终端中创建Shell脚本的方法有多种,可以使用文本编辑器,也可以直接在终端中输入命令。
下面介绍两种常用的方法。
方法一:使用文本编辑器1. 打开终端中的任意文本编辑器,比如可以使用macOS自带的TextEdit应用程序。
2. 在文本编辑器中输入Shell脚本的命令和代码。
3. 保存文件时,确保文件后缀名为.sh,这是Shell脚本的标准后缀名。
比如可以保存为"myscript.sh"。
4. 将保存好的脚本文件移动到一个合适的位置,比如可以创建一个专门存放脚本文件的目录。
方法二:直接在终端中输入命令1. 打开终端应用程序。
2. 在终端中输入以下命令创建一个新的Shell脚本文件:touch myscript.sh这个命令会在当前目录下创建一个名为"myscript.sh"的文件。
3. 使用终端中的任意文本编辑器打开脚本文件,在其中输入Shell 脚本的命令和代码。
4. 保存文件并关闭文本编辑器。
三、编辑Shell脚本创建好Shell脚本文件后,就可以通过编辑器来进一步修改和完善脚本。
终端中常用的文本编辑器有vim、nano和emacs等。
下面以vim 为例介绍Shell脚本的编辑过程。
Linux与Unixshell编程指南(完整⾼清版).pdf找到⼀本很详细的Linux Shell脚本教程,其实⾥⾯不光讲了Shell脚本编程,还介绍了系统的各种命令本书共分五部分,详细介绍了shell编程技巧,各种UNIX命令及语法,还涉及了UNIX下的⽂字处理以及少量的系统管理问题。
本书内容全⾯、⽂字简洁流畅,适合Shell编程⼈员学习、参考。
⽬录译者序前⾔第⼀部分 shell第1章⽂件安全与权限 11.1 ⽂件 11.2 ⽂件类型 21.3 权限 21.4 改变权限位 41.4.1 符号模式 41.4.2 chmod命令举例 51.4.3 绝对模式 51.4.4 chmod命令的其他例⼦ 61.4.5 可以选择使⽤符号模式或绝对模式 71.5 ⽬录 71.6 suid/guid 71.6.1 为什么要使⽤suid/guid 81.6.2 设置suid/guid的例⼦ 81.7 chown和chgrp 91.7.1 chown举例 91.7.2 chgrp举例 91.7.3 找出你所属于的⽤户组 91.7.4 找出其他⽤户所属于的组 101.8 umask 101.8.1 如何计算umask值 101.8.2 常⽤的umask值 111.9 符号链接 121.9.1 使⽤软链接来保存⽂件的多个映像 121.9.2 符号链接举例 121.10 ⼩结 13第2章使⽤find和xargs 142.1 find命令选项 142.1.1 使⽤name选项 152.1.2 使⽤perm选项 162.1.3 忽略某个⽬录 162.1.4 使⽤user和nouser选项 162.1.5 使⽤group和nogroup选项 162.1.6 按照更改时间查找⽂件 172.1.7 查找⽐某个⽂件新或旧的⽂件 172.1.8 使⽤type选项 172.1.9 使⽤size选项 182.1.10 使⽤depth选项 182.1.11 使⽤mount选项 182.1.12 使⽤cpio选项 182.1.13 使⽤exec或ok来执⾏shell命令 192.1.14 find命令的例⼦ 202.2 xargs 202.3 ⼩结 21第3章后台执⾏命令 223.1 cron和crontab 223.1.1 crontab的域 223.1.2 crontab条⽬举例 233.1.3 crontab命令选项 233.1.4 创建⼀个新的crontab⽂件 243.1.5 列出crontab⽂件 243.1.6 编辑crontab⽂件 243.1.7 删除crontab⽂件 253.1.8 恢复丢失的crontab⽂件 253.2 at命令 253.2.2 列出所提交的作业 273.2.3 清除⼀个作业 273.3 &命令 273.3.1 向后台提交命令 283.3.2 ⽤ps命令查看进程 283.3.3 杀死后台进程 283.4 nohup命令 293.4.1 使⽤nohup命令提交作业 293.4.2 ⼀次提交⼏个作业 293.5 ⼩结 30第4章⽂件名置换 314.1 使⽤* 314.2 使⽤? 324.3 使⽤[...]和[!...] 324.4 ⼩结 33第5章 shell输⼊与输出 345.1 echo 345.2 read 355.3 cat 375.4 管道 385.5 tee 395.6 标准输⼊、输出和错误 405.6.1 标准输⼊ 405.6.2 标准输出 405.6.3 标准错误 405.7 ⽂件重定向 405.7.1 重定向标准输出 415.7.2 重定向标准输⼊ 425.7.3 重定向标准错误 425.8 结合使⽤标准输出和标准错误 43 5.9 合并标准输出和标准错误 435.10 exec 445.11 使⽤⽂件描述符 445.12 ⼩结 45第6章命令执⾏顺序 466.1 使⽤&& 466.2 使⽤|| 466.3 ⽤()和{ }将命令结合在⼀起 47 6.4 ⼩结 48第⼆部分⽂本过滤第7章正则表达式介绍 497.1 使⽤句点匹配单字符 507.2 在⾏⾸以^匹配字符串或字符序列 50 7.3 在⾏尾以$匹配字符串或字符 517.4 使⽤*匹配字符串中的单字符或其重复序列 517.5 使⽤\屏蔽⼀个特殊字符的含义 52 7.6 使⽤[]匹配⼀个范围或集合 527.7 使⽤\{\}匹配模式结果出现的次数 53 7.8 ⼩结 55第8章 grep家族 568.1 grep 578.1.1 双引号引⽤ 578.1.2 grep选项 578.1.3 查询多个⽂件 578.1.4 ⾏匹配 578.1.5 ⾏数 588.1.6 显⽰⾮匹配⾏ 588.1.7 精确匹配 588.1.8 ⼤⼩写敏感 588.2 grep和正则表达式 588.2.1 模式范围 598.2.2 不匹配⾏⾸ 598.2.3 设置⼤⼩写 598.2.4 匹配任意字符 598.2.5 ⽇期查询 598.2.6 范围组合 608.2.8 使⽤grep匹配“与”或者“或”模式 61 8.2.9 空⾏ 618.2.10 匹配特殊字符 618.2.11 查询格式化⽂件名 618.2.12 查询IP地址 618.3 类名 628.4 系统grep命令 628.4.1 ⽬录 638.4.2 passwd⽂件 638.4.3 使⽤ps命令 638.4.4 对⼀个字符串使⽤grep 648.5 egrep 648.6 ⼩结 65第9章 AWK介绍 669.1 调⽤awk 669.2 awk脚本 679.2.1 模式和动作 679.2.2 域和记录 679.2.3 awk中正则表达式及其操作 709.2.4 元字符 709.2.5 条件操作符 709.2.6 awk内置变量 739.2.7 NF、NR和FILENAME 749.2.8 awk操作符 759.2.9 内置的字符串函数 789.2.10 字符串屏蔽序列 809.2.11 awk输出函数printf 819.2.12 printf修饰符 819.2.13 awk数组 869.3 ⼩结 88第10章 sed ⽤法介绍 8910.1 sed怎样读取数据 8910.2 调⽤sed 8910.2.1 保存sed输出 9010.2.2 使⽤sed在⽂件中查询⽂本的⽅式 90 10.2.3 基本sed编辑命令 9010.3 sed和正则表达式 9110.4 基本sed编程举例 9110.4.1 使⽤p(rint)显⽰⾏ 9110.4.2 打印范围 9110.4.3 打印模式 9210.4.4 使⽤模式和⾏号进⾏查询 9210.4.5 匹配元字符 9210.4.6 显⽰整个⽂件 9210.4.7 任意字符 9210.4.8 ⾸⾏ 9210.4.9 最后⼀⾏ 9310.4.10 打印⾏号 9310.4.11 附加⽂本 9310.4.12 创建sed脚本⽂件 9410.4.13 插⼊⽂本 9410.4.14 修改⽂本 9510.4.15 删除⽂本 9610.4.16 替换⽂本 9610.5 使⽤替换修改字符串 9710.6 将sed结果写⼊⽂件命令 9710.7 从⽂件中读⽂本 9810.8 匹配后退出 9810.9 显⽰⽂件中的控制字符 9910.10 使⽤系统sed 9910.10.1 处理控制字符 9910.10.2 处理报⽂输出 10110.10.3 去除⾏⾸数字 10110.10.4 附加⽂本 10210.10.5 从shell向sed传值 10210.10.6 从sed输出中设置shell变量 102 10.11 快速⼀⾏命令 102第11章合并与分割 10411.1 sort⽤法 10411.1.1 概述 10411.1.2 sort选项 10411.1.3 保存输出 10511.1.4 sort启动⽅式 10511.1.5 sort对域的参照⽅式 10511.1.6 ⽂件是否已分类 10511.1.7 基本sort 10611.1.8 sort分类求逆 10611.1.9 按指定域分类 10611.1.10 数值域分类 10611.1.11 唯⼀性分类 10711.1.12 使⽤k的其他sort⽅法 10811.1.13 使⽤k做分类键排序 10811.1.14 指定sort序列 10811.1.15 pos⽤法 10811.1.16 使⽤head和tail将输出分类 109 11.1.17 awk使⽤sort输出结果 10911.1.18 将两个分类⽂件合并 11011.2 系统sort 11011.3 uniq⽤法 11111.4 join⽤法 11211.5 cut⽤法 11411.5.1 使⽤域分隔符 11511.5.2 剪切指定域 11511.6 paste⽤法 11611.6.1 指定列 11611.6.2 使⽤不同的域分隔符 11611.6.3 paste命令管道输⼊ 11711.7 split⽤法 11711.8 ⼩结 118第12章 tr⽤法 11912.1 关于tr 11912.1.1 字符范围 11912.1.2 保存输出 12012.1.3 去除重复出现的字符 12012.1.4 删除空⾏ 12012.1.5 ⼤写到⼩写 12112.1.6 ⼩写到⼤写 12112.1.7 删除指定字符 12112.1.8 转换控制字符 12212.1.9 快速转换 12212.1.10 匹配多于⼀个字符 12312.2 ⼩结 123第三部分登录环境第13章登录环境 12513.1 /etc/profile 12513.2 ⽤户的$HOME.profile 12813.3 stty⽤法 12913.4 创建.logout⽂件 13113.5 ⼩结 131第14章环境和shell变量 13214.1 什么是shell变量 13214.2 本地变量 13214.2.1 显⽰变量 13314.2.2 清除变量 13314.2.3 显⽰所有本地shell变量 133 14.2.4 结合变量值 13414.2.5 测试变量是否已经设置 13414.2.6 使⽤变量来保存系统命令参数 135 14.2.7 设置只读变量 13514.3 环境变量 13614.3.1 设置环境变量 13614.3.2 显⽰环境变量 13614.3.3 清除环境变量 13714.3.4 嵌⼊shell变量 13714.3.6 set命令 14014.3.7 将变量导出到⼦进程 140 14.4 位置变量参数 14114.4.1 在脚本中使⽤位置参数 142 14.4.2 向系统命令传递参数 142 14.4.3 特定变量参数 14314.4.4 最后的退出状态 14414.5 ⼩结 145第15章引号 14615.1 引⽤必要性 14615.2 双引号 14615.3 单引号 14715.4 反引号 14715.5 反斜线 14815.6 ⼩结 149第四部分基础shell编程第16章 shell脚本介绍 15116.1 使⽤shell脚本的原因 15116.2 脚本内容 15116.3 运⾏⼀段脚本 15216.4 ⼩结 153第17章条件测试 15417.1 测试⽂件状态 15417.2 测试时使⽤逻辑操作符 155 17.3 字符串测试 15517.4 测试数值 15617.5 expr⽤法 15717.5.1 增量计数 15817.5.2 数值测试 15817.5.3 模式匹配 15817.6 ⼩结 159第18章控制流结构 16018.1 退出状态 16018.2 控制结构 16018.2.1 流控制 16118.2.2 循环 16118.3 if then else语句 16118.3.1 简单的if语句 16218.3.2 变量值测试 16218.3.3 grep输出检查 16318.3.4 ⽤变量测试grep输出 163 18.3.5 ⽂件拷贝输出检查 16418.3.6 当前⽬录测试 16418.3.7 ⽂件权限测试 16518.3.8 测试传递到脚本中的参数 165 18.3.9 决定脚本是否为交互模式 165 18.3.10 简单的if else语句 16618.3.11 变量设置测试 16618.3.12 检测运⾏脚本的⽤户 166 18.3.13 将脚本参数传⼊系统命令 167 18.3.14 null:命令⽤法 16718.3.15 测试⽬录创建结果 16818.3.16 另⼀个拷贝实例 16918.3.17 多个if语句 16918.3.18 测试和设置环境变量 169 18.3.19 检测最后命令状态 17018.3.20 增加和检测整数值 17118.3.21 简单的安全登录脚本 172 18.3.22 elif⽤法 17318.3.23 使⽤elif进⾏多条件检测 173 18.3.24 多⽂件位置检测 17418.4 case语句 17518.4.1 简单的case语句 17518.4.2 对匹配模式使⽤| 17618.4.3 提⽰键⼊y或n 17718.4.4 case与命令参数传递 177 18.4.5 捕获输⼊并执⾏空命令 17818.5 for循环 18018.5.1 简单的for循环 18118.5.2 打印字符串列表 18118.5.3 对for循环使⽤ls命令 18118.5.4 对for循环使⽤参数 18218.5.5 使⽤for循环连接服务器 18318.5.6 使⽤for循环备份⽂件 18318.5.7 多⽂件转换 18318.5.8 多sed删除操作 18418.5.9 循环计数 18418.5.10 for循环和本地⽂档 18418.5.11 for循环嵌⼊ 18518.6 until循环 18618.6.1 简单的until循环 18618.6.2 监视⽂件 18718.6.3 监视磁盘空间 18718.7 while循环 18818.7.1 简单的while循环 18818.7.2 使⽤while循环读键盘输⼊ 188 18.7.3 ⽤while循环从⽂件中读取数据 189 18.7.4 使⽤IFS读⽂件 18918.7.5 带有测试条件的⽂件处理 190 18.7.6 扫描⽂件⾏来进⾏数⽬统计 191 18.7.7 每次读⼀对记录 19318.7.8 忽略#字符 19318.7.9 处理格式化报表 19418.7.10 while循环和⽂件描述符 196 18.8 使⽤break和continue控制循环 197 18.8.1 break 19718.8.2 跳出case语句 19718.8.3 continue 19718.8.4 浏览⽂件⾏ 19818.9 菜单 19918.10 ⼩结 201第19章 shell函数 20219.1 在脚本中定义函数 20319.2 在脚本中使⽤函数 20319.3 向函数传递参数 20319.4 从调⽤函数中返回 20319.5 函数返回值测试 20419.6 在shell中使⽤函数 20419.7 创建函数⽂件 20419.8 定位⽂件 20519.9 检查载⼊函数 20519.10 执⾏shell函数 20519.10.1 删除shell函数 20619.10.2 编辑shell函数 20619.10.3 函数举例 20719.10.4 将函数集中在⼀起 21919.11 函数调⽤ 21919.11.1 在脚本中调⽤函数 21919.11.2 从函数⽂件中调⽤函数 220 19.12 定位⽂件不只⽤于函数 22219.13 ⼩结 223第20章向脚本传递参数 22420.1 shift命令 22520.1.1 shift命令简单⽤法 22520.1.2 命令⾏输⼊的最后⼀个参数 225 20.1.3 使⽤shift处理⽂件转换 22620.2 getopts 22920.2.1 getopts脚本实例 22920.2.2 getopts使⽤⽅式 23120.2.3 使⽤getopts指定变量取值 231 20.2.4 访问取值⽅式 23220.2.5 使⽤getopts处理⽂件转换 233 20.3 ⼩结 235第21章创建屏幕输出 23621.1.1 字符串输出 23621.1.2 数字输出 23721.1.3 布尔输出 23721.2 tput⽤法 23721.2.1 设置tput命令 23721.2.2 使⽤布尔输出 23721.2.3 在脚本中使⽤tput 23721.2.4 产⽣转义序列 23821.2.5 光标位置 23921.2.6 在屏幕中⼼位置显⽰⽂本 240 21.2.7 查找终端属性 24021.2.8 在脚本中使⽤功能键 24121.2.9 使⽤颜⾊ 24221.2.10 产⽣颜⾊ 24321.2.11 创建精致菜单 24621.3 ⼩结 251第22章创建屏幕输⼊ 25222.1 增加记录 25222.2 删除记录 26222.3 修改记录 26622.4 查看记录 27022.5 ⼩结 273第23章调试脚本 27423.1 ⼀般错误 27423.1.1 循环错误 27423.1.2 典型的漏写引号 27423.1.3 测试错误 27423.1.4 字符⼤⼩写 27523.1.5 for循环 27523.1.6 echo 27523.2 set命令 27523.3 ⼩结 276第24章 shell嵌⼊命令 27724.1 shell嵌⼊命令完整列表 277 24.1.1 pwd 27724.1.2 set 27824.1.3 times 27824.1.4 type 27824.1.5 ulimit 27924.1.6 wait 27924.2 ⼩结 279第五部分⾼级shell编程技巧第25章深⼊讨论<< 28125.1 快速创建⼀个⽂件 28125.2 快速创建打印⽂档 28125.3 ⾃动选择菜单 28225.4 ⾃动ftp传输 28325.5 访问数据库 28625.6 ⼩结 288第26章 shell ⼯具 28926.1 创建保存信息的⽂件 28926.1.1 使⽤date命令创建⽇志⽂件 289 26.1.2 创建唯⼀的临时⽂件 29026.2 信号 29126.2.1 杀死⼀个进程 29226.2.2 检测信号 29326.3 trap 29426.3.1 捕获信号并采取相应的⾏动 294 26.3.2 捕获信号并采取⾏动的另⼀个例⼦ 29526.3.3 锁住终端 29726.3.4 忽略信号 29826.4 eval 30026.4.1 执⾏含有字符串的命令 300 26.4.2 给每个值⼀个变量名 30126.5 logger命令 30226.5.1 使⽤logger命令 30326.6 ⼩结 305第27章⼏个脚本例⼦ 30627.1 pingall 30627.2 backup_gen 30627.3 del.lines 31227.4 access.deny 31327.5 logroll 31627.6 nfsdown 31727.7 ⼩结 317第28章运⾏级别脚本 31828.1 怎么知道系统中是否含有运⾏级别⽬录 31828.2 确定当前的运⾏级别 31928.3 快速熟悉inittab 31928.4 运⾏级别 32028.4.1 各种运⾏级别 32128.4.2 运⾏级别脚本的格式 321 28.4.3 安装运⾏级别脚本 32228.5 使⽤inittab来启动应⽤程序 323 28.6 启动和停⽌服务的其他⽅法 324 28.7 ⼩结 324第29章 cgi脚本 32529.1 什么是Web页⾯? 32529.2 cgi 32529.3 连接Web服务器 32629.4 cgi和HTM脚本 32629.4.1 基本cgi脚本 32629.4.2 显⽰shell命令输出 32829.4.3 使⽤SSI 33029.4.4 访问计数器 33029.4.5 使⽤⼀个链接来显⽰当前Web 环境变量 33229.4.6 其他常⽤的环境变量 334 29.5 get和post⽅法简介 33529.5.1 get⽅法 33529.5.2 post⽅法 34029.5.3 填充列表项 34729.5.4 ⾃动刷新页⾯ 34829.6 ⼩结 349附录常⽤shell命令 350。
UNIX shell范例精解1.1 UNIX与Linux及其历史在学习shell时,我们发现shell通常与UNIX/Linux操作系统的不同版本相关联。
例如,Bourne和Korn shell经常与AT&T UNIX关联,C shell与Berk eley UNIX关联,而Bash shell与Linux关联。
在详细讨论shell之前,我们首先简单概述shell所驻留的操作系统的背景知识。
1.1.1 UNIX简介UNIX是一个多用户、多任务的操作系统。
最初由AT&T贝尔实验室的Ken Th ompson于1969年开发成功。
UNIX当初设计的目标是允许大量程序员同时访问计算机,共享它的资源。
它非常简单但是功能强大、通用并且可移植。
可以运行在从微机到超级小型计算机以及大型机上。
UNIX系统的心脏是内核:一个系统引导时加载的程序。
内核用于与硬件设备打交道,调度任务,管理内存和辅存。
正是由于UNIX系统这种精炼特性,众多小而简单的工具和实用程序被开发出来。
因为这些工具(命令)能够很容易地组合起来执行多种大型的任务,所以UNIX迅速流行起来。
其中最重要的工具之一就是shell,一个让用户能够与操作系统沟通的程序。
本书将剖析当今最主流she ll的特性。
最初UNIX被科学研究机构和大学采用,其费用微不足道。
后来慢慢扩展到计算机公司、政府机构和制造业领域。
1973年,美国国防部高级研究计划署(De fense Advanced Research Projects Agency,DARPA)启动一项计划,研究使用UNIX将跨越多个网络的计算机透明地连接在一起的方式。
这个计划和从该研究中形成的网络系统,导致了Internet的诞生!在20世纪70年代后期,许多在大学期间接触并体验过UNIX的学生投身工业界并要求工业界向UNIX转换,声称它是最适合复杂编程环境的操作系统。
很快大量或大或小的厂家,开始开发他们自己的UNIX版本,在自己的计算机体系结构上对它进行优化,以期占领市场。
Shell脚本编写的秘诀如何处理用户输入Shell脚本是一种运行在Unix或者Linux环境下的脚本语言,常用于自动化操作和批处理任务。
在编写Shell脚本的过程中,经常需要与用户进行交互,接受用户的输入并根据输入进行相应的处理。
本文将介绍Shell脚本编写时处理用户输入的一些秘诀。
1. 使用read命令接收用户输入在Shell脚本中,可以使用read命令来接收用户的输入。
read命令将用户的输入保存到一个变量中,以供后续使用。
下面是一个示例:```shell#!/bin/bashecho "请输入您的姓名:"read nameecho "您好,$name"```上述示例中,程序首先输出提示信息"请输入您的姓名:",然后使用read命令接收用户输入的姓名,并将其保存到名为`name`的变量中,最后输出"您好,$name"来向用户打招呼。
2. 处理用户输入的多个值有时候,我们需要接收用户输入的多个值,比如接收多个参数或者选项。
Shell脚本可以使用数组来处理这种情况。
下面是一个示例:```shell#!/bin/bashecho "请输入三个数字,以空格分隔:"read -a numbersecho "您输入的数字分别为:${numbers[0]}、${numbers[1]}、${numbers[2]}"```上述示例中,程序首先输出提示信息"请输入三个数字,以空格分隔:",然后使用read命令的`-a`选项接收用户输入的数字,并将其保存到名为`numbers`的数组中,最后输出用户输入的每个数字。
3. 处理用户输入时的错误和异常在接收用户输入时,可能会遇到一些错误和异常情况。
为了保证脚本的健壮性,我们需要对这些错误和异常进行处理。
可以使用条件判断语句和循环结构来实现对用户输入的错误处理。
Unix系列shell程序编写*Shell是什么?任何发明都具有供用户使用的界面。
UNIX供用户使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要强大的多)。
Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。
为了不同的需要,UNIX提供了不同的Shell。
现在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)为例,一步步的领略UNIX Shell的强大功能,占先其强大魅力,达到更方便灵活的管理、应用UNIX的目的。
1.UNIX内核和Shell的交互方法启动UNIX时,程序UNIX(内核)将被调入计算机内存,并一直保留在内存中直到机器关闭。
在引导过程中,程序init将进入后台运行一直到机器关闭。
该程序查询文件/etc/inittab,该文件列出了连接终端的各个端口及其特征。
当发现一个活动的终端时,init程序调用getty程序在终端上显示login等登陆信息。
(username和passwd),在输入密码后,getty调用login进程,该进程根据文件/etc/passwd的内容来验证用户的身份。
若用户通过身份验证,login进程把用户的home目录设置成当前目录并把控制交给一系列setup程序。
setup程序可以是指定的应用程序,通常setup程序为一个Shell程序,如:/bin/sh 即Bourne Shell(command出来了,呵呵)。
得到控制后,Shell程序读取并执行文件/etc/.profile以及.profile。
这两个文件分别建立了系统范围内的和该用户自己的工作环境。
最后Shell显示命令提示符,如$。
(这是以bsh为例,若是csh,为.cshrc,ksh 为.kshrc,bash为.bashrc等等)注:(不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或config.sys文件)当shell退出时,内核把控制交给init程序,该程序重新启动自动登陆过程。
有两种方法使shell退出,一是用户执行exit命令,二是内核(例如root用kill命令)发出一个kill命令结束shell进程。
shell退出后,内核回收用户及程序使用的资源。
用户登陆后,用户命令同计算机交互的关系为:命令进程--->Shell程序--->UNIX内核--->计算机硬件。
当用户输入一个命令,如$ls, Shell将定位其可执行文件/bin/ls并把其传递给内核执行。
内核产生一个新的子进程调用并执行/bin/ls。
当程序执行完毕后,内核取消该子进程并把控制交给其父进程,即Shell程序。
例如执行:$ps该命令将会列出用户正在执行的进程,即Shell程序(下来详细说说,别急现在)和ps程序。
若执行:$sleep 10 &$ps其中第一条命令将产生一个在后台执行的sleep子进程。
ps命令执行时会显示出该子进程。
每当用户执行一条命令时,就会产生一个子进程。
该子进程的执行与其父进程或Shell完全无关,这样可以使Shell去做其他工作。
(Shell只是把用户的意图告诉内核,然后该干嘛干嘛:)) 现在windows有个计划任务(在固定的时间,日期自动执行某任务),其实UNIX很早就有这个功能了,也就是所谓的Shell的自动执行。
一些UNIX 资源,如cron可以自动执行Shell程序而无需用户的参与,(这个功能好象在/var/spool/crotab目录里)。
Crontab 程序对于系统管理员来说是非常有用的。
Cron 服务用于计划程序在特定时间(月、日、周、时、分)运行。
我们以root的crontab 为例。
根用户的crontab 文件放在/var/spool/crontab/root 中,其格式如下:(1) (2) (3) (4) (5)(6)00 ** 3/usr/bin/updatedb1. 分钟(0-60)2. 小时(0-23)3. 日(1-31)4. 月(1-12)5. 星期(1-7)6. 所要运行的程序2.Shell的功能和特点1>命令行解释2>使用保留字3>使用Shell元字符(通配符)4>可处理程序命令5>使用输入输出重定向和管道6>维护一些变量7>运行环境控制8>支持Shell编程对于"命令行解释"就不多说了,就是在shell提示符(例如:"$","%","#"等)后输入一行unix命令,Shell 将接收用户的输入。
"使用保留字":Shell有一些具有特殊意义的字,例如在Shell脚本中,do,done,for等字用来控制循环操作,if,then等控制条件操作。
保留字随Shell环境的不同而不同。
"通配符":* 匹配任何位置? 匹配单个字符[] 匹配的字符范围或列表例如:$ls [a-c]*将列出以a-c范围内字符开头的所有文件$ls [a,m,t]*将列出以e,m或t开头的所有文件"程序命令" :当用户输入命令后,Shell读取环境变量$path(一般在用户自己的.profile中设置),该变量包含了命令可执行文件可能存在的目录列表。
shell从这些目录中寻找命令所对应的可执行文件,然后将该文件送给内核执行。
"输入输出重定向及管道" :重定向的功能同DOS的重定向功能:">" 重定向输出"<" 重定向输入而管道符号,是unix功能强大的一个地方,符号是一条竖线:"|",用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为command 2的输入传给command 2,例如:$ls -s|sort -nr|pg该命令列出当前目录中的所有文件,并把输出送给sort命令作为输入,sort命令按数字递减的顺序把ls的输出排序。
然后把排序后的内容传送给pg命令,pg命令在显示器上显示sort命令排序后的内容。
"维护变量" :Shell可以维护一些变量。
变量中存放一些数据供以后使用。
用户可以用"="给变量赋值,如:$lookup=/usr/mydir该命令建立一个名为lookup的变量并给其赋值/usr/mydir,以后用户可以在命令行中使用lookup来代替/usr/mydir,例如:$echo $lookup结果显示:/usr/mydir为了使变量能被子进程使用,可用exprot命令,例如:$lookup=/usr/mydir$export lookup"运行环境控制" :当用户登陆启动shell后,shell要为用户创建一个工作的环境,如下:1>当login程序激活用户shell后,将为用户建立环境变量。
从/etc/profile和.profile文件中读出,在这些文件中一般都用$TERM 变量设置终端类型,用$PATH变量设置Shell寻找可执行文件的路径。
2>从/etc/passwd文件或命令行启动shell时,用户可以给shell程序指定一些参数,例如"-x",可以在命令执行前显示该命令及其参数。
后面详细介绍这些参数。
"shell编程" :本文主要介绍的内容。
shell本身也是一种语言(*可以先理解为unix命令的组合,加上类C的条件,循环等程序控制语句,类似dos批处理,但要强大的多),用户可以通过shell编程(脚本,文本文件),完成特定的工作。
SHELL变量下面我们详细的介绍Bourne Shell的编程:自从贝尔实验室设计了Bourne Shell。
从那时起许多厂商根据不同的硬件平台设计了许多版本得unix。
但在众多版本的unix中,Bourne Shell 一直保持一致。
1>Bsh的启动:用户在登陆后,系统根据文件/etc/passwd中有关该用户的信息项启动Shell。
例如某用户在passwd中的信息项为:ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh则表明,用户名是ice_walk等信息,在最后一项"/bin/bsh"表明用户的sh环境类型是bsh,于是系统启动之。
在启动或执行(包括下面我们要讲的shell程序--脚本)过程中可以使用以下一些参数,我们一一说明:-a 将所有变量输出-c "string"从string中读取命令-e 使用非交互式模式-f 禁止shell文件名产生-h 定义-i 交互式模式-k 为命令的执行设置选项-n 读取命令但不执行-r 受限模式-s 命令从标准输入读取-t 执行一命令,然后退出shell-u 在替换时,使用未设置的变量将会出错-v 显示shell的输入行-x 跟踪模式,显示执行的命令许多模式可以组合起来用,您可以试试了,但-ei好象不行,你说why呢?使用set可以设置或取消shell的选项来改变shell环境。
打开选项用"-",关闭选项用"+",多数unix允许打开或关闭a、f、e、h、k、n、u、v和x选项。
若显示Shell中已经设置的选项,执行:$echo $-Bsh中每个用户的home目录下都有一个.profile文件,可以修改该文件来修改shell环境。
为了增加一个可执行文件的路径(例如/ice_walk/bin),可以把下面代码加入.profile中PATH=$PATH:/ice_walk/bin;exprot PATH.profile中shell的环境变量意思如下:CDPATH 执行cd命令时使用的搜索路径HOME 用户的home目录IFS 内部的域分割符,一般为空格符、制表符、或换行符MAIL 指定特定文件(信箱)的路径,有UNIX邮件系统使用PATH 寻找命令的搜索路径(同dos的config.sys的path)PS1 主命令提示符,默认是"$"PS2 从命令提示符,默认是">"TERM 使用终端类型2>Bsh里特殊字符及其含义在Bsh中有一组非字母字符。
这些字符的用途分为四类:作为特殊变量名、产生文件名、数据或程序控制以及引用和逃逸字符控制。
他们可以让用户在Shell中使用最少的代码完成复杂的任务。