自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 shell脚本控制——使用新的shell启动脚本

每次启动新的shell,bash shell都会运行.bashrc文件(一般而言,用户登录时会运行从$HOME/.bash_profile、$HOME/.bash_login或$HOME/.profile中找到第一个文件,而$HOME/.bashrc则是由非登录shell运行的文件)。如果每次用户启动新的bash shell时都能运行相关的脚本(哪怕是特定用户启动的bash shell),那将会非常方便,因为有时候你希望为shell会话设置某些shell特性,或者希望已经设置了某个文件。

2025-02-10 23:10:26 199

原创 shell脚本控制——定时运行作业

在使用脚本时,你也许希望脚本能在以后某个你无法亲临现场的时候运行。Linux系统提供了多个在预选时间运行脚本的方法:at命令、cron表以及anacron。每种方法都使用不同的技术来安排脚本的运行时间和频率。接下来将依次介绍这些方法。

2025-02-10 23:05:40 906

原创 shell脚本控制——调整谦让度

在多任务操作系统(比如Linux)中,内核负责为每个运行的进程分配CPU时间。调度优先级【也称为谦让度(nice value)】是指内核为进程分配的CPU时间(相对于其他进程)。在Linux系统中,由shell启动的所有进程的调度优先级默认都是相同的。调度优先级是一个整数值,取值范围从-20(最高优先级)到+19(最低优先级)。在默认情况下,bash shell以优先级0来启动所有进程。提示 -20(最低值)代表最高优先级,+19(最高值)代表最低优先级,这很容易记混。

2025-02-09 11:54:52 236

原创 shell脚本控制——作业控制

在前面的文章中,你看到了如何使用组合键来停止shell中正在运行的作业。在作业停止后,Linux系统会让你选择是“杀死”该作业还是重启该作业。用kill命令可以“杀死”该作业。要重启停止的进程,则需要向其发送SIGCONT信号。作业控制包括启动、停止、“杀死”以及恢复作业。通过作业控制,你能完全控制shell环境中所有进程的运行方式。本文章介绍的命令可用于查看和控制在shell中运行的作业。

2025-02-09 11:33:22 230

原创 shell脚本控制——在非控制台下运行脚本

注意 如果使用nohup运行了另一个命令,那么该命令的输出会被追加到已有的nohup.out文件中。当运行位于同一目录中的多个命令时,一定要当心,因为所有的命令输出都会发送到同一个nohup.out文件中,结果会让人摸不着头脑。为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR产生的消息重定向到一个名为nohup.out的文件中。区别在于,当使用nohup命令时,如果关闭终端会话,则脚本会忽略其发送的SIGHUP信号。当退出终端会话时,这可以避免进程退出。

2025-02-08 11:56:38 161

原创 shell脚本控制——以后台模式运行脚本

直接在命令行界面运行shell脚本有时不怎么方便。有些脚本可能要执行很长一段时间,而你不想在命令行界面一直干等。但脚本运行不完,就不能在终端会话中执行任何其他操作。幸好有一种简单的方法可以解决这个问题。显然,以上所有进程都未在你的终端上运行。实际上,其中有很多没有运行在任何终端——它们是在后台运行的。在后台模式中,进程运行时不和终端会话的STDIN、STDOUT以及STDERR关联。也可以用shell脚本试试这个特性,允许脚本在后台运行,不占用终端会话。

2025-02-08 10:00:00 909

原创 shell脚本控制——处理信号

Linux利用信号与系统中的进程进行通信。你可以通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。

2025-02-07 16:37:40 1451

原创 shell呈现数据——记录消息

tee命令就像是连接管道的T型接头,它能将来自STDIN的数据同时送往两处。输出出现在了STDOUT中,同时写入了指定文件。有时候,也确实需要将输出同时送往显示器和文件。与其对输出进行两次重定向,不如改用特殊的tee命令。现在,你可以在为用户显示输出的同时再永久保存一份输出内容了。

2025-02-07 10:30:00 197

原创 shell呈现数据——使用临时文件

Linux系统有一个专供临时文件使用的特殊目录/tmp,其中存放那些不需要永久保留的文件。大多数Linux发行版配置系统在启动时会自动删除/tmp目录的所有文件。系统中的任何用户都有权限读写/tmp目录中的文件。这个特性提供了一种创建临时文件的简单方法,而且还无须担心清理工作。甚至还有一个专门用于创建临时文件的命令mktemp,该命令可以直接在/tmp目录中创建唯一的临时文件。所创建的临时文件不使用默认的umask值。

2025-02-06 13:41:47 357

原创 shell呈现数据——列出打开的文件描述符

能用的文件描述符只有9个,你可能会觉得这没什么复杂的。但有时要记住哪个文件描述符被重定向到了哪里就没那么容易了。为了帮助你厘清条理,bash shell提供了lsof命令。lsof命令会列出整个Linux系统打开的所有文件描述符,这包括所有后台进程以及登录用户打开的文件。有大量的命令行选项和参数可用于过滤lsof的输出。最常见的选项包括-p和-d,前者允许指定进程ID(PID),后者允许指定要显示的文件描述符编号(多个编号之间以逗号分隔)。要想知道进程的当前PID,可以使用特殊环境变量$$(shell会将其

2025-02-05 11:00:00 277

原创 shell呈现数据——抑制命令输出

如果在后台运行的脚本出现错误消息,那么shell就会将其通过邮件发送给进程属主。这会很麻烦,尤其是当运行的脚本生成很多琐碎的小错误时。要解决这个问题,可以将STDERR重定向到一个名为null文件的特殊文件。跟它的名字很像,null文件里什么都没有。shell输出到null文件的任何数据都不会被 保存,全部会被丢弃。文件testfile仍然还在,但现在是一个空文件。这是清除日志文件的常用方法,因为日志文件必须时刻等待应用程序操作。在Linux系统中,null文件的标准位置是/dev/null。

2025-02-05 01:09:53 391

原创 shell呈现数据——创建自己的重定向

在脚本中重定向输入和输出时,并不局限于这3个默认的文件描述符。前文提到过,在shell中最多可以打开9个文件描述符。替代性文件描述符从3到8共6个,均可用作输入或输出重定向(在重定向时,如果使用大于9的文件描述符,那么一定要小心,因为有可能会与shell内部使用的文件描述符发生冲突)。这些文件描述符中的任意一个都可以分配给文件并用在脚本中。本文将介绍如何在脚本中使用替代性文件描述符。

2025-02-04 09:00:00 1038

原创 shell呈现数据——在脚本中重定向

只需简单地重定向相应的文件描述符,就可以在脚本中用文件描述符STDOUT和STDERR在多个位置生成输出。在脚本中重定向输出的方法有两种。下面将具体展示这两种方法的工作原理。

2025-02-03 16:40:56 597

原创 shell呈现数据——理解输入和输出

到目前为止,你已经知道了两种显示脚本输出的方法。这两种方法要么将数据输出全部显示出来,要么什么都不显示。但有时将一部分数据显示在屏幕上,另一部分数据保存到文件中更合适。对此,了解Linux如何处理输入和输出有助于将脚本输出送往所需的位置。下面将介绍如何用标准的Linux输入和输出系统将脚本输出送往特定位置。

2025-01-27 10:04:55 713

原创 shell处理用户输入——获取用户输入

尽管命令行选项和参数是从脚本用户处获取输入的一种重要方式,但有时候脚本还需要更多的交互性。你可能想要在脚本运行时询问用户并等待用户回答。为此,bashshell提供了read命令。

2025-01-20 13:59:55 954

原创 shell处理用户输入——选项标准化

但在Linux中,有些选项字母在某种程度上已经有了标准含义。如果能在shell脚本中支持这些选项,则你的脚本会对用户更友好。在编写shell脚本时,一切尽在你的控制中。选用哪些选项字母以及选项的具体用法,完全由你掌握。表显示了Linux中用到的一些命令行选项的常用含义。对所有问题回答yes。

2025-01-20 13:11:49 162

原创 shell处理用户输入——处理选项

选项是在连字符之后出现的单个字母,能够改变命令的行为。

2024-12-31 13:47:59 710

原创 shell处理用户输入——移动参数

在使用shift命令时,默认情况下会将每个位置的变量值都向左移动一个位置。因此,变量$3的值会移入$2,变量$2的值会移入$1,而变量$1的值则会被删除(注意,变量$0的值,也就是脚本名,不会改变)。跟字面上的意思一样,shift命令会根据命令行参数的相对位置进行移动。测试完第一个参数后,shift命令会将所有参数移动一个位置。这是遍历命令行参数的另一种好方法,尤其是在不知道到底有多少参数的时候。你可以只操作第一个位置变量,移动参数,然后继续处理该变量。使用shift命令的值可以轻松地跳过不需要的参数。

2024-07-19 08:30:00 198

原创 shell处理用户输入——特殊参数变量

在bash shell中有一些跟踪命令行参数的特殊变量。

2024-07-18 15:53:24 469

原创 shell处理用户输入——传递参数

向shell脚本传递数据的最基本方法是使用命令行参数。命令行参数允许运行脚本时在命令行中添加数据:本例向脚本addem传递了两个命令行参数(10和30)。脚本会通过特殊的变量来处理命令行参数。接下来将介绍如何在bash shell脚本中使用命令行参数。

2024-07-17 19:38:37 703

原创 shell结构化命令——处理循环的输出

shell创建了文件test23.txt并将for命令的输出重定向至该文件。for命令结束之后,shell一如往常地显示了echo语句。for命令的输出通过管道传给了sort命令,由后者对输出结果进行排序。运行该脚本,可以看出结果已经按state的值排好序了。在shell脚本中,可以对循环的输出使用管道或进行重定向。shell会将for命令的结果重定向至文件output.txt,而不再显示在屏幕上。

2024-07-17 18:47:41 293

原创 shell结构化命令——循环控制

你可能认为循环一旦启动,在结束之前就哪都去不了了。事实并非如此。有两个命令可以控制循环的结束时机。这两个命令的用法各不相同。下面将介绍如何使用两者控制循环操作。

2024-04-14 17:37:02 916 1

原创 shell结构化命令——循环处理文件数据

第一个IFS值解析出/etc/passwd文件中的各行。内层for循环接着将IFS的值修改为冒号,以便解析出/etc/passwd文件各行中的字段。通过修改IFS环境变量,能强制for命令将文件中的每一行都作为单独的条目来处理,即便数据中有空格也是如此。从文件中提取出单独的行后,可能还得使用循环来提取行中的数据。典型的例子是处理/etc/passwd文件。这要求你逐行遍历该文件,将IFS变量的值改成冒号,以便分隔开每行中的各个字段。内层循环会解析出/etc/passwd文件各行中的字段。

2024-02-17 16:29:42 513 1

原创 shell结构化命令——嵌套循环

这个被嵌套的循环(也称为内层循环)会在外部循环的每次迭代中遍历一遍它所有的值。注意,两个循环的do命令和done命令没有任何差别。bash shell知道执行第一个done命令时,指的是内层循环而非外层循环。每个循环都必须修改在测试条件中用到的值,否则循环就会无止境进行下去。循环语句可以在循环内使用任意类型的命令,包括其他循环命令,这称为嵌套循环。注意,在使用嵌套循环时是在迭代中再进行迭代,命令运行的次数是乘积关系。同样,shell能够区分开内层for循环和外层while循环各自的do命令和done命令。

2024-02-15 19:00:27 813 1

原创 shell结构化命令——until命令

与while命令工作的方式完全相反,until命令要求指定一个返回非0退出状态码的测试命令。只要测试命令的退出状态码不为0,bash shell就会执行循环中列出的命令。与while命令类似,你可以在until命令语句中放入多个test command。最后一个命令的退出状态码决定了bash shell是否执行已定义的other commands。只要该变量的值等于0,until命令就会停止循环。shell会执行指定的多个测试命令,仅当最后一个命令成立时才停止。

2024-01-21 20:24:39 509

原创 shell结构化命令——while命令

while命令在某种程度上糅合了if-then语句和for循环。while命令允许定义一个要测试的命令,只要该命令返回的退出状态码为0,就循环执行一组命令。它会在每次迭代开始时测试test命令,如果test命令返回非0退出状态码,while命令就会停止执行循环。

2024-01-21 20:24:17 868

原创 shell结构化命令——C语言风格的for命令

如果你从事过C语言编程,那么可能会惊讶于bash shell中for命令的工作方式。在C语言中,for循环通常会定义一个变量,然后在每次迭代时更改。程序员通常会将这个变量用作计数器,每次迭代时让计数器增1或减1。bash的for命令也提供了这个功能。本次将展示如何在bash shell脚本中使用仿C语言的for命令。

2024-01-21 19:24:40 417

原创 shell结构化命令——for命令

重复执行一系列命令在编程中很常见。你经常需要重复多个命令直至达到某个特定条件,比如处理目录下的所有文件、系统中的所有用户或是文本文件中的所有行。bash shell提供了for命令,以允许创建遍历一系列值的循环。每次迭代都使用其中一个值来执行已定义好的一组命令。for命令的基本格式如下:docommandsdone你需要提供用于迭代的一系列值作为list参数。指定这些值的方法不止一种。在每次迭代中,变量var会包含列表中的当前值。

2024-01-20 23:48:00 2392

原创 shell结构化命令——case命令

case命令会将指定变量与不同模式进行比较。如果变量与模式匹配,那么shell就会执行为该模式指定的命令。你可以通过竖线运算符在一行中分隔出多个模式。星号会捕获所有与已知模式不匹配的值。你经常会发现自己在尝试计算一个变量的值,在一组可能得值中寻找特定值。有了case命令,就无须再写大量的elif语句来检查同一个变量的值了。case命令提供了一种更清晰的方法来为变量每个可能的值指定不同的处理选择。elif语句会不断检查if-then,为比较变量寻找特定的值。

2024-01-19 22:26:40 598 1

原创 shell结构化命令——if-then的高级特性

bash shell还提供了3个可在if-then语句中使用的高级特性。接下来将详细描述各个特性。

2024-01-18 07:45:00 653 1

原创 shell结构化命令——复合条件测试

使用AND布尔运算符时,两个测试条件都必须满足。第二个测试会检查在用户的$HOME目录中是否有名为newfile的文件,以及用户是否有该文件的写权限。如果两个测试条件有任意一个未通过,那么if语句就会失败,shell则执行else部分的命令。如果两个测试条件都通过了,那么if语句就会成功,shell就会执行then部分的命令。如果任意条件为真,那么then部分的命令就会执行。第一种布尔运算使用布尔运算符AND来组合两个条件。要执行then部分的命令,两个条件都必须满足。可以使用以下两种布尔运算符。

2024-01-17 08:15:00 474

原创 shell结构化命令——test命令

到目前为止,我们在if语句行中看到的都是普通的shell命令。你可能想知道if-then语句能否测试命令退出状态码之外的条件。答案是不能。但是,在bash shell中有个好用的工具可以帮你使用if-then语句测试其他条件。test命令可以在if-then语句中测试不同的条件。如果test命令中列出的条件成立,那么test命令就会退出并返回退出状态码0。这样if-then语句的工作方式就和其他编程语言中的if-then语句差不多了。

2024-01-16 16:16:51 1923 1

原创 shell结构化命令——嵌套if语句

在/home/NoSuchUser目录被删除之前,这个测试脚本执行的是elif语句,返回0值的退出状态。因此,elif的then代码块中的语句得以执行。如果elif之后的命令的退出状态码是0,则bash会执行第二个then语句部分的命令。要检查/etc/passwd文件中是否存在某个用户名以及该用户的主目录是否尚在,可以使用嵌套的if-then语句。注意 记住,在elif语句中,紧跟其后的else语句属于elif代码块,不属于之前的if-then语句的代码块。有时需要再脚本中检查多种条件。

2024-01-15 16:52:48 2176 1

原创 shell结构化命令——if-then-else语句

在if-then语句中,不管命令是否成功执行,你都只有一种选择。如果命令返回一个非0退出状态码,则bash shell会继续执行脚本中的下一条命令。在这种情况下,如果能够执行另一组命令就好了。这正是if-then-else语句的作用。当if语句中的命令返回退出状态码0时,then部分中的命令会被执行,这跟普通的if-then语句一样。当if语句中的命令返回非0退出状态码时,bash shell会执行else部分中的命令。跟then部分一样,else部分可以包含多条命令。fi语句说明else部分结束。

2024-01-14 23:03:33 418 1

原创 shell结构化命令——使用if-then语句

由于这是个错误的命令,因此会产生一个非0的退出状态码,bash shell因此跳过了then部分的echo命令。bash shell的if语句会执行if之后的命令。如果该命令的退出状态码是其他值,则then部分的命令不会被执行,bash shell会接着处理脚本中的下一条命令。bash shell 会将这些命令视为一个代码块,如果if语句行命令的退出状态值为0就,那么代码块中所有的命令都会被执行;)放在待求值的命令尾部,可以将then语句写在同一行,这样看起来更像其他编程语言中的if-then语句。

2024-01-14 19:54:11 796 1

原创 构建shell基础脚本——退出脚本

shell中运行的每个命令都使用退出状态码来告诉shell自己已经运行完毕。退出状态码是一个0~255的整数值,在命令结束运行时由其传给shell。你可以获取这个值并在脚本中使用。

2024-01-13 08:00:00 994 1

原创 构建shell基础脚本——执行数学运算

编程语言的一项至关重要的特性是数学运算能力。在shell脚本中,执行数学运算有两种方式。

2024-01-12 11:03:05 1283 5

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除