命令行的使用


命令行
(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
 
   

相关内容