YohLee / Learning

学习资料
2 stars 0 forks source link

shell 脚本 #8

Open YohLee opened 6 years ago

YohLee commented 6 years ago

linux之sed用法

sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法 sed命令行格式为: sed [-nefri] ‘command’ 输入文本

常用选项: -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -e∶直接在指令列模式上进行 sed 的动作编辑; -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作; -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法) -i∶直接修改读取的档案内容,而不是由萤幕输出。

常用命令: a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~ c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行! d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚; i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~ s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

举例:(假设我们有一文件名为ab) 删除某行 [root@localhost ruby] # sed '1d' ab #删除第一行 [root@localhost ruby] # sed '$d' ab #删除最后一行 [root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行 [root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行

  显示某行 . [root@localhost ruby] # sed -n '1p' ab #显示第一行 [root@localhost ruby] # sed -n '$p' ab #显示最后一行 [root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行 [root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行

  使用模式进行查询 [root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行 [root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

  增加一行或多行字符串 [root@localhost ruby]# cat ab Hello! ruby is me,welcome to my blog. end [root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea" Hello! drink tea ruby is me,welcome to my blog. end [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea" Hello! drink tea ruby is me,welcome to my blog. drink tea end drink tea [root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n Hello! drink tea or coffee ruby is me,welcome to my blog. end

  代替一行或多行 [root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi Hi ruby is me,welcome to my blog. end [root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi Hi end

  替换一行中的某部分   格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式) [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird   [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby

 插入
 [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
 [root@localhost ruby]# cat ab
 Hello!
 ruby is me,welcome to my blog.
 end
 bye

 删除匹配行

  sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)

  替换匹配行中的某个字符串

#################################################### ##############可以替换文本中相应的字符串############### #################################################### sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

sed -i '$a ]' CustPackageInstHis.json.bak 追加到第一行

sed -i '1i [' CustPackageInstHis.json.bak 追加到最后一行

sed -i 's/替换源字符串/替换目标字符串/g' filename

--将data/add/替换成data_bak/20180324/2018032400/data/add/----"\"转义字符 sed -i 's/data\/add/data_bak\/20180324\/2018032400\/data\/add/g' filename sed -i 's/2018032400/2018032402/g' *.yml

YohLee commented 6 years ago

vi 用法**

一、vi查找:
当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找,不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下脚)就出现了 “/”然后输入你要查找的关键字敲回车就可以了。如果你要继续查找此关键字,敲字符n就可以继续查找了。值得注意的是“/”是向下查找,而“?”是向上查找,而在键盘定义上“?”刚好是“/”的上档符。

二、vi替换: vi/vim 中可以使用 :s 命令来替换字符串以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊飕还有很多需要学习),记录几种在此,方便以后查询。 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky n 为数字,若 n 为 .,表示从当前行开始到最后一行 :%s/vivian/sky/(等同于:g/vivian/s//sky/)替换每一行的第一个 vivian 为 sky :%s/vivian/sky/g(等同于:g/vivian/s//sky/g)替换每一行中所有 vivian 为 sky

可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/ :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 /):/oradata/apras/替换成/user01/apras1/

vim(vi)常用操作及记忆方法

vi(vim)可以说是linux中用得最多的工具了,不管你配置服务也好,写脚本也好,总会用到它。但是,vim作为一个“纯字符”模式下的工具,它的操作和WINDOWS中的文本编辑工具相比多少有些复杂。这里,我根据自己个人的使用经验,整理了一套vim的操作以及记忆的方法,希望对大家的学习有所帮助。

VI的三种模式 1,命令模式 2,输入模式 3,末行模式

命令 执行的操作 记忆方法 :q 退出 quit :w  存盘 write :e 打开新文件 :r 读取文件到VI read :! 强行 :set nu 显示行号  number :set nonu   隐藏行号 no number

h j k l 左 下 上 右

Ctrl + f 翻到下一页(向前翻页) front Ctrl + b 翻到上一页(向后翻页) back Ctrl + u 向前翻半页 Ctrl + d 向后翻半页

^ 移到行头 往上就到行头了(象形) $ 移到行尾 写完一行就要给一行的钱 w 下一个单词 word b 前一个单词 behind(在。。。后面) e 下一单词尾 end

G 跳到某一行 大哥(G)说到哪就到哪

i 光标前插入 insert a 光标后加入 add A 在行末加入 在一个词后是小a,一个行后就是大A o 另起一行加入 一个小鸡蛋(小o)掉下来了摔开了花 O 上一行加入 吐一个大泡泡(大O)飞上去破了

---------- c(吃掉)代表行内删除-------- cw 删除一个单词(一部分不包括空格) 吃掉一个 word c$ 删除一行到行尾 刚写的一行被删了,钱也拿不到了 c^ 删除一行到行头 往上吃,一直吃到头
x 删除一个字符 看你不爽就打上“x”

---------- d 代表删除-------------- dd 删除一行 del dir dw 删除单词到尾部(包括空格) del word de 删除单词到尾部(不包括尾部空格) del end d$ 删除当前到行尾的所有字符 del $(代表尾部) d^ 删除当前到行首的所有字符 del ^(代表行首) J 合并当前行 一个大钩子(J)把下面的一行拉到自己行尾 u 撤销上次操作 undo U 撤销当前行所有操作 事情闹大了,得有个更大的UNDO才能恢复 Ctrl + r 恢复undo 前 recover

VI中的多行删除 单行删除:1(待删除行)d 多行删除:1,10d

光标所在行,dd 光标所在行以下的N行,Ndd

--------- y 代表复制到缓存中----------- yy 复制当前行整行的内容到vi缓冲区 yw 复制当前光标到单词尾字符的内容到vi缓冲区 y$ 复制当前光标到行尾的内容到vi缓冲区 y^ 复制当前光标到行首的内容到vi缓冲区 p 读取vi缓冲区中的内容,并粘贴到光标当前的位置(不覆盖文件已有的内容)

/word 从上而下查 /是从上而下写的吧 ?word 从下而上查找 字符在哪儿呢(?)回头找找吧 n 定位下一个匹配的 相当于向下查找下一个 next N 定位上一个匹配的 相当于向上查找上一个

:s/1/2 搜索当前行第一个1并用2代替 search :s/1/2/g 搜索当前行所有的1并用2代替 global :#,#s/1/2/g 在#,#间搜索所有1并用2替换 :%s/1/2/g 在整个文档中将1替换为2 100%(全部) :s/1/2/c 每次替换都给出提示确认 cue提示

vim 1.txt 2.txt 3.txt 同时打开多个文档 :args 显示多文件信息(会在末行提示当前打开了哪些档) are globals :next 切换到下一个文件 :prev 切换到上一个文件 :first 定位首文件 :last 定位尾文件 Ctrl + ^ 快速切换到编辑器中切换前的文件

vi的基本概念 基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下: 1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。 2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。 3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等。 不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。

vi的基本操作 进入vi 在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面: $ vi testfile 有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,所以进入vi后,先不要乱动,转换入Insert后再说。 切换至Insert mode编辑文件 在Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。这时候您就可以开始输入文字了。 i: 插入,从目前光标所在之处插入所输入的文字。 a: 增加,目前光标所在的下一个字开始输入文字。 o: 插入新的一行,从行首开始输入文字。 Insert的切换→Command mode,按Esc键 您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,就要按ESC键转换回Command mode,再删除文字。 离开vi及存文件 在Command mode下,可按冒号“:”键入入Last line mode,例如: :w filename (输入“w filename”,将文章存入指定的文件名filename) :wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi) :q! (输入“q!”,强制离开并放弃编辑的文件)

Command mode功能键列表 在介绍command mode指令的时后,指令后面加上“常用”字眼的功能键,表示比较常用的vi指令,请读者您一定要学会、记住。 (1)I、a、o切换进入Insert mode。[超级常用] (2)移动光标 vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母 h、j、k、l,分别控制光标左、下、上、右移一格。 按Ctrl+B:屏幕往后移动一页。[常用] 按Ctrl+F:屏幕往前移动一页。[常用] 按Ctrl+U:屏幕往后移动半页。 按Ctrl+D:屏幕往前移动半页。 按 0 (数字零):移动文章的开头。[常用] 按 G:移动到文章的最后。[常用] 按 w:光标跳到下个word的开头。[常用] 按 e:光标跳到下个word的字尾。 按 b:光标回到上个word的开头。 按 $:移到光标所在行的行尾。[常用] 按 ^:移到该行第一个非空白的字符。 按 0:移到该行的开头位置。[常用] 按 #:移到该行的第#个位置,例:51、121。[常用] (3)删除文字 x:每按一次删除光标所在位置的后面一个字符。[超常用]

x:例如,6x 表删除光标所在位置的后面6个字符。[常用]

X:大字的X,每按一次删除光标所在位置的前面一个字符。

X:例如,20X 表删除光标所在位置的前面20个字符。

dd:删除光标所在行。[超常用]

dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]

(4)复制 yw:将光标所在处到字尾的字符复制到缓冲区中。 (想在和#x、#X的功能相反) p:将缓冲区内的字符粘贴到光标所在位置(指令‘yw’与‘p必须搭配使用)。 yy:复制光标所在行。[超常用] p:复制单行到您想粘贴之处。(指令‘yy’与‘p’必须搭配使用)

yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]

p:复制多行到您想粘贴之处。(指令‘#yy’与‘p’必须搭配使用) “ayy:将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer “ap:将放在buffer a的数据粘贴。 “b3yy:将三行数据存入buffer b。 “b3p:将存在buffer b的资料粘贴 (5)取代 r: 取代光标所在处的字符:[常用] R:取代字符直到按Esc为止。 (6)复原(undo)上一个指令 u:假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用] .: .可以重复执行上一次的指令。 (7)更改 cw:更改光标所在处的字到字尾$处。 c#w:例如,c3w代表更改3个字。 (8)跳至指定行 Ctrl+G:列出光标所在行的行号。

G:例如,15G,表示移动光标至文章的第15行行首。[常用]

Last line mode下指令简介 读者您要使用Last line mode之前,请记得先按Esc键确定您已经处于Command mode下后,再按冒号“:”或“/”或“?”三键的其中一键进入Last line mode。 1.列出行号 set nu: 输入“set nu”后,会在文章的每一行前面列出行号。 2.跳到文章的某一行

:井号代表一个数字,在Last line mode提示符号“:”前输入数字,再按Enter就会跳到该行了,如:15[Enter]就会跳到文章的第15行。[常用]

3.寻找字符串 /关键字:先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。 ?关键字:先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。 4.取代字符串 1,$s/string/replae/g:在last line mode输入“1,$s/string/replace/g”会将全文的string字符串取代为replace字符串,其中1,$s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。 %s/string/replace/c:同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是,%s和1,$s是相同的功能,c则是表示要替代之前必须再次确认是否取代。 1,20s/string/replace/g:将1至20行间的string替代为relpace字符串。 5.存文件 w:在last line mode提示符号“:”前按w即可将文件存起来。[超常用]

,# w filename:如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 w nice,将您正在编辑文章的第30~50行存成nice这个文件。

6.离开 q:按q就离开,有时如果无法离开vi,可搭配“!:强置离开vi,如“q!” qw:一般建议离开时,搭配w一起使用,如此离开时还可存文件。[常用]

进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后一行首 vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处 vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename vi filename....filename :打开多个文件,依次进行编辑

移动光标类命令 h :光标左移一个字符 l :光标右移一个字符 space:光标右移一个字符 Backspace:光标左移一个字符 k或Ctrl+p:光标上移一行 j或Ctrl+n :光标下移一行 Enter :光标下移一行 w或W :光标右移一个字至字首 b或B :光标左移一个字至字首 e或E :光标右移一个字至字尾 ) :光标移至句尾 ( :光标移至句首 }:光标移至段落开头 {:光标移至段落结尾 nG:光标移至第n行首 n+:光标下移n行 n-:光标上移n行 n$:光标移至第n行尾 H :光标移至屏幕顶行 M :光标移至屏幕中间行 L :光标移至屏幕最后行 0:(注意是数字零)光标移至当前行首 $:光标移至当前行尾

屏幕翻滚类命令 Ctrl+u:向文件首翻半屏 Ctrl+d:向文件尾翻半屏 Ctrl+f:向文件尾翻一屏 Ctrl+b;向文件首翻一屏 nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部。

插入文本类命令 i :在光标前 I :在当前行首 a:光标后 A:在当前行尾 o:在当前行之下新开一行 O:在当前行之上新开一行 r:替换当前字符 R:替换当前字符及其后的字符,直至按ESC键 s:从当前光标位置处开始,以输入的文本替代指定数目的字符 S:删除指定数目的行,并以所输入文本代替之 ncw或nCW:修改指定数目的字 nCC:修改指定数目的行

删除命令 ndw或ndW:删除光标处开始及其后的n-1个字 do:删至行首 d$:删至行尾 ndd:删除当前行及其后n-1行 x或X:删除一个字符,x删除光标后的,而X删除光标前的 Ctrl+u:删除输入方式下所输入的文本

搜索及替换命令 /pattern:从光标开始处向文件尾搜索pattern ?pattern:从光标开始处向文件首搜索pattern n:在同一方向重复上一次搜索命令 N:在反方向上重复上一次搜索命令 :s/p1/p2/g:将当前行中所有p1均用p2替代 :n1,n2s/p1/p2/g:将第n1至n2行中所有p1均用p2替代 :g/p1/s//p2/g:将文件中所有p1均用p2替换

选项设置 all:列出所有选项设置情况 term:设置终端类型 ignorance:在搜索中忽略大小写 list:显示制表位(Ctrl+I)和行尾标志($) number:显示行号 report:显示由面向行的命令修改过的数目 terse:显示简短的警告信息 warn:在转到别的文件时若没保存当前文件则显示NO write信息 nomagic:允许在搜索模式中,使用前面不带“\”的特殊字符 nowrapscan:禁止vi在搜索到达文件两端时,又从另一端开始 mesg:允许vi显示其他用户用write写到自己终端上的信息

最后行方式命令 :n1,n2 co n3:将n1行到n2行之间的内容拷贝到第n3行下 :n1,n2 m n3:将n1行到n2行之间的内容移至到第n3行下 :n1,n2 d :将n1行到n2行之间的内容删除 :w :保存当前文件 :e filename:打开文件filename进行编辑 :x:保存当前文件并退出 :q:退出vi :q!:不保存文件并退出vi :!command:执行shell命令command :n1,n2 w!command:将文件中n1行至n2行的内容作为command的输入并执行之,若不指定n1,n2,则表示将整个文件内容作为command的输入 :r!command:将命令command的输出结果放到当前行

寄存器操作 "?nyy:将当前行及其下n行的内容保存到寄存器?中,其中?为一个字母,n为一个数字 "?nyw:将当前行及其下n个字保存到寄存器?中,其中?为一个字母,n为一个数字 "?nyl:将当前行及其下n个字符保存到寄存器?中,其中?为一个字母,n为一个数字 "?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是一个数字 ndd:将当前行及其下共n行文本删除,并将所删内容放到1号删除寄存器中。

VI的使用

一、插入文本 ┌──┬────────────┐ │命令│描述          │ ├──┼────────────┤ │i  │在当前字符前插入文本  │ ├──┼────────────┤ │I  │在行首插入文本      │ ├──┼────────────┤ │a  │在当前字符后添加文本  │ ├──┼────────────┤ │A  │在行末添加文本     │ ├──┼────────────┤ │o  │在当前行后面插入一空行 │ ├──┼────────────┤ │O  │在当前行前面插入一空行 │ ├──┼────────────┤ │R  │以改写方式输入文本   │ └──┴────────────┘ 二、移动光标 ┌─────┬───────────┐ │命令   │描述         │ ├─────┼───────────┤ │j或下箭头 │向下移动一行     │ ├─────┼───────────┤ │k或上箭头 │向上移动一行     │ ├─────┼───────────┤ │h或左箭头 │左移一个字符     │ ├─────┼───────────┤ │l或右箭头 │右移一个字符     │ ├─────┼───────────┤ │w     │右移一个词      │ ├─────┼───────────┤ │W     │右移一个以空格分隔的词│ ├─────┼───────────┤ │b     │左移一个词      │ ├─────┼───────────┤ │B     │左移一个以空格分隔的词│ ├─────┼───────────┤ │0     │移到行首       │ │Ctrl-F  │向前翻页       │ ├─────┼───────────┤ │Ctrl-B  │向后翻页       │ ├─────┼───────────┤ │nG    │到第n行        │ ├─────┼───────────┤ │G     │到最后一行      │ └─────┴───────────┘ 三、替换文本 ┌─────┬──────┐ │命令   │描述    │ ├─────┼──────┤ │$     │到行尾   │ ├─────┼──────┤ │(     │到句子的开头│ ├─────┼──────┤ │)     │到句子的末尾│ ├─────┼──────┤ │{     │到段落的开头│ ├─────┼──────┤ │}     │到段落的末尾│ └─────┴──────┘

四、删除文本 ┌───┬───────────┐ │命令 │描述          │ ├───┼───────────┤ │r   │替换一个字符      │ ├───┼───────────┤ │c   │修改文本直到按下Esc健 │ ├───┼───────────┤ │cw  │修改下一个词      │ ├───┼───────────┤ │cnw  │修改接下来的n个词   │ └───┴───────────┘ 五、文本编辑 ┌──┬──────────────────────┐ │命寺│描述                    │ ├──┼──────────────────────┤ │yy │将一行文本移到缺省缓冲区中          │ ├──┼──────────────────────┤ │yn │将下一个词移到缺省缓冲区中          │ ├──┼──────────────────────┤ │ynw │将后面的n个词移到缺省缓冲区中        │ ├──┼──────────────────────┤ │p  │如果缺省缓冲区中包含一行文本,则在当前   │ │  │行后面插入一个空行井将缺省缓冲区中的声   │ │  │容粘贴到这一行中;如果缺省缓冲区中包含   │ │  │多个词,把这些词粘贴到光标的右边.     │ ├──┼──────────────────────┤ │P  │如果缺省缓冲区中包含一行文本,则正当前    │ │   │行前面插入一个空行井将缺省缓冲区中的内    │ │  │容粘贴到这一行中;如果缺省缓冲区中包含    │ │   │多个词,把这些词粘贴到光标的左边    

  │ └──┴──────────────────────┘

YohLee commented 6 years ago

Shell 文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Shell 文件包含的语法格式如下:

. filename # 注意点号(.)和文件名中间有一空格

source filename

实例

创建两个 shell 脚本文件。

test1.sh 代码如下:

!/bin/bash

author:菜鸟教程

url:www.runoob.com

url="http://www.runoob.com"

test2.sh 代码如下:

!/bin/bash

author:菜鸟教程

url:www.runoob.com

使用 . 号来引用test1.sh 文件

. ./test1.sh

或者使用以下包含文件代码

source ./test1.sh

echo "菜鸟教程官网地址:$url"

接下来,我们为 test2.sh 添加可执行权限并执行:

$ chmod +x test2.sh $ ./test2.sh 菜鸟教程官网地址:http://www.runoob.com

注:被包含的文件 test1.sh 不需要可执行权限。
YohLee commented 6 years ago

Shell 函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

shell中函数的定义格式如下:

[ function ] funname [()]

{

action;

[return int;]

}

说明:

1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255 

下面的例子定义了一个函数并进行调用:

!/bin/bash

author:菜鸟教程

url:www.runoob.com

demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun echo "-----函数执行完毕-----"

输出结果:

-----函数开始执行----- 这是我的第一个 shell 函数! -----函数执行完毕-----

下面定义一个带有return语句的函数:

!/bin/bash

author:菜鸟教程

url:www.runoob.com

funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !"

输出类似下面:

这个函数会对输入的两个数字进行相加运算... 输入第一个数字: 1 输入第二个数字: 2 两个数字分别为 1 和 2 ! 输入的两个数字之和为 3 !

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。 函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

带参数的函数示例:

!/bin/bash

author:菜鸟教程

url:www.runoob.com

funWithParam(){ echo "第一个参数为 $1 !" echo "第二个参数为 $2 !" echo "第十个参数为 $10 !" echo "第十个参数为 ${10} !" echo "第十一个参数为 ${11} !" echo "参数总数有 $# 个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:

第一个参数为 1 ! 第二个参数为 2 ! 第十个参数为 10 ! 第十个参数为 34 ! 第十一个参数为 73 ! 参数总数有 11 个! 作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

另外,还有几个特殊字符用来处理参数: 参数处理 说明 $# 传递到脚本的参数个数 $ 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$相同,但是使用时加引号,并在引号中返回每个参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

YohLee commented 6 years ago

iostat ---可通过iostat命令查看io,内容,吞吐量 sar ---可通过iostat命令查看io,内容,吞吐量 man 命令 查看命令选项

YohLee commented 6 years ago

https://www.cnblogs.com/nzbbody/p/4391802.html Linux shell 提取文件名和目录名 ${}用于字符串的读取,提取和替换功能,可以使用${} 提取字符串 1、提取文件名 [root@localhost log]# var=/dir1/dir2/file.txt [root@localhost log]# echo ${var##/} file.txt 2、提取后缀 [root@localhost log]# echo ${var##.} txt 3、提取不带后缀的文件名,分两步 [root@localhost log]# tmp=${var##/} [root@localhost log]# echo $tmp file.txt [root@localhost log]# echo ${tmp%.} file 4、提取目录 [root@localhost log]# echo ${var%/*} /dir1/dir2

使用文件目录的专有命令basename和dirname 1、提取文件名,注意:basename是一个命令,使用$(), 而不是${} [root@localhost log]# echo $(basename $var) file.txt 2、提取不带后缀的文件名 [root@localhost log]# echo $(basename $var .txt) file 3、提取目录 [root@localhost log]# dirname $var /dir1/dir2 [root@localhost log]# echo $(dirname $var) /dir1/dir2