我的Linux私房菜

序幕

在腾讯云买了一年的服务器和域名(henryavery.cn),接下来要正式开始学习Linux操作系统了,在此之前先复习一下计算机概论,也顺便为下次自己装机做准备。

关于linux的东西一点点放进来。


vim

刚开始用 VIM 打开文件的时候,需要从宏观的去了解一下 VIM 这个编辑器。

​ VIM 有四个模式,:

  • 正常模式 (Normal-mode)
  • 插入模式 (Insert-mode)
  • 命令模式 (Command-mode)
  • 可视模式 (Visual-mode)

什么是正常模式(Normal-mode) ?

正常模式一般用于浏览文件,也包括一些复制、粘贴、删除等操作。这时击键时,一些组合键就是 vim 的功能键,而不会在文本中键入对应的字符。

在这个模式下,我们可以通过键盘在文本中快速移动光标,光标范围从小到大是字符、单词、行、句子、段落和屏幕。启动 VIM 后默认位于正常模式。不论是什么模式,按一下 <Esc>键 ( 有时可能需要按两下,插入模式按一下 Esc ,就会切换到正常模式,命令模式或者可视模式下执行完操作以后,就会自动进入正常模式,如果进入命令模式或者可视模式没有执行任何操作,按两下 Esc 即可 )都会进入正常模式。

下面的三个模式都是过键盘上相应的键位去触发的。

什么是插入模式?(Insert-mode)

在正常模式中按下个别字母键(后面会详细介绍),会进入插入模式。

例如按 i 键会进行插入模式。该模式启动以后,就会进入编辑状态,通过键盘输入内容。

什么是命令模式(Command-mode)

在正常模式中,按下(冒号)键或者/ (斜杠),会进入命令模式。在命令模式中可以执行一些输入并执行一些 VIM 或插件提供的指令,就像在shell里一样。这些指令包括设置环境、文件操作、调用某个功能等等。

什么是可视模式(Visual-mode)

在正常模式按下v, V, <Ctrl>+v,可以进入可视模式。可视模式中的操作有点像拿鼠标进行操作,选择文本的时候有一种鼠标选择的即视感,有时候会很方便。

以上是关于 VIM 四种模式的解读,我们在使用 VIM 操作文本的时候,编辑区底部一般都会显示当前处于什么模式下(插入模式会有 INSERT 提示,可视模式会有 VISUAL 或者 VISUAL LINE 的提示)。

当对 VIM 有了感觉之后 ,个人认为 VIM 只有两个模式,便于理解(纯个人见解,用熟 VIM 以后,应该会赞同这个理解):

  • 操作模式
  • 编辑模式

一个好的编辑器我们无非就使用它的两个功能:

1、通过一些快捷键操作编辑器实现我们的功能:复制,黏贴,删除,查询。。。等

2、我们用来编辑,输入内容进入编辑器。

VIM 有一个很重要的按键需要一开始就做出说明,那就是键盘中的 ,这个按键用来切换模式,该按键可以快速切换到正常模式.

这个按键有点特殊,它脱离了主键盘区,每次操作这个按键的时候都会有些蛮烦。估计很多使用 VIM 的人都会有这个痛点,因此有了一个解决方案,control + [ 这两个按键取代 <ESC>

曾经很长一段时间我都是用 control + [ 用来取代 <ESC> ,但是还是感觉有些难受?

VIM 有一个配置文件,在 linux 系统中,该配置文件是 .vimrc , 该文件位于 ~ 目录下面 (~ 目录是家目录,也就是用户目录,不了解的可以科学上网查询),是一个隐藏文件,如果该文件不存在可以手动创建一个。

.vimrc 可以有很多配置,例如显示行号,快捷键配置,插件配置等等。VIM 很多个性化的设置都离不开这个配置文件。zempty 认为 .vimrc 有一个特别重要的配置,那就是配置如下的一行:

 #将ESC键映射为两次j键                                      
inoremap jj 

这个配置是将 功能键用 jj (连续按两次 j) 来取代。这个配置可以很大程度提高 VIM 的使用效率,下文的讲解 zempty 都会用 jj 来取代键盘上的

用 VIM 打开文件

如何用 VIM 去打开一个文件呢?

现在假如有一个文件 file1 ,只需要在文件前面加上 vim 关键字就好:

vim file1

上面这个命令将会打开 file1 这个文件,file1 是指你具体操作的文件名。

如何用 VIM 一次性打开多个文件呢?

现在有多个文件 file1 ,file2 , … ,filen.

现在举例打开两个文件 file1,file2

vim file1 file2

该方式打开文件,显示屏默认显示第一个文件也就是 file1,如何进行文件间的切换呢?VIM 的正常模式下(参考上文关于正常模式的描述)按下键盘上的冒号 这时会在显示屏底部出现冒号 (进入了 VIM 的命令模式),然后在输入 ls ,屏幕上会出现打开的所有文件的序号和文件名,我们继续输入冒号 ,然后输入 bn (这里的 n需要做一个解释并不是键盘上的 n ,而是文件序号的代指,如 b1 代表显示屏上切换到第一个文件,b2 代表显示屏上切换到第二个文件)。

:ls

上面这个命令将会列出 VIM 打开的所有文件。

:b2

上面的这个命令将会在显示屏上显示第二个文件。

如何在显示屏上一次性显示多个文件呢?

VIM 可以实现分屏操作,一个屏幕被多个文件给分占,有左右和上下两种分屏的方式。

左右分屏如下操作:

vim -On file1  file2  ...  filen

这里的 n ( n 是要打开的具体文件的数目:1,2,3 …)是代表有几个文件需要分屏,从左至右依次显示 n 个文件。

上下分屏如下操作:

vim -on file1 file2 ... filen

这个命令跟上一个命令不同的是其中的参数 -on( n 是要打开的具体文件的数目:1,2,3 …) 中的 o 是小写,这样将会上下依次显示 n 个文件。

VIM 如何进行分屏操作呢?

请记住一个重要的组合键 Ctrl + w ,操作分屏离不开这个组合键(这里的组合键可没有 + ,只是 Ctrl 和 w 组合实现一个动能,下文谈到的组合健都这样描述 )。

按住组合键 Ctrl + w ,然后在按下 s

Ctrl + w  s

上面这个命令将会上下分割当前打开的文件。

按住冒号,紧接着输入 sp ,在键入文件名,如下:

:sp file

上面的这个命令将会上下分割当前文件和新打开的 file 。

按住组合键 Ctrl + w ,然后在按下 v

Ctrl +w  v

上面的这个命令将会左右分割当前的文件

按住冒号 ,紧接着输入 vsp ,在键入文件名称,如下:

:vsp file

上面的这个命令将会左右分割当前打开的文件和新打开的文件 file 。

分屏以后如何在文件间切换光标,和移动分屏?

1.切换左右分屏的光标 :

Ctrl + w h 

将当前光标定位到左边的屏幕

Ctrl + w l

将当前的光标定位到右边的屏幕

2.移动左右分屏 :

Ctrl + w H

将当前的分屏移动到左边

Ctrl + w L 

将当前的分屏移动到右边

3.切换上下分屏的光标 :

Ctrl + w j

将当前的光标移动到下面的分屏

Ctrl + w k

将当前光标移动到上面的分屏

4.移动上下分屏:

Ctrl + w J

将当前的分屏移动到下面的分屏

Ctrl + w K

将当前的分屏移动到上面的分屏

如何关闭分屏呢?

Ctrl + w c 

上面这个命令是关闭当前的分屏

Ctrl + w q 

上面的这个命令也是关闭当前的分屏,如果是最后一个分屏将会退出 VIM 。

VIM 的退出

VIM 的最终操作就是 VIM 的退出,如何进行 VIM 的有效退出呢?下面针对 VIM 的退出来做一下说明:

:w 

保存当前对文件的修改,但是不退出文件。

:w!

强制保存但是不退出文件。

:w file

保存当前的文件修改到 file 文件当中。

:q!

退出文件,对文件的修改不做保存。

:qa!

退出所有的文件,对所有的文件修改都不做保存。

:wq

退出文件并保存对文件的修改。

:x

退出文件并保存对文件的修改。

:e file

打开另一个文件。

:e!

放弃对文件的所有修改,恢复文件到上次保存的位置。

:saveas file

另存为 file。

:bn` 和  `:bp

当打开多个文件的时候可以输入 :bn:bp 进行上一个文件或者下一个文件的切换。

以上的命令都是在命令行模式下的操作(也就是输入冒号 紧接着输入相应的字符命令如 :q! 就会执行退出操作)。 zempty 在这里要推荐一个常用的操作就是 ZZ , 当你对文件进行了修改,需要保存退出,那么可以在键盘上快速的键入两个大些的 Z (ZZ),这样文件就会快速的保存退出了 。

VIM 的输入模式

编辑器的主要功能就是输入文本,编辑文本,很多编辑器在打开文件的时候就可以通过键盘录入文字,但是 VIM 有稍许的不同,刚刚接触 VIM 的时候是很难对 VIM 进行编辑操作的,记得我在刚接触它的时候是很崩溃的(千万个草泥马在内心奔腾),但是你接触久了,了解的多了,也就理解如此设计的美妙之处。

如何使用 VIM 编辑文本?

这里有必要再强调一下,在使用 VIM 打开文件的时候,这时候的状态是正常模式(Normal-mode),请务必记住这个模式,如果你不确定当前是否处在正常模式,请连续按两下键盘上的 jj (这个 jj 需要读者去做相应的配置,上文有做过讲解),VIM 处理编辑文本需要从正常模式(Normal)切换到插入模式(Insert-mode),进入插入模式的时候你应该会在屏幕底部看到 INSERT 的提示,这时候就可以编辑文本了。

如何从正常模式进入插入模式呢?

请记住下面几个常用启动录入文本的键盘字符 i,I,a,A,o,O,s,S

i是在光标所在的字符之前插入需要录入的文本。

I 是在光标所在行的行首插入需要录入的文本。

a 是在光标所在的字符之后插入需要录入的文本。

A 是在光标所在行的行尾插入需要录入的文本。

o 是光标所在行的下一行行首插入需要录入的文本。

O 是光标所在行的上一行行首插入需要录入的文本。

s 删除光标所在处的字符然后插入需要录入的文本。

S 删除光标所在行,在当前行的行首开始插入需要录入的文本。

还有一个可能经常用到的就是 cw ,删除从光标处开始到该单词结束的所有字符,然后插入需要录入的文本(这个命令是两个字符的合体 cw )。

VIM 的命令模式

关于命令模式上文有提到过,下面主要来列举几个常用的命令模式操作(命令输入完以后,需要按下 Enter 键去执行命令):

文本的行号设置最好不要设置在配置文件中(因为复制文件的时候行号的出现会很麻烦),在命令行实现就好

:set nu

该命令会显示行号。

:set nonu

该命令会取消行号。

:n

定位到 n 行。

VIM 进行关键字的查找。

/{目标字符串}

如:/zempty 会在文本中匹配 zempty 的地方高亮。

查找文本中匹配的目标字符串,查到以后,输入键盘上的 n 会去寻找下一个匹配,N 会去寻找上一个匹配。

VIM 处理大小写的区分

:set ic

编辑器将不会区分大小写,如果你进行该设置之后,进行关键字查询如 /zempty 如果文本中有 Zempty ,zEmpty,….,只要是字符相同不会区分大小写都会进行匹配。

:set noic

区分大小写的查询。

VIM 删除多行文本

:n1,n2d

n1 和 n2 指的是起始行号和结束行号,d 是删除关键字

VIM 处理文本的替换

:{作用范围}s/{目标}/{替换}/{替换的标志}

作用范围分为当前行、全文、选区等等。

:s/zempty/handsome/g

将会把当前光标所在行的 zempty 替换成 handsome

:%s/zempty/handsome/g

将会把全文中的 zempty 替换成 handsome

:n1,n2s/zempty/handsome/g

这里的 n1 和 n2 值得是行号,将会替换掉 n1 到 n2 的所有 zempty 为 handsome.

选区,在可视模式下选择区域后输入:,VIM 会自动补全为 :'<,'>

:'<,'>s/zempty/handsome/g

这个操作咋一看起来有点懵逼,这个操作是可视模式 (Visual-mode) 下选区中的替换操作(可视模式下文会谈到),可视模式下输入会自动补全 :'<,'> 这个是可视范围下的操作范围,类似于 % 和 n1,n2,代表操作的文本范围,上面的例子就是替换掉可视区域的 zempty 为 handsome。

下面来谈谈替换的标志。

上文中命令结尾的 g即是替换标志之一,表示全局 global替换(即替换目标的所有出现)。 还有很多其他有用的替换标志:

空替换标志表示只替换从光标位置开始,目标的第一次出现

:s/zempty/handsome

作用于当前行,从光标处开始查找替换,仅仅替换第一次匹配 zempty 的地方为handsome 。

:%s/zempty/handsome

替换掉文件中所有行第一次出现 zempty 的地方为 handsome 。

i 表示大小写不敏感查找,I 表示大小写敏感:

:%s/zempty/handsome/i

替换掉所有行第一个出现 zempty (不区分大小写) 为 handsome 。

:%s/zempty/handsome/gi

替换掉所有行出现 zempty (不区分大小写) 为 handsome 。

c 表示需要确认,例如全局查找”zempty”替换为”handsome”并且需要确认:

:%s/zempty/handsome/gc

VIM 执行 Linux 命令

:!command

: 后面紧跟着 !! 后面紧跟着 linux 命令( command 指操作 Linux 系统的一系列命令,如创建文件,新建文件夹,查询文件的属性的等),例子如下,

 :!date

执行 date 命令显示时间,执行完命令以后按下键盘上的 Enter 就会返回到文件。

VIM 执行命令,并且添加结果至操作文本光标处

:r !command

: 后面紧跟着 r , r 后面是空格,紧接着是 !command( command 解释同上),例子如下,

:r !date 

执行 date 命令显示时间,并且添加命令结果到文本中。

定义快捷键

下面举例说明:

:map ^M I#<ESC>

上面的例子也就是通过快捷键 Ctrl + m 在文件光标处所在行的行首插入 # ( # 代表注释)。

: 后面的 map 是关键字 ,后面是 key 和 value 。

key 对应的是 ^M , 这个 key 需要强调一下 ^M 是 Ctrl + v + m 打出来的(按下这三个键,VIM 会显示成 ^M ),^M 代表快捷键是Ctrl + m , Ctrl + v + n 就是 ^N ,代表快捷键是 Ctrl + n 。Ctrl + v + x 就是 ^X (这里的 x 是代表 26 个字母中的任意一个) 代表快捷键 Ctrl + x

value 对应的是 I#<ESC>,表示按下快捷键以后执行的相应操作,I 是切换光标至行首并切换到编辑模式,#是行首输入的内容( # 是VIM 文件中的注释符号 ),<ESC> 是退出编辑模式。

举例如下:

:map ^D Ahelloworld<ESC>表示在文件的光标所在行的行尾,添加 helloworld 字符串,按住组合键 ctrl + d 就会执行操作。

使用 ab

:ab email kickcodeman@gmail.com

: 后面的 ab 是关键字 ,该命令执行后,然后切换到编辑模式下,输入 email 会把输入的 email 自动替换成 kickcodeman@gmail.com

这个命令主要是处理频繁输入同样的长串字符串。

VIM 的正常模式(Normal-model)

VIM 正常模式下,主要进行的操作有光标的移动,复制文本,删除文本,黏贴文本等。

快速移动光标

几个重要的快捷键

请记住这几个快捷键 h,j,k,l 这几个按键主要是用来快速移动光标的,h 是向左移动光标,l 是向右移动光标,j 是向下移动光标,k 是向上移动光标,h , j , k ,l 在主键盘区完全可以取代键盘上的 ↑ ,↓ ,← , → 的功能。

在当前行上移动光标

0 移动到行头

^ 移动到本行的第一个不是 blank 字符

$ 移动到行尾

g_ 移动到本行最后一个不是 blank 字符的位置

w 光标移动到下一个单词的开头

e 光标移动到下一个单词的结尾

fa 移动到本行下一个为 a 的字符处,fb 移动到下一个为 b 的字符处

nfa 移动到本行光标处开始的第 n 个 字符为 a 的地方(n 是 1,2,3,4 … 数字)

Fafa 一样,光标移动方向同 fa 相反

nFanfa 类似,光标移动方向同 nfa相反

ta 移动光标至 a 字符的前一个字符

nta 移动到第二个 a 字符的前一个字符处

Tata 移动光标方向相反

nTanta 移动光标方向相反

;, 当使用 f, F, t ,T, 关键字指定字符跳转的时候,使用 可以快速跳转到写一个指定的字符,, 是跳到前一个指定的字符

跨行移动光标

nG 光标定位到第 n 行的行首

gg 光标定位到第一行的行首

G 光标定位到最后一行的行首

H 光标定位到当前屏幕的第一行行首

M 光标移动到当前屏幕的中间

L 光标移动到当前屏幕的尾部

zt 把当前行移动到当前屏幕的最上方,也就是第一行

zz 把当前行移动到当前屏幕的中间

zb 把当前行移动到当前屏幕的尾部

% 匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上

*# 匹配光标当前所在的单词,移动光标到下一个(或者上一个)匹配的单词( * 是下一个,# 是上一个)

翻页操作

ctrl+f 查看下一页内容

ctrl+b 查看上一页内容

VIM 的复制,黏贴 ,删除

三个重要的快捷键 d , y , p

d 是删除的意思,通常搭配一个字符 ( 删除范围 ) 实现删除功能,常用的如下:

dw 删除一个单词

dnw 删除 n 个单词,

dfa 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )

dnfa 删除光标处到第 n 个 a 的字符处

dd 删除一整行

ndd 删除光标处开始的 n 行

d$ 删除光标到本行的结尾

dH 删除屏幕显示的第一行文本到光标所在的行

dG 删除光标所在行到文本的结束

y 是复制的意思,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:

yw` 复制一个单词,还有 `ynw
yfa` 复制光标到下一个 a 的字符处,还有`ynfa
yy` 复制一行,还有 `nyy

y$ 复制光标到本号的结尾

yH 复制屏幕显示的第一行文本到光标所在的行

yG 复制光标所在行到文本的结束

pP是黏贴的意思,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来。

p 在光标后开始复制

P 大写的 P 光标前开始复制

撤销操作和恢复

u 撤销刚才的操作

ctrl + r 恢复撤销操作

删除字符操作和替换

x 删除光标当前所在的字符

r 替换掉光标当前所在的字符

R 替换掉从光标开始以后的所有字符,除非 <ESC > 退出,或者 jj (代替 上文有提到)退出。

大小写转换

~ 将光标下的字母改变大小写
3~ 将光标位置开始的3个字母改变其大小写
g~~ 改变当前行字母的大小写
gUU 将当前行的字母改成大写
guu 将当前行的字母全改成小写

3gUU 将从光标开始到下面3行字母改成大写
gUw 将光标下的单词改成大写。
guw 将光标下的单词改成小写

VIM 的重复命令

. 该命令是重复上一个操作的命令
n重复某个命令 n 次,
如 10p复制 10 次,10dd 删除十次。

VIM 可视化模式(Visual-mode)

v,V,Ctrl+v

v字符可视化,按下键盘上的v以后,屏幕底部应该会有一个 VISUAl 的提示,操作 h,j,k,l就选中文本,继续按 v 退出可视化模式。

V 行可视化,按下键盘上的 V 以后,屏幕底部应该有一个 VISUAL LINE 的提示,操作 j,k 可以向上或者向下以行为单位选中文本,继续按下 V 退出可视化模式。

Ctrl+v 块状可视化,按下键盘上的 Ctrl+v 以后,屏幕底部应该会有一个提示 VISUALBLOCK ,可以通过 h,j,k,l 块状的操作选择区域,这是很多编辑器都不可以做到的,继续按下 Ctrl+v 会退出可视化模式。

可视化模式下操作文本

可视化模式下选择操作区域以后,
按下 d会删除选择的区域,
按下 y 会复制选择的区域,按下 p 会黏贴选择的区域。

可视化模式下 v 的特殊操作

当操作的文本光标在 “”,‘’ ,(),{} ,[(双引号,单引号,小括号,大括号,中括号)
当中的时候,可以通过 va”选中 ”“ 内的所有内容包括双引号 ,vi” 选中 “” 内的所有内容,不包括 “”。va,vi 会快速选择区域,va 后面会紧跟一个区域结束标志,a 会选中结束符标志,i 就不会。例子如下:

“hello world [VIM is so strong],{we all can master vim skill}”

假设当前光标定位在上面的文本 M 处:
va] 操作将会选中以下文本(加粗部分):
“hello world [VIM is so strong],{we all can master vim skill}“
vi] 操作将会选中如下的区域,没有包含 []:
“hello world [VIM is so strong],{we all can master vim skill}“

块区域下的特殊操作

Ctrl+v 选中块区域以后,按下大写的 I 或者 A 可以在区域的前面或者后面输入内容,按下 jj 或者 ,可以看到选中的区域前面或者后面会有输入的内容。

VIM 的代码提示功能

在编辑模式下 ,快捷键 Ctrl+n 或者 Ctrl+p 会有代码提示功能,我们可以实现快速录入的效果。

VIM 的宏录制

假设需要操作的文本如下,需要将如下的多行文本的首行键入一个 tab 键。

hello
hello world
hello world , vim

宏录制的录制操作

先将光标移动到第一行,在普通模式下按下 q 键(宏录制是 q 键启动的),在按一个 a (字母随意),表示该宏注册为 a ,按下 I 在行首插入一个 tab 键,按下jj或者 退出编辑模式,按下 j 将光标移动到下一行行首,最后按下 q 键完成录制操作(宏录制是 q 键结束的)。
总结上面例子的操作流程:
q → a → I → tab → jj → j → q
上面的例子成功地把在行首插入 tab 的功能录制了下来,那么如何应用到其他行呢?

宏录制的使用

上述的例子,在正常模式下,按 @a执行宏录制的一系列动作,将会在第二行执行插入 tab 。
@@ 是对上一次宏使用的重复操作。n@a 就会执行 n 次一系列的动作。使用宏录制可以一次执行一系列的操作,可以针对一些重复度较高的操作进行宏录制。

结束

文章篇幅稍长,看到这里也是挺有耐心的,VIM 的学习重在实践,需要经常复盘,时间久了,也就有了使用 VIM 的技能。文中提到的操作都是 VIM 常用的基本操作,VIM 还可以针对个人需求进行各种插件的安装,针对不同开发语言都有相应的插件支持,学习完本文推荐再看一下这篇文章 关于 vim 你应该理解的几个名词,在此恭喜你入坑 vim, 就到这里了,结束 !!!

Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。


运行Shell

#!/bin/bash
echo “Hello World !”

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

echo 命令用于向窗口输出文本。

运行 Shell 脚本有两种方法:

1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成echo “I am good at $skillScript”,解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号,这是个好的编程习惯。

已定义的变量,可以被重新定义,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

这样写是合法的,但注意,第二次赋值的时候不能写

$your_name="alibaba",使用变量的时候才加美元符($)。

shell常用内部变量

预定义变量和环境变量相类似,也是在Shell一开始就定义的变量,不同的是,用户只能根据shell的定义来使用这些变量,所有预定义变量都是由符号“$”和另一个符号组成。 常见的Shell预定义变量有以下几种。

$# :位置参数的数量
$* :所有位置参数的内容
$? :命令执行后返回的状态,0表示没有错误,非0表示有错误
$$ :当前进程的进程号
$! :后台运行的最后一个进程号
$0 :当前执行的进程名
————————————————
版权声明:本文为CSDN博主「谢公子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36119192/article/details/82964713

文件测试操作符

常用文件测试操作符 说明
-d , d的全拼为 directory 文件存在且为目录则为真
-f , f的全拼为 file 文件存在且为文件则为真
-e , e的全拼为 exists 文件存在则为真
-s ,s的全拼为 size 文件存在且大小不为0则为真
-r ,r的全拼为 read 文件存在且可读则为真
-w ,w的全拼为write 文件存在且可写则为真
-x ,x的全拼为executable 文件存在且可执行则为真
-L ,L的全拼为link 文件存在且为链接文件则为真
f1 -nt f2 ,nt的全拼为 newer than 文件f1比文件f2新则为真
f1 -ot f2 ,ot的全拼为older than 文件f1比文件f2旧则为真
————————————————
版权声明:本文为CSDN博主「谢公子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36119192/article/details/82964713

反引号

for v in `ls`
> do
> echo $v
> done

Shell 注释

# 开头的行就是注释,会被解释器忽略。

通过每一行加一个 # 号设置多行注释,像这样:

#--------------------------------------------
# 这是一个注释
# author:菜鸟教程
# site:www.runoob.com
# slogan:学的不仅是技术,更是梦想!
#--------------------------------------------
##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
# 
#
##### 用户配置区 结束  #####

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?

每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

多行注释

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF 也可以使用其他符号:

:<<'
注释内容...
注释内容...
注释内容...
'

:<<!
注释内容...
注释内容...
注释内容...
!

$* 与 $@ 区别:
  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 “ * “ 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

Shell echo命令

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:

echo string

您可以使用echo实现更复杂的输出格式控制。

1.显示普通字符串:

echo "It is a test"

这里的双引号完全可以省略,以下命令与上面实例效果一致:

echo It is a test

2.显示转义字符

echo "\"It is a test\""

结果将是:

"It is a test"

同样,双引号也可以省略

3.显示变量

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name 
echo "$name It is a test"

以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:

[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

4.显示换行

echo -e "OK! \n" # -e 开启转义
echo "It is a test"

输出结果:

OK!

It is a test

5.显示不换行

#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"

输出结果:

OK! It is a test

6.显示结果定向至文件

echo "It is a test" > myfile

7.原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'

输出结果:

$name\"

8.显示命令执行结果

echo `date`

注意: 这里使用的是反引号 `, 而不是单引号

结果将显示当前日期


Shell test 命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。


数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

另外,Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。


Shell流程控制

Shell 函数

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

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

[ function ] funname [()]

{

    action;

    [return int;]

}

说明:

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

资料

CSDN的Linux中编写Shell脚本

菜鸟教程shell

Shell 在线工具


   转载规则


《我的Linux私房菜》 Henry-Avery 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录