命令行的使用

  1. 命令行

(1) $符号在命令中表示引用变量,可以export设置变量。

例如查看环境变量命令:echo $PATH

此处就是通过$引用PATH变量(这是个全局变量)

例如:

d

   

当我们直接敲一个命令的时候,bash就去PATH变量记载的路径中寻找该程序。如果想运行一个自己安装的二进制程序,则需要先加上该命令所在的路径。

(2) man  命令

Man命令时专门解释其他命令的命令

   

2.   这样使用shell

2.1   理解目录结构

  • 可以通过Ctrl  +  Alt  +  F1打开终端,Ctrl  +  Alt  +  F7再回到图形界面

   

2.2   翻旧帐-history命令

如果想查看很久之前输入过的命令,可以用该命令查看。默认情况下显示前1000条命令。也可以指定要显示的命令条数

history N

注:history命令并不像ls命令那样是一个独立的命令,它是一个bash的关键字,也就时说history命令只在特定版本的bash上有用。

   

2.3 more or less——命令的分页显示

[more]

More是一个用来阅读文本的命令,它有分页的功能。他可以从文件或者获取的数据流中先显示一屏,等用户按下回车键的时候再显示下一屏,直到显示完。当然也可以不等显示完直接按q推出。例如查看当前运行的所有进程:

ps -A | more

注意:上述命令中有一个"|"符号。该符号称为管道符,这个符号的意思就是把前一个命令的输出内容交给后一个命令,作为后一个命令的数据输入。上述命令就是把ps -A输出的那一堆字符交给more命令,然后more命令在处理之后按屏幕显示给用户。

[less]

less和more命令实现的功能基本一致,只不过less命令比more命令要强大一些。对于more命令之前看过的东西时不能回头再去看得,只能往下翻页去看,知道看完之后自动退出。而less命令可以用上下箭头来翻阅,并且看完之后是不会自动推出的,一定要按q键退出。

注意:着两个命令都可以直接查看文件

less /文件路径/文件名

   

2.4 通配符

linux使用"*"来代表任意个字符,"?"代表任意一个字符。

   

3. shell编程

3.1 把命令行打包执行

场景:

把一张SD卡插进电脑,然后运行mount命令进行挂载:

sudo mout /dev/sdb1 /mnt/

然后把里面的所有照片拷贝进来

cp /mnt/*.jpg /home/zhanglu/Picture

之后把这些照片压缩放在同一个目录备份:

tar -czvf /home/zhanglu/Backup/pic.tar.gz /mnt/*.jpg

备份完了之后把卡里的文件全部删除:

rm /mnt/*.jpg

最后卸载这个SD卡:

sudo umount /mnt/

如上,每次在拷贝照片的时候都要输入上述好几条命令,比较麻烦,有没有比较简单的批处理方法呢?

【高级批处理——shell脚本】

要写个shell脚本很简单,找个编辑器把上述命令按照顺序拷贝进去保就OK。于是我们写一个这样的文件:

sudo mout /dev/sdb1 /mnt/

cp /mnt/*.jpg /home/zhanglu/Picture

tar -czvf /home/zhanglu/Backup/pic.tar.gz /mnt/*.jpg

rm /mnt/*.jpg

sudo umount /mnt/

然后保存起来随便取个名字:dailybackup.sh。到目前为止这个脚本还不能运行,因为我们还没有赋予他可以运行的权限,执行下面命令赋予可运行权限

chmod +x ./dailybackup.sh

这时候脚本就可以运行了。

注意:shell脚本不要求特定的扩展名,只要是文本文件并且拥有可执行权限就OK.但是我们一般还是以sh结尾。

【灵活的shell脚本】

脚本是完成了,但是比较蛋疼的是我每天打包备份的文件名可能不一样,但是脚本中的写死了。这时候就需要修改一下脚本。

sudo mout /dev/sdb1 /mnt/

cp /mnt/*.jpg /home/zhanglu/Picture

tar -czvf /home/zhanglu/Backup/pic`date %Y%m%d`.tar.gz /mnt/*.jpg

rm /mnt/*.jpg

sudo umount /mnt/

这回脚本中使用了"`"符号,"`"符号的意思是:先执行两个"`"之间的命令,用执行后的输出代替两个"`"之间的内容哦能否,包括"`"本身。

注意:这里的"`"不是单引号" ' ",而是键盘上和"~"位于同一个键的反引号。

上述脚本中的两个反引号的作用就是以年月日的格式打印当前时间。

   

3.2 规范的shell脚本

(1)要有必要的注释,shell脚本中使用"#"作为注释的开头

(2)指明使用的shell

有时候可以看到一个shell脚本的开头是这样的:

#! /bin/bash

"#!"放在一起并且还出现在脚本的第一行那就不是注释啦!这一行的意思时运行这个脚本所需要的shell。

我们linux系统中有很多的shell,比如bash,tcsh,ksh等。这些不同的shell他们的语法以及特性大多时不一样的。因此在运行脚本的时候需要指定用哪个shell。

当然你也可以不加这一样代码,这时候你就要告诉系统你用的时那个shell,例如用bash运行,需要下面的命令:

bash ./dailybackup.sh

   

3.3 使用函数

Shell脚本像大多数编程语言一样,也支持函数。如果有一段代码需要在脚本里面反复执行多次,不必反复的写多份,只需要将他们写成一个函数,需要的时候直接调用就行。比如自动备份的脚本:

#!/bin/bash

#自动备份脚本

dailybackup() {

udo mout /dev/sdb1 /mnt/

cp /mnt/*.jpg /home/zhanglu/Picture

tar -czvf /home/zhanglu/Backup/pic`date %Y%m%d`.tar.gz /mnt/*.jpg

rm /mnt/*.jpg

sudo umount /mnt/

}

dailybackup #调用函数的时候不许要写小括号

   

3.4 在shell脚本中使用变量

(1)用户变量——新手拈来

Shell中的变量比较随意简单,不必声明,随用随写,如下:

value = 28

这就获得了一个内容是28的变量,那么怎么引用这个变量呢?在引用变量的时候需要在变量名称前面加上"$"符号,用来表示这是一个变量。例如:

#! /bin/bash

value = 28

echo value #输出value

echo $ value  #输出28

所以在使用变量的时候前面一定要加上"$",否则就会被当作一般的字符串处理的。

   

不过有时候变量的引用可能会紧跟着字符串,这时候需要进行特殊处理:

#! /bin/bash

word1 = hello

word2 = world

echo $word1BIG$word2

这时候输出的是 helloworld,而不是helloBIGworld。因为系统把$word1BIG当作一个变量的引用了,然而我们根本没有这个变量,因此就会打印空白。如果想让shell理解我们的意图这时候我们可以加上大括号

echo ${word1}BIG${word2}

   

(2)变量类型——只有字符串

在shell脚本中没有整型,浮点型等其他的数据类型,仅仅有字符串。如果要进行数字的数学运算需要使用expr命令

num=1

num=`expr $num + 2`

   

(3)环境变量——在哪儿都能用

上面咱们定义的变量是用户变量,除了自己定义的用户变量之外还有一种变量就是系统变量。比如之前见到的PATH,和HOME变量。

所谓的环境变量有点类似C语言中的全局变量,就是在整个系统中都有效。用户变量就是只在一个脚本中有效。在其他的脚本中无法访问。而系统变量可以在任何地方访问。想要定义一个全局变量也很简单,只要在变量前面加上export:

提示:环境变量在当前会话结束后失效

   

(4)特殊变量——一堆符号

除了用户变量和系统变量外还有其他一些比较特殊的变量,这些特殊变量有以下特征:

  • 看着就比较特殊
  • 脚本执行时自动被设定
  • 不可修改

特殊变量主要就下面这些

  • $n——这里n时一个0~9的数字。这个变量代表了执行脚本所加的第n个参数,n=0代表代表脚本本身的名称
  • $*——这个变量代表执行脚本所加的所有的参数(不包括脚本名称本身)
  • $#——执行脚本所加的变量个数
  • $$——该脚本的PID

   

3.5 shell中的条件判断

(1)if和fi

   

   

   

   

   

posted @ 2015-09-07 14:37  JackDesperado  阅读(484)  评论(0编辑  收藏  举报