CentOS开启coredump转储并生成core文件的配置
How to generate a core dump in Linux when a process gets a segmentation fault?
ulimit –c unlimited
Changing location of core dump
How to analyze a program’s core dump file with gdb?
尽管网上有成打的Vim在线教程,但是要么艰深晦涩,要么太过肤浅。本教程的目标让每个阶段都有斩获,从理解它的哲学(将和你终身相伴)到超越现在编辑技巧,成为其中的牛人。
简单来说,本教程的学习方式将使你终身受益。
我相信大多数人可能由于以下三点原因而使用vim:
1、vim无所不在。学习vim你无需担心到了其他平台需要学习新编辑器。
2、可扩展性。你可以只用它来编辑配置文件,也可以将它当做你的开发平台。
3、功能强大。它的工作方式与自然语言类似。即使一开始你对vim一无所知,经过一段时间的使用学习,很快也会成为牛人。
一句话,我相信一旦你开始学习,你会觉得就像掌握母语还有基础数学这些基本技能一样,也能自然而然地掌握vim。好了,在了解这些知识之后,让我们正式开始vim技术的学习吧。
Kana大神说过,对vim的掌握有五个层次:
对此我并不了解,不过我认为这种观点值得我们注意。毕竟,kana是vim大神。在本教程中,我将通过下面四个主要模块来向你展示vim。
换句话说,如果你已经对vim有所了解的话,建议你从具体操作这部分开始。如果你熟练掌握这部分的话,就直接进入进阶开始学功夫。假如你看这篇教程是为了某个具体问题,那么请进入常见问题章节。
所以呢,建立vim世界观,vim基本操作,高手进阶以及常见问题——这几部分任君挑选。
我曾说过,不希望这是一本超级vim配置手册,网上已经有很多这类教程了。本教程的目的在于强化你对vim的理解,帮助你熟练掌握这个工具。不过我们也会稍微介绍一些基本的配置。
首先,我建议你安装(几乎)自我管理的vim。我就曾试过Janus(vim的发行版),但是我无法确定它究竟在做什么,这让我感到很挫败。我偏好的配置就像vim自身一样,简单而优雅。
为了达到这个目的,我直接将用户主目录下的.vim目录和.vimrc作为配置文件。
./vimrc修改常用键
首先呢,我觉得使用
inoremap jk
【注意: 有些人喜欢将
反斜杠也同样存在这种问题,所以就像其它指导文档推荐的那样,我也喜欢将引导键重映射为逗号(,)。
let mapleader = “,”
通过这样的配置,可以简化我们接下来的命令执行,比如执行映射的缩写命令时,只需右手中指往下一格就可以轻松输入逗号,而不需要向上再向右去远远地按反斜杠键。
大写键不在vim的配置文件中,不过这个键的位置比较好,而它的默认功能我们又常常用不上。对我来说,CAPSLOCK键没啥用处,所以我将它映射为Ctrl键(从操作系统层面来设置)。这样如果我要执行Ctrl-XX操作时只需将左小指左移就可以了。
此外,推荐其他几项基础设置,这样使用更加方便。
filetype plugin indent on
syntax on
set encoding=utf-8
要知道,优化vimrc文件是一个非常值得花时间去研究的问题,这里说的几个建议仅仅是皮毛。推荐查看我的设置或者阅读这几篇引用文章。
【请注意:如果你不熟悉或者并不喜欢插件,可以跳过这一节。等你下次想通了再来看看。】
对我来说,Janus最能吸引我的地方在于它的插件管理,不过我可以通过Pathogen来实现。基本上,通过以下几步就可以了:
为了备份vim设置,我将整个~/.vim目录通过git库保存在这里。这样即便我新装了系统,也可以很方便的使用git clone https://github.com/danielmiessler/vim获取我的偏好设置。
也许你也会喜欢这样做。
简单一步clone之后,将~/.vimrc软连接到~/.vim/vimrc就可以了。
Vim最成功的闪光点莫过于一旦你开始使用它,它就会让你欲罢不能。Vim就像语言一样,拥有名词、动词、副词等属性。
虽然我的这种说法从技术层面可能并不准确,但是却能帮助你更好地理解vim的工作机制。重申一次,本教程的目的不是为了取代其他教程或帮助手册——而是为了帮助你理解其他这些文档晦涩难懂的部分。
所谓动词指的是我们执行的动作,这些动作可以施加在名词之上。可以看看下面几个常见的动作:
定语用在名词之前,表明以哪种方式来执行动作。几个例子:
在英语中,名词用来表示你所操作的对象。它们都是客体。在vim中也是这样。下面列出vim中的名词:
同样,你也可以将名词视为移动动作,这意味着你可以用名词表示在文本的跳转范围。我们可以在“移动”章节中看到例子说明。
好了,现在我们有句子的不同组成部分,该怎样将这几部分组成完整的句子呢?就像英语一样,凭感觉将动词、修饰语和名词组合起来。
对于下面这些符号,根据颜色的不同来区分句子的不同组成部分:
删除两个单词
d2w
修改所在的句子(删除当前句子并进入插入模式)
cis
拷贝当前所在的段落
yip
修改当前光标所在位置到下一个括号之间的文本内容
ct< 记住,这里的“目标”是尖括号,除此之外还可以是任意字符。从语法上来说,使用单个字母”t”来表示这个向前查找的“目标”,这样我就可以使用“dt.”表示删除当前位置到下一个句号之间的内容,”yt;”表示拷贝当前位置到下一个分号之间的内容。 看起来多漂亮!当编辑文本时采用这样的思维方式可以使得操作更加优雅,符合我们的直觉思维,而且就像其他语言一样,熟能生巧。
现在,在了解这些基本操作后,让我们结合具体操作来更进一步学习。
一些对文件的基本操作。
【注意:相比较:wq 我更喜欢使用ZZ,因为我觉得不需要输入冒号我觉得会快一点。也可以使用:x】
对于任意一款编辑器,查找文本都是最基本需求。Vim拥有很强大的文本搜索功能,这一节将着重讨论vim的文本搜索。
Vim中最基本也是最强大的搜索方式是”/”命令,在窗口最底端输入你需要查找的字符串并回车就可以了。
查找include字符串
/include
查找结果如下所示,所以匹配结果都被高亮显示:
搜索完成后,输入”n”依次向下查找,或者”N”向上查找。如果想要逆向查找字符串也可以使用”?”来代替”/”.
Vim有一招特别酷,不管你在哪儿,都能查找特定字符并直接跳转过去。比如说,我正在编辑HTML文件,
向前查找并直接跳转到<字符 f< 向前查找并跳转到<的前一个字符 t< 你可以这么理解,第一种找出目标(f),直接定位到查找对象;第二种到达目标(t),向着目标对象前进,定位到目标的前面。 比较怪异的一点是,可以将它们作为命令中的名词。就比如刚才我在编辑这句时: 修改到下一个”<”之间的内容 ct< 对任意字符都可以这么做,比如说,句号,尖括号,圆括号,普通字母等等。这样你就可以查找文本并跳转,或者你知道具体位置并直接跳转。 【注意:当你搜索指定字符时,可以使用分号跳转到下一处——不管是t搜索还是f搜索。逗号可以用来反向跳转到上一处。】
提高编辑效率至关重要的一点是:在文本内的自由移动跳转。对vim来说,充分利用我们上文所说的vim语言的基本准则,就可以既简单又优雅地做到。首先,介绍基础概念。
我们从键盘中间排开始介绍。受过训练的打字员一般都习惯将右手指放在jkl;这几个键上,就让我们从这里开始使用vim。
刚开始可能使用得不太习惯,不过只需几分钟的练习之后,就会习惯成自然,你甚至会想要在word文档里面也这样用(顺便说一下,word文档不支持)。
总结起来就是:右手食指和中指用来上移下移,右手食指和无名指用来左移右移。
你可以在当前行内自由的移动。
【注意: 逗号和分号会重复之前的t和f跳转】
除了按行和字符移动外,还可以按单词移动:
当使用大写字母时,vim会忽略掉单词间的分隔符,这样原本被分隔符隔开的多个单词会因此被视为一个大单词。
这种大写命令的优势在我们实际工作中会频繁地碰到。
在普通模式下,可以在两点间来回跳转,这在实际操作中非常有用。
现在将所以移动动作总结到一起:
【注意:前面说过我将CAPSLOCK键映射到Ctrl,所有这些基于Ctrl的命令,我都可以用CASLOCK来代替】
好了,了解一堆在文本中移动的命令后,我们可以开始学习对文本的修改了。需要记住这一点:这些移动命令会一直陪伴着我们——它们是vim语言的一部分(它们是上文提到的修饰语)。
首先我们要弄清楚模式的概念。刚开始说到模式可能有点违反我们的直觉,不过一旦习惯之后就会使用得非常的自然。很多vim指南都从介绍模式开始,不过我发现如果直接从模式开始有点不好理解,从普通模式与插入模式之间的切换入手会好一点。
除了上面介绍的模式外vim还有一些其他的模式,不过本教程不做介绍因为它们不是首要任务。
现在让我们一起回忆vim语言: 动词、修饰符、名词。假设我们从普通模式开始,现在想要切换到插入模式下修改文本。
动词可以实现这种切换,并且有好几种选择。我们可以修改(c),插入(i),或者追加(a),还有其他变种。
让我们从这几个可选命令开始。
修改句子
cis
移动到行首并进入插入模式
I
在当前光标位置之后进入插入模式
a
从上面例子可知,有多种方式可以进入插入模式输入文本。还有一些简写来执行多条操作,比如说删除并进入删除模式。
删除从光标所在位置开始到行末的所有内容,并进入插入模式
C
删除当前行并进入插入模式
S
可以通过波浪符来变更大小写。就像你猜想的那种方式工作:不管你光标所在字符还是可视模式下选择的文本都可以。
Vim还可以快速格式化文本,比如格式化一整段文本,使用下面这个命令就可以很容易实现:
格式化当前段落
gq ap
gp根据预设的文本宽度testwidth以及参数指定的文本范围来工作,这意味着对于你指定的任意范围的文本,gp都可以自动校准宽度,使得文档看起来干净又整洁。
【注意: ap表示文本对象”整个段落”的覆盖范围】
在了解怎样修改文本后,接下来看看怎样直接删除文本。可能你已经知道了,跟前面差不多——只不过实现的动作不同罢了。
足够简单吧?
如果一个编辑器连撤销和重做的功能都没有,你肯定不会用它。vim就像我们前面注意到的那样,尽其所能让我们更顺手地操作,撤销与重做也不例外。
【注意:记得将CAPSLOCK键映射为Ctrl,这样你才能更方便快速的使用组合键。】
这两个动作都可以重复操作,你可以一直撤销啊撤销回到最初保存点,也可以一直重做啊重做到撤销前的状态。
Vim所有命令中最强大的那个莫过于点命令,听起来有点奇怪是不是?解释一下,通过“.”这个小点可以让你做一些很棒的事情——重复之前你的任何一个操作。
你所做的许多操作可能都有重复的价值。比如进入插入模式添加一些文本内容。你只需执行一次,然后一直执行点命令来重复就可以了。请看下面的例子。
dw
5.
多么给力! 如果结合可视化模式,发挥的能力更让你大开眼界。
快速拷贝与粘贴文本同样也是文本编辑器的必备功能,vim当然也是这方面的高手。
【注意:除了点命令外,&也是一种强大的重复命令,用于重复ex模式下的上一条命令(还记得ex模式吗?)】
Vim的拷贝与大家预期的方式可能略有不同。拷贝命令不是大家料想的c。不知你还记不记得,上文提到c表示“修改”,已经被占用了。Vim用拉取来表示拷贝,简写为y。
记住,这种拷贝动作与你熟悉的那种拷贝并无不同——你只是在目的处复制了一份而已。
剪切很简单:跟删除操作差不多。所以呢,剪切实质上就是将删除的内容挪到缓冲区,然后将这段删除的内容再粘贴就可以了。
粘贴跟我们想的一样——使用p命令。所以呢,如果你执行dd命令删除了一行,你可以用p粘贴回去。
有一点要记住:粘贴的起始位置从你当前光标位置之后开始,根据你拷贝的内容,你要么粘贴字符或单词,要么粘贴行或列。如果想撤销粘贴,使用通用撤销命令“u”就可以了。
交换两行的位置
ddp
使用这条命令可以很快速的交换两行的位置。第一部分删除你所在的行,第二部分将它粘贴回之前所在位置的下面。(ps:文章中用的是above,但是实际上拷贝回下方位置)
如果没有拼写检查的话,感觉会很糟糕,还好vim这方面做得很好。当然我们需要先在配置文件中配置拼写检查选项。
在~/.vimrc的某个位置中添加
找出拼写错误
如果在配置文件中设置了拼写检查的选项,那么拼错的单词会自动添加下划线。你也可以手动输入:set spell和:set nospell来启用或禁用。
不管怎么说,一旦开启了拼写检查,如果存在拼写错误的话,你就可以使用以下命令来跳转:
跳转到下一处拼写错误
]s
跳转到上一处拼写错误
[s
若光标处是错误单词,给出修改建议
z=
将识别的错误单词标记正确
zg
将vim视为正确的单词标记为错误单词
zw
我习惯在~/.vimrc中添加一些拼写相关的简写命令。首先就是让修正拼写错误的命令变得简单:
将拼写修正标记为
在某些情况下,比如说我需要创造性的拼写一些单词时,我会使用下面的命令来取消拼写检查。想要重新打开拼写检查只要再执行一次这个命令就可以了。
Toggle spelling visuals with
nnoremap
Vim的另一个强大的功能是替换。命令分为三部分,首先指定将要被替换的字符串,之后是替换的新字符串,最后指定替换范围。
基本设置为:%s
将每行的foo替换为bar
:%s /foo/bar/g
将当前行中的foo替换为bar
:s /foo/bar/g
【注意: 两个命令的不同之处在于,单行替换s前少了%】
还有许多其他的选项,不过这些是最基本的。
PS: 前面&命令重复此类操作(:进入ex模式后执行的命令)
太棒了。我们已经讨论了大部分文本编辑器的基本功能,以及在vim中如何使用这些功能。现在可以进行高级vim的任务了——请注意,我说的高级进阶是对初学者而言,不是Kana这样的大神级人物。
在稍早之前我们讨论了“.”点命令的重复功能。有些命令适合使用点命令来重复,有些则不适合,区分这两种命令很重要。
通常,如果你想要使用“.”(或者如Drew Neil称之为点命令)实现命令重复,说明你想用点命令缓存的命令来做比较细致的操作。
比如说你要向若干行行末添加一些内容,但是添加的前提是被添加的行包含指定的字符串。你可以使用如下方式来实现:
搜索字符串
/delinquent
现在,只要你按下“n”键都会跳转到下一个搜索到的实例。那么,从第一个匹配实例开始,我们给它追加文本。
在行末添加文本
A[DO NOT PAY] [Esc]
好,这条命令执行完成了。不过接下来还有12个地方需要你来做。点命令允许我们简单地重复执行上一条命令,而且我们还需要保存搜索结果,可以将这两条命令结合起来。
跳转到下一个匹配实例并向行末添加文本
n.
注意,这种方式将动作与缓存的命令结合起来,所以我们能按照预期地那样跳转并执行命令。
文本对象很特殊。这些文本对象的存在使得你可以操作(动词)更加复杂的对象(名词)。比起选中某个单词并删除、跳转到句首并删除句子等简单操作来说,不管你在何种文本对象的区域内,你都可以对它们执行这些操作。
说是说不清,实践出真知嘛,我们可以看几个例子。
首先来看基于单词的对象
这些都是目标(名词),所以我们可以对它们做一些操作,比如说删除、修改等等。
删除单词(包括单词周围的空格)
daw
【注意: 对象内部与对象周围这两者之间的区别在于单词旁边是否有空格】
句子对象的工作原理与单词对象是一致的,想象一下,你敲了一大段句子,敲了一半后悔了想要删掉。你就可以简单的使用下面这条命令,而不用回到句子开头来申明删除整行。
修改整条句子
cis
这条命令杀伤力还是挺大的,它会删除整条句子并进入插入模式等待你输入新的内容。
还有许多其他的对象类型,我只简单的来介绍一下。
当我编辑代码或者HTML文件时,时常会用到这些命令。关键是如果这些对象文本存在问题,你甚至并不需要处于这些对象内部就可以操作它们;如果光标当前位置在双引号外面(经测试,跟双引号处于同一行并在双引号前面),只需要输入ci”就可以删除双引号内部的所有内容,并将你挪到双引号中间进入插入模式等待你的输入。简直不要太酷。
对其他类型的某些对象同样适用,比如说各种括号(圆括号、尖括号、大括号)和标签(html)。
比如说编辑HTML链接时,URL地址一般在双引号之间,链接文本在标签中定义;通过vim这两条命令可以很方便地修改:ci”(修改URL)和cit(修改链接文本)。
下面列出常见的文本对象:
a
总的来说,我使用最多的是单词,双引号和标签。
Vim的有许多迷人之处吸引着我们,不过它们相比较可视化模式的技能来说,还是太弱了。
也许可视化模式的最强大之处在于:我们前面学到的所有的一切命令,通过结合可视化模式使用,能力都会大有提升。这是由于在可视化模式下选中的高亮文本,可以全部作为命令的操作对象。
首先,学会进入可视化模式并选择文本。通过“v”进入可视化模式,有三种选择。
有时候你会处于一段文本中,两头被,.({[之类的符号所包围。你可以使用下面的命令来选中这部分的内容:
选中圆括号中的内容
vi(
选中中括号之间的内容
vi[
你还可以加数字限定选择的层数(比如说你处于嵌套层)
选中两层大括号之间的所有内容
v2i{
【注意: 你也可以使用va来代替vi。请不要被这些迷惑。它们与我们所知的名词和动词没有什么不同】
从基于字符的可视化开始介绍(从普通模式输入v进入可视化模式),在这种模式下你可以选中单个字符、多个字符、单词等等。相比较行选择模式来说,我比较少使用这种模式,不过只是相对而言,其实用的也还是挺多的。
这里最主要的是要理解这一点: 处于可视化模式中,你的移动动作会修改被高亮选择的文本。这就意味着,w或)之类的动作也会起作用,它们可以扩展当前高亮选择的范围。之后,这部分高亮文本就可以作为命令执行的目标。
普通模式下输入V进入这种模式,之后我们会讨论在这种模式下的操作。
可视化模式中还可以垂直地选择文本,这对操作列数据来说很给力。
对这些文本做什么操作都是你的自由,不过最普遍的操作是删除、拷贝和粘贴。想一下你平常用鼠标选中一片文本会做什么操作?
进入可视化模式,选中两个以上单词并拷贝
vwwy
拷贝之后你可以在任何你希望的地方输入p来粘贴。
或者你可以做一些基于行的操作。
进入行选择模式,删除几行文本
Vjjd
你也可以使用文本对象,不过这种操作不太安全,最好别做。
可视化模式下选中一整个段落
vip
可视化模式下选中一整段文本并粘贴到当前段落之下。
vipyjjp
不要因为命令很长而感到崩溃。要记住,这些命令跟我们平常说话是一样的。你可以没有任何困难地、很随意地念叨:
我想去商店。
这条命令也是一样的:
拷贝这一段,下移两行,再粘贴。
可视化模式还有一个很神奇的地方,对于选中的文本,你可以通过点命令来执行之前缓存的命令。请看下面这个例子:
1
2
3
4
5
6
|
foo
bar
thing
other
yetanother
also
|
如果想在每行前面都加个冒号,可以现在第一行foo之前添加,然后可视化模式下选择之下所有行,执行点命令就可以了。
1
2
3
4
5
6
|
:foo
:bar
:thing
:other
:yetanother
:also
|
【注意:要想使用这个功能,必须要在配置文件中添加映射 vnoremap . :norm.
BAM!
觉得这功能没有那么酷炫? 那就想象一下: 你有个六万行的文件,每行都与例子一样,需要追加个冒号。你会怎么做?
对整个文件添加分号
0i:j0vG.
wut
大大简化了我们的操作,大杀器一枚。步骤如下:
这样对六万行文件的操作就全部完成了。你甚至不需要去记一些乱七八糟的口诀——就像学骑单车会摔倒一样,摔着摔着你就会了。相信我。
有些人会觉得宏很可怕,其实不然。宏只用来完成这样一件事: 记录你做的一切,在你需要的时候帮你再做一次。下面是一个简单总结:
很简单啊是不是?你可以保存多个宏,比如说宏a、宏b、宏c等等。当你需要的时候执行@a或者@c之类的就可以了。
你可能会问:
既然可视化模式与点命令的结合已经这么强大了,我们为什么还要使用宏呢?
问得好,不过答案挺复杂。宏可以做你所做的一切,来看看这样一个流程
这么一堆工作,咱们还是假设文件有六万行,试着在Microsoft word之类的工具里完成这些操作,照样会让人感到万分痛苦。
不过在vim中,这都不算事儿,你只需要把这些动作都做一遍(recording模式下),然后对每一行重新执行宏就可以了。
【注意:如果想要对可视化选中文本执行宏的话,可以执行:normal @a(或者其他你所定义的宏的名字),这条命令会临时将你切换到普通模式,针对每一行执行宏命令】
下面我们来看一些大家经常问的一些问题,总结出来节约大家时间。
根据打开文件的类型不同,可能需要你对回车符和换行符做一些处理。这里介绍如何删除行末那些烦人的Ctrl-M字符。
删除行末的Ctrl-M字符
:%s/s+$//
set ft=unix
set ft=html
set ft=dos
【注意:如果要显示当前文件类型,在配置文件中添加:set filetype,或者在vim中直接执行这条命令就可以了】
借用Surround插件,我们可以很
:做同样的事,不同的是将单引号修改成
通过本教程我希望大家能明白以下两点:
上面介绍的那些vim基础用法,即便你只喜欢其中一部分,我想可能也会加深你对编辑文本的热情——这可不是小事。你对操作的编辑器越熟练,思维也就越发散,我想这是堪比史诗级的大事了。
更为重要的是,这也是为什么要求你得精通你选择的编辑器。只有精通编辑器,不被编辑器的操作所阻滞,当你脑内思绪奔腾时,你才能激扬文字跟紧思绪跳跃的步伐。
或者,你也可以将这一切都抛开,成为那些被人所取笑的人——不管怎样,我希望本教程能对你有用。
【如果你喜欢这篇文章,可以去我的地盘看看其他技术指导文章】
from:http://blog.jobbole.com/86132/
1、将sqlite文件导出到csv文件:
sqlite3 -header -csv <db name>.db “select * from <tablename>;” > <outputname>.csv
2、创建任意格式和大小(字节)的文件
fsutil file createnew <filename> <filesize>
一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务。
在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。示例如下所示:
chsh <username> -s <shell>
可以定义如下两种类型的变量
可以有两种实现方法:
2>&1
&>
示例如下:
if [ 条件 ] then; command ... else if [ 条件 ] then; command... else command... fi fi
“$?”可以来检查前一命令的结束状态,通常”0”表示成功,”1-255”表示运行失败
可以使用-gt
、 -lt`` 、
-ne、
-eq`来进行比较。
break命令一个简单的用途是退出执行中的循环。我们可以在while和until循环中使用break命令跳出循环
continue命令不同于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令很多时候是很有用的,例如错误发生,但我们依然希望
通常赋予脚本执行权限或使用bash命令调用,如下所示:
chmod +x script.sh
bash script.sh
如下格式:
#!/bin/bash # #auther: magedu #description:This is scripts 脚本主体
通常使用bash 命令中 -x
参数来执行脚本,如下格式:
bash -x script.sh
如下格式:
#!/bin/bash A="mageu" B="magedu" [[ "$A" == "$B" ]] && echo "字符串相同" || echo "字符串不同"
$0
: 命令行中的脚本名字$1..$9
: 脚本可接受的参数个数$#
: 命令行参数的数量$*
: 所有命令参数,转换为一个字符串$@
: 所有命令参数,转换为一个字符串-d
: 文件是否存在且是目录-e
: 文件是否存在-f
: 文件是否存在且是普通文件-r
: 文件存在且是否可读-s
: 文件存在且不为空-w
: 文件存在且可写-x
: 文件存在且可执行#!/bin/bash # #auther: mage team # read -p "Please Enter Your Chooice: " STR echo "${STR}
unset VAR
VAR=
有如下三种方法:
let i++
expr 1 + 2
$[ 2 + 3]
$(($num1 + $num2))
func_name() { func body ... }
方法二:
function func_name(){ func body ... }
VAR=$(echo "options;expression" | bc)
如下操作步骤
ESC + :
,进入命令模式;set list
使用trap
命令来获取,如下格式:
#!/bin/bash # auther: mage team trap 'echo "quit";exit1' INT
有如下方式:
declare -a NAME
: 申明一个索引数组declare -A NAME
: 申明一个关联数组可以使用如下方式来引用:
${#ARRAY_NAME[*]}
${#ARRAY_NAME[@]}
#!/bin/bash # auther : mage team # file_list=(`ls /www/log/access_log/`) NUM= $[ ${#file_list[*]} - 1 ] echo "$NUM"
有如下两种方式:
$VAR_NAME
${VAR_NAME}
from:http://www.techug.com/25-question-about-bash-shell
Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系.
上面说了Shell是一种编程语言但你可能也听说过: sh/bash/csh/zsh/…它们也叫Shell, 实际上这里所说的Shell是一种应用程序, 它负责解释执行你编写的Shell脚本, Mac默认就自带了sh/bash/csh/zsh/tcsh/ksh, 你可以这样查看cat /etc/shells
不同的shell的用法基本相同, 但有些shell提供了一些新特性, 比如我现在在用的就是zsh, 更多zsh的内容可以去看这篇文章。
#! /bin/sh echo "hello shell!"
依国际惯例这里以在终端里打印一句hello shell!开始, 第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行. 第二行的echo命令则负责向屏幕上输出一句话.
运行shell程序有3种方法:
bash hi.sh
)通常情况下, 最方便的方式就是方式1, 通过方式1执行你需要在脚本第一行写好这段脚本由哪个解释器来解释, 而通过方式2来执行则没有这个限制, 写了也没用.
除此之外方式1与方式2执行命令就没有区别了, 但方式3执行的方式与前两种都不同:
使用source执行shell脚本时, 不会创建子进程, 而是在父进程中直接执行!
这里不作更多解释, 感兴趣的同学可以去参考Linux Shell编程从入门到精通这本书的第一章的相关部分.
和其它语言一样Shell中也有变量, 而且更简单, 但有一些比较特殊的地方.
variable_name=ghui
需要注意: = 两边不能加空格, 当赋值语句包含空格时请加引号(单引号/双引号均可)比如:
variable_name="ghui's blog"
Shell中的变量可以分为两种类型:
local
修饰符)与其它语言一样局部变量的可见范围是代码块或函数内, 全局变量在全局范围内可见.看个简单的例子:
#! /bin/sh num=111 #全局变量 func1() { local num=222 #局部变量 echo $num } echo "before---$num" func1 echo "after---$num"
输出:
before---111 222 after---111
使用一个定义过的变量, 只要在变量名前面加$即可, 如:
name=ghui echo $name echo ${name} #{} 为了帮助解释器识别变量边界, 非必须
在使用变量时还有一个地方需要注意, 请看下面的例子:
#! /bin/sh str='abc' echo "1 print $str" echo '2 print $str'
输出:
1 print abc
2 print $str
即:
被双引号括起来的变量会发生变量替换, 单引号不会
Shell中注释使用#, 而且它不支持多行注释.
name="shell" sayHi="hello, "$name" !" sayHi2="hello, ${name} !" echo $sayHi $sayHi2
注意: 上面说的单双引号引起的变量替换问题
string="abcd" echo ${#string} #输出:4
str="hello shell" echo ${str:2} #输出: llo shell echo ${string:1:3} #输出:ell
更多关于字符串的操作可以看这个
基本语法结构:
if condition then do something elif condition then do something elif condition then do something else do something fi
其中, elif语句和else语句非必须的.看个例子:
#! /bin/sh a=1 if [ $1=$a ] then echo "you input 1" elif [ $1=2 ] then echo "you input 2" else #do nothing echo " you input $1" fi
很简单, 不过这里有两个地方需要注意, 如果某个条件下的执行体为空, 则你就不能写这个条件 即下面这样会报错:
if condition then #do nothing elif condition then # do nothing #or else #do nothing
另外, [ ]
两边一定要加空格, 下面这样都会报错:
if [$a=$b] #or if [ $a=$b] #or if [$a=$b ]
只有这样if [ $a=$b ]
才是对的.
注意: 实际上这里的[]是test命令的一种形式, [是系统的一个内置命令,存在路径是/bin/[
,它是调用test命令的标识, 右中括号是关闭条件判断的标识, 因此下面的两个测试语句是等效的:
if test "2>3" then ... fi
和
if [ "2>3" ] then ... fi
除[]之外, shell语言中还有几种其它括号, 比如: 单小括号/双小括号/双中括号/… , 不同的括号有不同的用法, 更多关于shell中, 括号的用法可以看看这个
当条件较多时, 可以选择使用switch语句, shell中的switch语句的写法和其它语言还是有些不同的, 基本结构如下:
case expression in pattern1) do something... ;; pattern2) do something... ;; pattern2) do something... ;; ... esac
看个例子:
#! /bin/sh input=$1 case $input in 1 | 0) str="一or零";; 2) str="二";; 3) str="三";; *) str=$input;; esac echo "---$str"
这个例子会根据你执行此脚本时传入的参数不同在屏幕上输出不同的值, 其中第一个case 1 | 0
代表逻辑或.
NOTE:
;;
相当于其它语言中的break
)
esac
(即反的case)基本结构:
for name [in list] do ... done
其中,[]括起来的 in list
, 为可选部分, 如果省略in list
则默认为in "$@"
, 即你执行此命令时传入的参数列表.
看个例子:
for file in *.txt do open $file done
遍历当前目录下的所有txt文件, 并依次打开.
基本结构:
while condition do do something... done
看个例子:
#! /bin/sh i=0 while ((i<5)); do ((i++)) echo "i=$i" done
输出:
i=1 i=2 i=3 i=4 i=5
NOTE: 你可能需要去了解一下(())
的用法
基本结构
until condition do do something... done
看个例子:
#! /bin/sh i=5 until ((i==0)) do ((i--)) echo "i=$i" done
输出:
i=4 i=3 i=2 i=1 i=0
shell中也支持break
跳出循环, continue
跳出本次循环.用法与C, Java中相同
要定义一个函数, 可以使用下面两种形式:
function funcname() { do something }
或者
funcname () { do something }
看个例子
#! /bin/sh # ad.sh 计算sum add() { let "sum=$1+$2" return $sum } add $1 $2 echo "sum=$?"
输入
ad 1 2
输出
sum=3
其中, $?
在shell中保存的是上一条命令的返回值
NOTE:
exit
会退出脚本, 如果想退回到原本函数调用的地方, 则可使用return
先shell脚本传递参数, 非常简单, 只需要在你执行命令的后面跟上即可, 看个例子:
#! /bin/sh # test.sh echo "$# parameters"; echo "$@"; echo "$0" echo "$1"
输入:
test.sh 11 22
输出:
2 parameters 11 22 test.sh 11
之所以要写这篇博客, 有以下几个原因:
from:http://ghui.me/post/2016/06/shell-handbook/