命令行
(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 word1BIGword2
这时候输出的是 helloworld,而不是helloBIGworld。因为系统把$word1BIG当作一个变量的引用了,然而我们根本没有这个变量,因此就会打印空白。如果想让shell理解我们的意图这时候我们可以加上大括号
echo word1BIG{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