![](https://img-blog.csdnimg.cn/20210423115316241.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Shell
文章平均质量分 80
Shell 脚本专栏
panbuhei
我是一个粉刷匠
展开
-
高级shell扩展---sort命令
sortsort可针对文本文件的内容,以行为单位来排序。语法sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]参数-b 忽略每行前面开始出的空格字符。-c 检查文件是否已经按照顺序排序。-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。-f 排序时,将小写字母视为大写字母。-i 排序时,除了040至176之间的ASCII字符外,原创 2020-11-06 14:48:08 · 235 阅读 · 0 评论 -
高级shell扩展---uniq命令
uniquniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。语法uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]参数:-c或--count 在每列旁边显示该行重复出现的次数。-d或--repeated 仅显示重复出现的行列。-f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。-s<原创 2020-11-06 14:46:19 · 317 阅读 · 0 评论 -
高级shell扩展---stty命令
stty修改终端命令行的相关设置选项-a:以容易阅读的方式打印当前的所有配置[root@localhost ~]# sttyspeed 38400 baud; line = 0;-brkint -imaxbel[root@localhost ~]# stty -aspeed 38400 baud; rows 25; columns 134; line = 0;intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <u原创 2020-11-06 14:44:12 · 557 阅读 · 0 评论 -
高级shell扩展---cut命令
cutcut命令用于显示每行从开头算起 num1 到 num2 的文字。参数:-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。-c :以字符为单位进行分割。-d :自定义分隔符,默认为制表符。-f :与-d一起使用,指定显示哪个区域。-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除常用的就是 -d -f实例[root@localh原创 2020-09-15 11:00:08 · 178 阅读 · 0 评论 -
高级shell扩展---updatedb和locate命令
updatedbupdatedb 命令用来创建或更新 slocate/locate 命令所必需的数据库文件。updatedb 命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文件信息写入 slocate/locate 数据库文件中。注意:slocate 本身具有一个数据库,里面存放了系统中文件与目录的相关信息。语法updatedb(选项)参数-o<文件>:忽略默认的数据库文件,使用指定的slocate数据库文件;-U<目录>:更新指定目录的slo原创 2020-07-13 14:52:01 · 301 阅读 · 0 评论 -
高级shell扩展---getopts命令
getoptsgetopts是linux系统中的一个内置变量,一般用在循环中。每当执行循环时,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,并将这些合法选项保存在VARIABLE这个变量中,否则不是合法选项。语法格式:getopts [option[:]] [DESCPRITION] VARIABLE option:表示为某个脚本可以使用的选项 ":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数原创 2020-07-10 16:54:34 · 256 阅读 · 0 评论 -
高级shell扩展---tr命令
trtr 命令用于转换或删除文件中的字符。从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。语法tr [选项]…SET1[SET2] 参数说明:-c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换-d, --delete:删除指令字符-s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符-t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等--原创 2020-07-07 19:09:07 · 113 阅读 · 0 评论 -
高级shell扩展---pidof命令
pidof查找指定名称的进程的进程号ID号与ps命令相似语法:pidof(选项)(参数)选项-s:仅返回一个进程号;-c:仅显示具有相同“root”目录的进程;-x:显示由脚本开启的进程;-o:指定不显示的进程ID。参数进程名称:指定要查找的进程名称。实例[root@localhost aaa]# pidof sshd3963 1222[root@zhhs aaa]# ps -ef |grep sshd | grep -v greproot 1222原创 2020-07-07 18:09:16 · 2166 阅读 · 0 评论 -
高级shell扩展---printf命令
printfprintf命令模仿C程序库(library)里的 printf() 程序。printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。语法:printf format-string [arguments...]参数说明:form原创 2020-07-07 18:06:47 · 255 阅读 · 0 评论 -
高级shell扩展---shopt命令
shoptshopt命令是set命令的一种替代,很多方面都和set命令一样,但它增加了很多选项。通过执行shopt看看都有那些选项与系统的默认值[root@localhost aaa]#shoptautocd offcdable_vars offcdspell offcheckhash offcheckjobs offcheckwinsize oncmdhist oncompat31 .原创 2020-07-03 18:33:25 · 810 阅读 · 0 评论 -
shell脚本案例(初级)
案例一:批量生产随机字符文件名使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下:xxxxxxxxxx_oldboy.html#!/bin/bash#DIR=/oldboy[ -d /oldboy ] || mkdir $DIRfor i in {1..10}do filename=`head /dev/urandom | md5sum |tr [0-9] [a-z] | cut -c 1-10`原创 2020-11-12 16:17:45 · 1438 阅读 · 3 评论 -
高级shell编程笔记(第三十三章 杂项)
第三十三章 杂项33.1 交互式和非交互式的shell和脚本交互式的shell在tty终端从用户的输入中读取命令。另一方面,shell能在启动时读取启动文件,显示一个提示符并默认激活作业控制。用户能交互地使用shell。运行脚本的shell一般都是非交互的shell。但脚本仍然可以存取他拥有的终端。脚本里甚至可以仿效成可交互的shell。#!/bin/bash#MY_PROMPT='$ 'while :do echo -n "$MY_PROMPT" read line eval原创 2020-11-06 14:31:53 · 807 阅读 · 0 评论 -
高级shell编程笔记(第三十二章 脚本编程分格)
第三十二章 脚本编程分格写脚本时养成结构化和系统方法的习惯。要养成在写代码前花几分钟来规划和组织你的想法。注意这节文档不是一个官方 Shell 编程风格。32.1 非官方的Shell脚本风格注释你的代码。这会使你的代码更容易让别人理解和赏识,同时也便于你维护。PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"# 当你去年写下这句代码时非常的了解它在干什么事,但现在它完全是一个谜.给脚本和函数加上描述性的头部信息#!/bin/bash#*原创 2020-11-06 14:09:05 · 95 阅读 · 0 评论 -
高级shell编程笔记(第三十一章 Gotchas)
第三十一章 Gotchas将保留字和字符声明为变量名case=value0 #引发错误23skidoo=value1 #引发错误#以数字开头的变量名是由shell保留使用的#试试_23skidoo=value1. 用下划线开头的变量名是允许的#但是... 仅使用下划线来用做变量名也是不行的_=25echo $_ #$_是一个特殊的变量,被设置为最后的命令的最后一个参数xyz((!*=value2 #引起严重错误用连字符或其他保留字符当做变量(或函数名)var-1=原创 2020-11-06 14:01:26 · 288 阅读 · 0 评论 -
高级shell编程笔记(第三十章 选项)
第三十章 选项set 命令用来在脚本里激活各种选项。在脚本中任何你想让选项生效的地方,插入set -o option-name 或用更简短的格式 set -option-abbrev。这两种格式都是等价的。#!/bin/bashset -o verbose #执行前打印命令#!/bin/bashset -v #和上面的有完全相同的效果注意:为了在脚本里停用一个选项,插入 set +o option-name 或 set +option-abbrev#!/bin/bashset -原创 2020-11-03 16:19:51 · 80 阅读 · 0 评论 -
高级shell编程笔记(第二十九章 调试)
第二十九章 调试Bash shell 没有自带调试器,甚至没有任何调试类型的命令或结构。脚本里的语法错误或拼写错误会产生含糊的错误信息,通常这些在调试非功能性的脚本是没什么帮助。Example 29-1 一个错误的脚本#!/bin/bash#a=37if [$a -gt 27 ];then echo $afiexit 0#错误信息 #[root@zhhs-mail shell]# sh test.sh #test.sh: line 4: [37: command not foun原创 2020-11-03 16:11:48 · 186 阅读 · 0 评论 -
高级shell编程笔记(第二十八章 关于zeros和nulls)
第二十八章 关于zeros和nulls/dev/zero 和 /dev/null使用/dev/null把/dev/null 看作"黑洞"。它非常等价于一个只写文件。所有写入它的内容都会永远丢失。 /dev/null 对命令行和脚本都非常的有用。禁止标准输出cat $filename >/dev/null#文件内容丢失,而不会输出到标准输出.禁止标准错误rm $badname 2>/dev/null#这样错误信息[标准错误]就被丢到黑洞了.禁止标准输出和标准错误输出cat原创 2020-11-03 16:03:49 · 117 阅读 · 0 评论 -
高级shell编程笔记(第二十七章 /dev 和 /proc)
第二十七章 /dev 和 /proc27.1 /dev在/dev目录内包含以或不以硬件形式出现的物理设备条目。包含被挂载的文件系统的硬设备分区在/dev目录下都有对应的条目,就像 df 命令所展示的。[root@mail shell]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/mapper/centos-root 17811456 4809860 13001596 28% /devt原创 2020-11-03 16:00:56 · 199 阅读 · 0 评论 -
高级shell编程笔记(第二十六章 数组)
第二十六章 数组较新的Bash版本支持一维数组。数组元素可以用符号variable[xx]来初始化。另外,脚本可以用declare -a variable 语句来清楚地指定一个数组。要访问一个数组元素,可以使用花括号来访问,即${variable[xx]}。Example 26-1 简单的数组用法#!/bin/bash#area[11]=23area[13]=37area[51]=UFOs#数组成员不必一定要连贯或连续的#数组的一部分成员允许不被初始化#数组中空缺元素是允许的#实际上原创 2020-10-27 17:45:22 · 231 阅读 · 0 评论 -
高级shell编程笔记(第二十五章 列表结构)
第二十五章 列表结构"与列表(and list)"和"或列表(or list)"结构提供一种处理一串连续命令的方法。它们能有效地替代复杂的嵌套if/then语句,甚至可以代替case语句。与列表(and list)command-1 && command-2 && command-3 && ... command-n如果每个命令都返回真,将会一次执行下去。当某个命令返回假,整个命令链就会结束执行。Example 25-1 使用用"与列表(and l原创 2020-10-27 09:56:18 · 224 阅读 · 2 评论 -
高级shell编程笔记(第二十四章 别名)
第二十四章 别名Bash别名本质上是一个简称、缩写,这可避免键入过长的命令序列。例如:如果我们添加 alias lm=“ls -l | more” 这一行到文件~./bashrc 文件里,然后每次在命令行键入lm将会自动被替换成ls -l | more。这使用户在命令行不必键冗长的命令序列,也避免了记忆复杂的命令及众多选项。设置alias rm=“rm -i”(交互式删除)能避免你不小心删除重要文件。在脚本里,别名机制不是非常的有用。如果把别名机制相像成C预处理器的某些功能将会非常好,比如宏扩展;但是,原创 2020-10-27 09:52:52 · 109 阅读 · 0 评论 -
高级shell编程笔记(第二十三章 函数)
第二十三章 函数和真正的编程语言一样,Bash也有函数,虽然在某些实现方面稍有些限制。一个函数是一个子程序,用于实现一串操作的代码块,它是完成特定任务的"黑盒子"。当有重复代码,当一个任务只需要很少的修改就被重复几次执行时,这时应考虑使用函数。function function_name{ command...}#或function_name () { command...}Example 23-1 简单函数#!/bin/bash#JUST_A_SECOND=1f原创 2020-10-26 18:10:48 · 151 阅读 · 0 评论 -
高级shell编程笔记(第二十二章 进程替换)
第二十二章 进程替换进程替换与命令替换(command substitution)很相似。命令替换把一个命令的结果赋给一个变量。例如 dir_contents=`ls -al`或 xref=$( grep word datafile)。进程替换则是把一个进程的输出回馈给另一个进程 (换句话说,它把一个命令的结果发送给另一个命令)。启动进程替换。它是用/dev/fd/文件把在圆括号内的进程的处理结果发送给另外一个进程。(注:实际上现代的 UNIX 类操作系统提供的/dev/fd/n 文件是与文件描述相关原创 2020-10-26 17:59:35 · 281 阅读 · 0 评论 -
高级shell编程笔记(第二十一章 受限shell)
第二十一章 受限shell在受限 shell 中运行的脚本或脚本的个代码断会禁用一些正常 shell 中可以执行的命令。这是限制脚本用户的权限和最小化运行脚本导致的破坏的安全措施。Example 21-1 在受限的情况下运行脚本#!/bin/bash##脚本开头以"#!/bin/bash -r"来调用,会使整个脚本在受限模式下运行.echoecho "Changing directory"cd /usr/localecho "Now in `pwd`"echo "Coming back原创 2020-10-26 17:59:11 · 735 阅读 · 0 评论 -
高级shell编程笔记(第二十章 子shell)
第二十章 子shell每个 shell 脚本有效地运行在父 shell 的一个子进程里。这个父 shell 是指在一个控制终端或在一个 xterm 窗口中给你命令指示符的进程。shell 脚本也能启动他自已的子进程。这些子 shell(即子进程)使脚本因为效率而同时进行多个子任务执行时能做串行处理。一般来说,脚本里的一个外部命令(external command)能生成(forks)出一个子进程,然而 Bash 内建(builtin)的命令却不这样做,因此,内建命令比起外部的等价命令执行起来更快。圆原创 2020-09-22 17:06:18 · 135 阅读 · 1 评论 -
高级shell编程笔记(第十九章 正则表达式)
第四部分 高级第十九章 正则表达式一个简要的正则表达式介绍一个正式表达式是一个字符串。字符串里的字符被称为元字符,它们可能表示了比它们字面上看起来的意思更丰富的含义。一个正则表达式包含下面一个或多个项:一个字符集:这里的字符集里的字符表示的就是它们字面上的意思。锚:一个锚指明了正则表达式在一行文本中要匹配的位置。例如^和$就是锚。修饰符:它们用于展开或缩小正则表达式匹配文本行的范围。修饰符包括了星号、括号和反斜杠符号。星号:-- * -- 匹配前一个字符的任意多次(包括零次)。点:原创 2020-09-22 14:50:08 · 129 阅读 · 0 评论 -
高级shell编程笔记(第十七章 Here Documents)
第十七章 Here Documentshere document就是一段特殊的代码块。他使用I/O重定向的形式来将一个命令序列传递到一个交互程序或者命令中,比如ftp、cat或者ex文本编辑器。limit string 用来划定命令序列的范围(注: 两个相同的 limit string 之间就是命令序列)。特殊符号 << 用来标识 limit string。这个符号具有重定向文件的输出到程序或命令的输入的作用。与 interactive-program < command-file 很原创 2020-09-22 11:59:45 · 313 阅读 · 0 评论 -
高级shell编程笔记(第十六章 I/O重定向)
第十六章 I/O重定向默认情况下始终有 3 个"文件"处于打开状态,stdin (键盘)、stdout (屏幕) 和 stderr (错误消息输出到屏幕上)。这 3 个文件和其他打开的文件都可以被重定向。对于重定向简单的解释就是捕捉一个文件、命令、程序、脚本或者是脚本中的代码块(参见 Example 3-1 和 Example 3-2)的输出,然后将这些输出作为输入发送到另一个文件、命令、程序或脚本中。每个打开的文件都会被分配一个文件描述符。stdin、stdout 和 stderr 的文件描述符原创 2020-09-22 11:19:46 · 157 阅读 · 0 评论 -
高级shell编程笔记(第十五章 算术扩展)
第十五章 算术扩展算术扩展提供了一种强力的工具,可以在脚本中执行算法操作。可以使用backticks、double parentheses 或 let 来将字符串转换为数字表达式。使用反引号的算术扩展(通常都是和expr一起使用)[root@localhost shell]# z=`expr $z + 3`使用双括号和let形式的算术扩展反引号形式的算术扩展已经被双括号形式所替代了–((…)) 和 $((…))–当然也可以使用非常方便的let形式。[root@localhost shell]#原创 2020-09-22 11:04:39 · 154 阅读 · 0 评论 -
高级shell编程笔记(第十四章 命令替换)
第十四章 命令替换命令替换将会重新分配一个命令甚至是多个命令的输出;它会将命令的输出如实的添加到另一个上下文中。使用命令替换的典型形式是使用后置引用(`…`)。后置引用形式的命令将会产生命令行文本。[root@localhost shell]# script_name=`basename $0`[root@localhost shell]# echo "The name of this script is $script_name."这样的话,命令的输出可以被当成传递到另一个命令的参数,或者保存原创 2020-09-21 14:02:46 · 144 阅读 · 0 评论 -
高级shell编程笔记(第十三章 系统与管理命令)
第 13 章 系统与管理命令在/etc/rc.d 目录中的启动和关机脚本中包含了好多有用的(和没用的)这些系统管理命令。这些命令通常总是被 root 用户使用,用与系统维护或者是紧急文件系统修复。一定要小心使用这些工具,因为如果滥用的话,它们会损坏你的系统。Users 和 Groups 类命令users显示所有的登录的用户。这个命令与 who -q 基本一致。groups列出当前用户和他所属于的组。这相当于$GROUPS内部变量,但是这个命令将会给出组名字,还不是数字。[root@localh原创 2020-09-18 17:41:08 · 1251 阅读 · 0 评论 -
高级shell编程笔记(第十二章 外部过滤器,程序和命令)
第十二章 外部过滤器,程序和命令标准的UNIX命令使得脚本更加灵活。通过简单的编程结构把shell指令和系统命令结合起来,这才是脚本能力的所在。12.1 基本命令新手必须掌握的初级命令ls基本的列出所有文件的命令。但是往往就是因为这个命令太简单,所以我们总是低估它。比如:-R 选项,这是递归选项,将会以目录树的形式列出所有文件-S 选项,将会按照文件大小列出所有文件-t 选项,将会按照修改时间列出所有文件-i 选项,将会显示文件的inode(见Example 12.4)Example原创 2020-09-16 15:59:28 · 2099 阅读 · 1 评论 -
shell高级编程笔记(第十一章 内部命令与内建)
第十一章 内部命令与内建内建命令指的就是包含在Bash工具集中的命令。这主要是考虑到执行效率的问题(内建命令将比外部命令执行的更快,外部命令通常需要fork出一个单独的进程来执行)。另外一部分原因是特定的内建命令需要直接存取shell内核部分。当一个命令或者是shell本身需要初始化(或创建)一个新的子进程来执行一个任务的时候,这种行为被称为forking。这个新产生的进程被叫做子进程,并且这个进程是从父进程中分离出来的。当子进程执行它的任务时,同时父进程也在运行注意:当父进程取得子进程的PID的时候原创 2020-07-13 14:44:38 · 401 阅读 · 0 评论 -
shell高级编程笔记(第十章 循环和分支)
第十章 循环和分支对代码块进行操作是有组织的结构化的shell脚本的关键。为了达到这个目的,循环和分支提供帮助。10.1 循环循环就是重复一些命令的代码块,如果条件不满足就退出循环。for 循环for arg in [list]这是一个基本的循环结构。它与C的相似结构有很大不同。for arg in [list]do commadn(s)...doneExample 10.1 循环的一个简单例子#!/bin/bash#列出所有行星for planet in 水星 金星 地球原创 2020-07-07 10:41:07 · 314 阅读 · 0 评论 -
shell高级编程笔记(第九章 变量重游)
第三部分 超越基本第9章 变量重游如果变量使用恰当,将会增加脚本的能量和灵活性。但前提是这需要仔细学习变量的细节知识。9.1 内部变量$BASH 这个变量将指向Bash的二进制执行文件的位置echo $BASH #/bin/bash$BASH_ENV 这个环境变量将指向一个Bash启动文件,这个启动文件将在调用一个脚本是被读取$BASE_SUBSHELL 这个变量将提醒subshell的层次,这是一个在version3才被添加到Bash中的新特性。见Example 20.原创 2020-07-03 16:02:39 · 602 阅读 · 0 评论 -
shell高级编程笔记(第八章 操作符和相关主题)
第八章 操作符和相关主题8.1 操作符等号操作符= 变量赋值(初始化或修改变量的值)无论在算术运算还是字符串运算中,都是赋值语句#"="后边不能有空格var=27category=minerals 注意:不要和"="test操作符混淆算术操作符+ 加法- 减法* 乘法/ 除法** 幂运算let "z=5**3"echo "z = $z" #z = 125% 取模expr 5 % 3 #2Example 8.1 最大公约数#原创 2020-07-02 14:41:11 · 113 阅读 · 0 评论 -
shell高级编程笔记(第七章 Tests)
第七章 Tests每个完整的、合理的编程语言都具有条件判断的功能。Bash具有test命令,不同的[]和()操作,和if/then结构7.1 Test结构一个if/then结构可以测试命令的返回值是否为0,是的话执行更多命令。有一个专用的内建命令"["。这个命令与test命令等价,它是一个内建命令。这个命令把它的参数作为比较表达式或者是文件测试,并且根据比较的结果返回一个退出码在版本2.02的Bash中,推出了一个新的[[…]]扩展test命令。注意:"[["是一个关键字,并不是一个退出码。B原创 2020-07-02 13:57:21 · 161 阅读 · 0 评论 -
shell高级编程笔记(第六章 退出和退出状态)
第六章 退出和退出状态exit 命令被用来结束脚本,就像C语言一样。它也会返回一个值来传给父进程,父进程会判断是否可用。每个命令都会返回一个exit状态(也可以叫return状态)。脚本中的函数和脚本本身都会返回退出状态。在脚本或者是脚本函数中执行的最后命令会决定退出状态。在脚本中,"exit n"命令将会把n退出码传递给shell;当一个脚本不带参数exit来结束时,脚本的退出状态由脚本中最后执行的命令来决定$? 读取最后执行命令的退出码。函数返回后,$?给出函数最后执行的那条命令的退出码。这种给原创 2020-07-02 10:52:53 · 210 阅读 · 0 评论 -
shell高级编程笔记(第五章 引用(引号))
第五章 引用(引号)引号的特殊效果就是保护字符串中的特殊字符不被shell或shell脚本重新解释或者扩展。(这里所说的"特殊"指的是一些字符在shell中具有特殊的意义,比如:*)[root@localhost aaa]# ls1.sh 2.txt file.txt File.txt[root@localhost aaa]# ls [Ff]*file.txt File.txt[root@localhost aaa]# ls '[Ff]*'ls: 无法访问[Ff]*: 没有那个文件原创 2020-07-02 10:39:19 · 126 阅读 · 0 评论 -
shell高级编程笔记(第四章 变量和参数的介绍)
第四章 变量和参数的介绍4.1 变量替换$ 变量替换操作符只有在变量被声明、赋值、unset或exported或者是在变量代表一个信号的时候,变量才会是以本来的面目出现在脚本里。变量再被赋值的时候可能需要使用=、read状态或是在循环的头部。在""中还是会发生变量替换,这叫做部分引用或叫弱引用。而在’'中就不会发生变量替换,这叫全引用或叫全引用。具体见第五章的讨论。Example 4.2 变量赋值和替换#!/bin/basha=375hello=$aecho hello #h原创 2020-07-02 09:47:31 · 128 阅读 · 0 评论