认识与学习Bash

BASH是什么?

要了解BASH是什么,首先得知道shell,
应用程序是发展在操作系统上的,用户可以通过应用程序来指挥内核,让内核完成我们所需要的硬件任务,我们知道应用程序其实是在最外层,就如同鸡蛋的壳一样,因此shell就被成为壳程序那么这个壳程序的作用是什么呢,能够操作应用程序的软件都能够被称为壳程序。
狭义的壳程序是指命令行方面的软件比如这次我们要学习的BASH
广义的壳程序则包括图形用户界面模式的软件比如X Window

Linux使用的是什么shell?

我们经常听的Bourne Shell(sh),在Sun里头默认的C Shell,商业上常用的K Shell,还有TCSH等,每一中Shell都各有其特点。至于Linux使用的版本称为[Bourne Again Shell](简称bash),这个Shell是Bourne Shell的增强版本,也是基准于GNU的架构发展出来的。

那么目前我们linux有多少我们可以使用的shell呢,可以检查一下/etc/shells这个文件,至少就有下面这几个可以用的shells
/bin/sh(已经被/bin/bash所代替)
/bin/bash(就是Linux默认的shell)
/bin/ksh(Kornshell由AT&T Bell lab.发展出来的,兼容于bash)
/bin/tcsh(整合C Shell,提供更多的功能)
/bin/csh(已经被/bin/tcsh所替代)
/bin/zsh(基于ksh发展出来的,功能更强大的shell)

Linux默认的Shell使用的是bash。系统上合法的shell要写入/etc/shells这个文件,因为系统某些服务在运行过程中,会检查用户能够使用的shells,而这些shell的查询就是借助/etc/shells这个文件。

BASH的优点是什么

1 历史命令:

我们只需要在命令行按上下键就可以找到前后一个输入的命令,在很多的Linux发行版,默认的命令记录可以达到1000个,几乎你曾经执行的命令都被记录下来了,这多莫命令记录在哪里,在你家目录内的.bash_history.
不过需要留意的是该文件记录的是前一次登录所执行的命令,而这一次登录所执行的命令都被缓存在内存中,当你注销系统后,该命令才会记录到.bash_history当中

2 命令与文件补全功能(Tab按键的好处):

经常在bash环境中使用Tab是个好习惯,因为至少可以少打很多字,并且确定输入的数据是正确的。使用Tab按键实际依据Tab接在命令后或参数后而有所不同。

Tab接在一串命令的第一个字的后面,则为命令补全

Tab接在一串命令的第二个字的后面,则为文件补全

在bash shell下面多按几次Tab会有很大的便捷哟。

3 命令别名设置功能(alias)

Linux中命令的别名使用的是alias。在命令行输入alias就可以知道目前的命令别名。可以通过命令来设置别名:

alias lm='ls –al'

4 程序化脚本(shellscript)
Linux下面的shell则发挥更为强大的功能,可以将你平时管理系统常需要执行的连续命令写成一个文件,该文件并且可以通过交互式的方式来进行主机的检测工作,也可以借由shell提供的环境变量及相关命令来进行设计,这几乎就是一个小型的程序语言了。

5 通配符(Wildcard)
除了完整的字符串外,bash还支持许多的通配符来帮助用户的查询与命令执行。利用通配符,可以加快用户的操作。
比如你想知道/usr/bin下面有多少以X开头的文件吗,就可以使用 ls -l/usr/bin/X*,就可以知道。

查询命令是否为Bash shell的内置命令:type

为了方便shell的操作,bash已经内置了很多命令,如cd,umask等。

可以利用type来查看命令是否内置在bash内。

type [-tpa] name

选项与参数:

  不加任何参数时,type会显示出name是外部命令还是bash的内置命令

  -t:当加入-t参数时,type会将name以下面这些字眼显示出它的意义:

   file:表示为外部命令

   alias:表示该命令为命令别名所设置的名称

   builtin:表示该命令为bash内置的命令功能

   -p:如果后面接的name为外部命令时,才会显示完整文件名

  -a:会有PATH变量定义的路径中,将所有含name的命令都列出来,包含alias

例:

dmtsailstudy ~]$ type cd
cd is a shell  builtin   cd是shell的内置命令

通过type这个命令可以知道每个命令是否是bash的内置命令。由于利用type找到后面的名称时,如果后面接的名称并不能以执行文件的状态被找到,则该名称是不会被显示出来的。即type主要找出执行文件而不是一般文件名。type也可以用来作为类似which命令的用途了。

命令的执行与快速编辑

当输入命令一行放不下,我们要输入\Enter,其中Enter键时紧跟着反斜杠\的,中间没有其他字符。因为\仅转义紧接着的下一个字符而已。如果顺利转义Enter后,下一行最前面就会出现>的符号,可以继续输入命令。

另外,当你所需要执行的命令特别长,或是你输入了一串错误的命令时,你想要快速的将这段令整个删除,一般来说, 我们都是使用删除键。有没有其他的快速组合键可以使用呢?有如下:

[ctrI]+u/(ctrl]+k
分别是从光标处向前删除命令串(ctrl+u)及向后删除命令串(ctrl+k))

[ctr]+a/ctrl]+e
分别是让光标移动到整个命令事的最前面([ctrl]+a) 或最后面([ctrl]+e)

shell的变量功能

变量定义:
变量就是以一组文字或符号等,来替换一些设置或一些保留的数据,例如:我设置了[myname ]就是[ VBird],所以当你读取myname这个变量就会知道,那就是Vbird,那么如何显示变量?这就需要使用到echo这个命令。

变量的显示与设置:echo,unset

变量内容的显示使用echo命令。echo命令显示变量,但是在变量被显示时,前面必须加上字符$才行。

echo $variable
echo $PATH
echo ${PATH}

推荐最后一种方式哈

设置与修改变量

设置变量用等号=连接变量与它的内容即可。

dmtsailstudy ~]$ echo ${myname} 
             显示空,因为没有变量,为空
dmtsailstudy ~]$ myname=VBird

dmtsailstudy ~]$ echo $myname
VBird

在bash当中,当一个变量名称尚未被设置时,默认的内容是空的。同时在变量的设置时,需要符合某些规定,否则会设置失败,具体规则如下:

变量设置规则

1 变量与变量内容以一个等号=来连接,如下所示:
myname=yzhang

2 等号两边不能直接接空格符,如下所示为错误的:
myname = VBird 或 myname=VBird Tsai

3 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
2yz=VBird

4 变量内容若有空格可使用双引号"或单引号’将变量的内容结合起来,但双引号内的特殊字符如$等,可以保持原本的特性,如:
var=“lang is $LANG”,则echo $var,可得"lang is zh_CN.UTF-8"

5 单引号内的特殊字符进位一般字符(纯文本),如下所示:
var=‘lang is $LANG’,则echo $var,可得lang is $LANG

6 可用转义字符 \ 将特殊符号(如Enter,$,\,空格符 ,’ 等)变成一般字符
myname=VBird\ Tsai

7 若该变量为了增加变量内容时,则可用$ 变量名称 或 ${变量}累加内容,如下所示:

PATH=${PATH}:/home/bin

8 若该变量需要在其他子进程执行,则需要以export来使变量变成环境变量:
export PATH
9 取消变量的方法使用“unset变量名称”,如取消myname的设置:
unset myname

子进程:在目前这个shell情况下,去打开另一个新的shell,新的那个shell就是子进程。在一般状态下,父进程的自定义变量无法在子进程内使用。但是通过export将变量变成环境变量后,就能够在子进程下面使用。

变量设置中,要注意一些特殊符号的使用,如单引号,双引号,转义字符,$,反单引号等。

在变量设置当中,单引号与双引号的用途有何不同?

单引号与双引号的最大不同在于双引号仍然可以保有变量的内容,但单引号内仅能是一般字符,而不会有特殊符号。即单引号中,$变量将失去原有的变量内容,仅为一般字符的显示类型而已。

[dmtsailstudy ~]$ name=VBird

[dmtsailstudy ~]$ echo $name

[dmtsai@study ~]$ myname="$name its me"

[dmtsai@study ~]$ echo $myname

[dmtsai@study ~]$ myname= ' $name its me'

(dmtsai@study ~]$ echo $myname

Sname its me

环境变量功能

环境变量可以帮助我们达到很多功能,包括主文件夹的变化,提示符的显示,执行文件查找的路径等。我们可以用env和export命令来查找默认的环境变量

HOME:代表用户的主文件夹

SHELL:告知目前环境使用的shell是哪个程序。Linux默认使用/bin/bash

HISTSIZE:历史命令有关,曾经执行过的命令可以被系统记录下来,而记录的条数由该值设置

MAIL:在使用mail命令收信时系统会去读取的邮件信息文件(mailbox)

PATH:执行文件查找路径,目录与目录中间以冒号(:)分割,由于文件的查找时依序由PATH的变量内的目录来查询,所以目录的顺序也比较重要。

LANG:语序数据。它会主动去分析语系数据文件,如果发现有它无法解析的编码语系,可能会产生错误。

RANDOM:随机数变量。用于获取随机数值。随机数生成器是/dev/random文件,利用这个随机文件相关的变量($RANDOM)来随机取得随机数值。在BASH下,RANDOM变量的内容介于0-32767之间,只要ehco $RANDOM,则系统会主动随机取出一个介于0-32767的数值。取0-9之间的数值,使用如下命令:

dmtsailstudy ~]$ declare –I number=$RANDOM*10/32768;ehco $number

用set查看所有变量(环境变量与自定义变量)

bash可不只有环境变量,还有一些与bash操作接口有关的变量,以及用户自己定义的变量存在。查看变量使用set。set除了环境变量之外,还会将bash内的其他变量全部显示出来。

一般来说,不论是否为环境变量,只要跟我们目前这个shell的操作接口有关的变量,通常会被设置为大写字符,即基本上Linux默认情况下,使用{大写的字母}来设置的变量一般为系统内需要的变量。

变量键盘的读取、数组与声明:read,array,declare

read

要读取来自键盘输入的变量,就是用read这个命令。此命令常被用在shell scripts的编写当中。

read [-pt] variable
参数:

  -p:后面可以接提示符;

  -t:后面可以接等待的秒数。不会一直等待用户。让用户由键盘输入内容,将该内容变成atest的变量
[dmtsai@study ~]$read attest
This is a test      输入
[dmtsai@study ~]$echo $attest 
This is a test

read之后不加任何参数,直接加上变量名称,会主动出现一个空白行,等待输入。如果加上-t后面接描述,则在规定的时间内为输入,该命令将自动略过。加上-p是输入光标前的提示符。

declare/typeset

declare与typeset是一样的功能,就是声明变量的类型。使用declare后面并没有接任何参数,那么bash会主动将所有的变量名称与内容全部调出来,就好像使用set一样。
declare[-aixr] variable
参数:

 -a:将后面名为variable的变量定义成为数组(array)类型
 -i:将后面名为variable的变量定义为整数数字(integer)类型

-x:用法与export一样,就是将后面的variable变成环境变量

-r:将变量设置成为readonly类型,该变量不可被更改内容,也不能重设。
[dmtsai@study ~]$sum=100+300+50
[dmtsai@study ~]$echo $sum 
100+300+50
[dmtsai@study ~]$declare –i sum=100+300+50
[dmtsai@study ~]$echo $sum   
450

默认情况下,bash对于变量的几个基本定义如下:
1 变量类型默认为“字符串”,所以若不指定变量类型,则1+2为一个字符串,而不是计算式,所以上述第一个执行结果为不会计算

2 bash环境中的数值运算,默认最多仅能到达整数类型,所以1/3结果为0

3 如果非字符串类型的变量,就有进行变量的声明才行。

declare是个很有用的功能,当使用数组功能时,它可以帮助声明数组的属性。不过数组在shell script中比较常用。不过如果不小心将变量设置为只读,通常要注销登录才能复原该变量的类型。

数组(array)变量类型

在bash中,数组的设置方式如下:

var[index]=context,即有一个数组名为var,数组内容…。bash提供一维数组。

设置数组变量

[dmtsai@study ~]$var[1]="small"

[dmtsai@study ~]$var[2]="big"

[dmtsai@study ~]$echo "${var[1]}, ${var[2]}"

数组变量的读取,一般建议直接以${数组}的方式来读取,会比较正确无误。

与文件系统及程序的限制关系:ulimit

bash是可以限制用户的某些系统资源的,包括可以打开的文件数量,可以使用的CPU时间,可以使用的内存总量等。具体使用ulimit命令:

ulimit [-SHacdfltu] [配额]

参数:

  -H:hard limit,严格的设置,必定不能超过这个设置的数值

 -S:soft limit,警告的设置,可以超过这个设置值,但是若超过则有警告信息。在设置为100,则可以用到90,但介于80~100之间时,系统会有警告信息通知。

  -a:后面不接任何参数,可以列出所有的限制额度

 -c:当某些进程发生错误时,系统可能会将该进程在内存中的信息写成文件(排错用),这种文件被称为内核文件(core file),此为限制每个内核文件的最大容量

  -f:此shell可以创建的最大文件容量(一般可能设置为2GB)单位为KB

  -d:进程可使用的最大断裂内存容量

 -l:可用于锁定(lock)的内存量

  -t:可使用的最大CPU时间(单位为秒)

  -u:单一用户可以使用的最大进程数量

单一文件系统能够支持单一文件大小与block的大小有关。用ulimit来限制用户可以创建的文件大小。具体使用ulimit –f命令设置。若想复原ulimt的设置,简单方法是注销重新登录,否则重新设置ulimit才行。一般用户如果ulimit设置了文件的大小,那么它只能继续减小文件容量,不能增加文件容量。

命令别名与历史命令

命令别名设置:alias,unalias

通过设置别名,可以在一些命令中增设默认的选项可以预防一不小心误删文件的情况发生。在查询隐藏文件时,需要列出于一页一页的翻看,则需执行ls –all more这个命令。可以使用如下命令

alias lm=‘ls –l | more’

此时会多出一个命令lm,其执行ls –all more。不过注意:alias定义规则与变量的定义规则几乎相同,所以要在alias后面加上你的{“别名”=’命令参数…’}。此时能够比较方便使用命令。

root删除数据,不小心,可能导致误删,故可以设置别名,其中使用rm的-i参数,具体如下:

alias rm=’rm –i‘

获取目前系统所具有的别名,使用alias命令即可。

取消别名,使用unalias命令。

取消刚才的lm命令,使用如下:

unalias lm

命令别名与变量不同:命令别名是新创建一个新的命令,可以直接执行该命令,至于变量则需要使用类似echo的命令才能够调用变量的内容。

历史命令

查询历史命令,使用history命令。

参数:

-n:数字,是要列出最近的n条命令行的意思

-c:将目标的shell中的所有history内容全部消除

-a:将目前新增的history命令新增加到histfiles中,若没有增加histfiles,则默认写入~/.bash_history

-r:将histfiles的内容读到目前这个shell的history记忆中

-w:将目前的history记忆内容写入histfile记忆
[dmtsai@study ~]$ history  列出目前内存的所有history记忆

[dmtsai@study ~]$ history 3   列出目前最近的三条数据

[dmtsai@study ~]$ history –w   立刻将目前的数据写入histfile当中
[dmtsai@study ~]$ echo $HISTSIZE
1000

当以bash登录Linux主机后,系统会主动由家目录的~/.bash_history读取以前曾经下过的命令,那么~./bash_history会记录的数据就与bash的HISTSIZE这个变量设置值有关

假设登录主机后,共执行100次命令,等注销时,系统将101-1100这1000笔的历史命令重新更新到~/.bash_history当中。也就是说历史命令在我注销时,会将最近的HISTSIZE条记录到我的记录文件当中。

可以用history –w强制立刻写入。更新:因为~/.bash_history记录的条数永远都是HISTSIZE,旧的信息会被主动去掉。仅仅保留最新的。

!number     执行第几条命令的意思

!command    最近的命令向前搜索命令串开头为command的那个命令,并执行

!!           执行上一个命令
[dmtsai@study ~]$ !66 执行第66条的命令

[dmtsai@study ~]$ !!   执行上一条的命令

[dmtsai@study ~]$ !al    执行最近的以al开头的命令

同一账号同时多次登录的history写入问题

多个bash执行命令时,最后注销的那个bash才会是最后写入的数据。为了避免之一问题,可以考虑单一bash登录,再用任务管理来切换不同的工作。这样才能够将所有曾经执行过的命令记录下来,才方便将来系统管理员进行命令的debug。

路径与命令查找顺序

基本上命令运行的顺序可以这样看:
1 以相对/绝对路径执行命令,如/bin/ls,或/.ls
2 有alias找到该命令来执行
3 由bash内置的(builtin)命令来执行
4 通过$PATH这个变量的顺序找到第一个命令来执行

设置echo的命令别名为echo-n,然后在查看echo执行的顺序

[dmtsai@study ~]$ alias echo=’ehco –n’

[dmtsai@study ~]$ type –a echo
echo is aliased to 'echo -n'
echo is a shell builtin
echo is /user/bin/echo

看很清楚吧!
先alias(别名),再builtin(内置),在$PATH(环境变量)

通配符与特殊符号

符号意义
*代表0个到无穷多个任意符
代表一定有一个任意字符
[]同样代表一定有一个在中括号内的字符(非任意字符)。如[abcd]代表一定有一个字符,可能是a,b,c,d这四个任何一个

若括号内的第一个字符为指数符号 ^ ,那表示原始方向,如[^abc]代表一定有一个字符,只要是非a,b,c的其他字符就接受的意思。

[dmtsai@study ~]$ ll –d /etc/cron*   找出/etc/下面以cron为开头的文件名,加d是为了显示目录

[dmtsai@study ~]$ ll –d /etc/?????   找出/etc/下面文件名刚好是五个字母的文件名

[dmtsai@study ~]$ ll –d /etc*[0-9]*  找出/etc/下面文件名含有数字的文件名,记得左右两边都需要*

[dmtsai@study ~]$ ll –d /etc/[^a-z]*  找出/etc/下面文件名开头不是为小写字母的文件名,注意左边没有*

[dmtsai@study ~]$ cp –a /etc/[^a-c]* /tmp  找出/etc/下面文件名开头为非小写字母的文件名,并将其复制到/tmp下

bash还有一些特殊的符号

符号意义
#批注符号,这个最常被使用在script当中,视为说明。其后的数据均不执行
\转义符号,将“特殊字符或通配符”还原成一般字符
连续命令执行分割符,连续命令的界定(注意与管道命令并不相同)
~用户主文件夹
$使用变量前导符,即是变量之前需要加的变量替代值
&作业控制(job control),将命令变成背景下工作
逻辑运算意义上的非的意思
/目录符号,路径分割的符号
>,>>据流重定向,输出导向,分别是“替换”和“累加”
<,<<数据流重定向,输入导向
‘ ’单引号,不具有变量置换的功能
“ ”具有变量置换的功能
两个 ` 中间为可以执行的命令,也可以使用$()
( )中间为子shell的起始与结束
{ }在中间为命令块的组合

以上为bash环境中常见的特殊符号。理论上,文件名尽量不要使用上述的字符。

数据流重定向

数据流重定向就是将某个命令执行后应该出现在屏幕上的数据传输到其他的地方,如文件或者是设备(例如打印机之类的)。它在Linux的文本模式下非常重要,尤其是想要将某些数据保存下来时。
标准输出流和标准错误输出流

标准输出指的是命令执行所返回的正确的信息,而标准错误输出可理解为命令执行失败后,所返回的错误信息。

标准输出和标准错误输出的数据都是默认输出到屏幕上,可能导致屏幕混乱。想要将二者分开,可以使用数据流重定向功能。数据流重定向可以将标准输出和标准错误输出分别传送到其他的文件或设备去,而分别传送所用的特殊字符,如下:

标准输入(stdin):代码为0,使用<或<<
标准输出(stdout):代码为1,使用>或>>
标准错误输出(stderr):代码为2,使用2>或2>>

[dmtsai@study ~]$ ll /
                       此时屏幕会显示出文件名信息
[dmtsai@study ~]$ ll / > ~/rootfile   屏幕无任何信息

[dmtsai@study ~]$ ll ~/rootfile       有个新文件建立了

[dmtsai@study ~]$ cat ~/rootfile         原本输到屏幕上的信息输入到了该文件中

该文件的建立方式是

1 该文件若不存在,系统会自动将它创建起来。

2 当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入。

3 若以>输出到一个已存在的文件中,那个文件原本的内容就会被覆盖掉。

如果想要将数据累加而不想要将旧的数据删除,则使用两个大于号>>即可。

输出重定向的适应情况如下:

1 1>:以覆盖的方法将正确的数据输出到指定的文件或设备上

2 1>>:以累加的方法将正确的数据输出到指定的文件或设备上

3 2>:以覆盖的方法将错误的数据输出到指定的文件或设备上

4 2>>:以累加的方法将错误的数据输出到指定的文件或设备上

注意:1>>和2>>中间没有空格。
总结一下就是:>>就是累加,>就是覆盖,1就是正确输出,2就是错误输出。如果仅存在 > 则默认代表1

如何将将正确信息与错误信息分开保存

stdoutstderr分别存在不同的文件夹中
[dmtsai@study ~]$  find /home –name .bashrc > list_right 2> list_err

上面命令便能够实现将标准输出信息与标准错误信息分开保存
找到.bashrc文件,将正确信息存入list_right ,而错误的信息就在list_err

/dev/null垃圾桶黑洞设备与特殊写法

/dev/null可以吃掉任何导向这个设备的信息。

将错误的数据丢弃,屏幕上显示正确的数据
[dmtsai@study ~]$ find /home –name .bashrc 2> /dev/null
上面只有stdout输出显示到屏幕上,stderr将被丢弃

将命令的数据全部写入名为list的文件中
[dmtsai@study ~]$find /home –name .bashrc > list 2>list 错误

find /home –name .bashrc > list 2>&1   正确

find /home –name .bashrc &> list   正确

第一种错误,原因是由于两条数据同时写入一个文件,又没有使用特殊的语法,此时两条数据可能会交叉写入该文件中,造成次序的错乱。虽然文件会产生,但是数据乱乱的。对于写入同一个文件的特殊语法,可以使用2>&1,也可以使用&>,推荐使用前一个。

标准输入:<或<<

标准输入:就是将原本需要由键盘输入的数据改由文件内容代替。可以利用cat命令看键盘输入。

利用cat命令来创建一个文件的简单流程
[dmtsai@study ~]$ cat > catfile(新文件)
testing

[dmtsai@study ~]$ cat catfile
testing

由于加入>在cat后,所以那个catfile会被主动创建,而内容就是刚才键盘上面输入的那两行数据。同时也可以用某个文件的内容来代替键盘的输入。

stdin替代键盘的输入以创建新文件的简单流程
[dmtsai@study ~]$ cat > test1.txt < test.txt

[dmtsai@study ~]$ ll test1.txt  test.txt
-rw-rw-r-- 1 qikaimeng qikaimeng 13 123 09:26 test1.txt
-rw-rw-r-- 1 qikaimeng qikaimeng 13 123 09:25 test.txt

就是将test.txt文件的信息读入到test1.txt 中,类似于cp复制一般
接下来在说说<<这个符号的意思
<<代表的是结束输入的意思。例:要用cat直接将输入信息输出到catfile中,且当由键盘输入eof时,该次输入就结束。

[dmtsai@study ~]$ cat > test.txt << “eof”  输出相关信息 eof表示结束
 >你好世界
 >我很好
 >eof

[dmtsai@study ~]$ cat test.txt
 你好世界 
 我很好

利用<<右侧的控制字符,可以终止一次输入,而不必输入Ctrl + d来结束,对程序有很大的帮助。
小练

假设我要将echo "error message"以标准错误的格式来输出,该如何处置
答:既然有2>&1 来将2>转到1 去,那么肯定存在1>&2 
所以就是
[dmtsai@study ~]$ echo "error message" 1>&2
[dmtsai@study ~]$ echo "error message" 2> /dev/null 1>&2
第一条有信息输出到屏幕上,第二条则没有信息,这表示该信息已经通过2 > /dev/null 丢到垃圾桶里了,可以肯定是错误信息

输出重定向的优点:

1 屏幕输出的信息很重要,而且需要将它存下来的时候。

2 后台执行中的程序,不希望它干扰屏幕正常的输出结果时。

3 一些系统的例行命令(如写在/etc/crontab中的文件)的执行结果,希望它可以存下来。

4 一些执行命令的可能已知错误信息时,想以2>/dev/null将它丢掉时

5 错误信息与正确信息需要分别输出时。

命令执行的判断依据:;,&&,||

当想要用的命令需要一次输入去执行,不想分层执行,有两种方法实现:通过编写脚本shell script去执行,或通过一次输入多重命令实现。

cmd;cmd(不考虑命令相关性的连续命令执行)

命令与命令中间利用分号 ; 来隔开,这样一来,分号前的命令执行完后就会立刻接着执行后面的命令。

如果前一个命令的执行影响后一个命令的是否执行,此时需要是用&&或||完成。

$?(命令返回码)与&&与||

若前一个命令执行的结果为正确,则在Linux下面会回传一个$?=0的值。其中&&与||命令执行情况如下:

命令执行情况说明
cmd1&&cmd21 若cmd1执行完毕且正确执行($?=0),开始执行cmd
2 若cmd1执行完毕且为错误($?!=0),则cmd2不执行
cmd1 || cmd21 若cmd1执行完毕且正确执行($?=0),则cmd2不执行
2 若cmd1执行完毕且为错误($?!=0),则开始执行cmd2

[dmtsai@study ~]$ ls /tmp/abc && touch /tmp/abc/hehe   使用ls查阅目录/tmp/abc是否存在,若存在则用touch创建/tmp/abc/hehe,反之不然

[dmtsai@study ~]$ ls /tmp/abc || mkdir /tmp/abc 测试/tmp/abc是否存在,若不存在则予以创建,若存在就不做任何事件


[dmtsai@study ~]$ ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe 若不清楚/tmp/abc是否存在,但就是要创建/tmp/abc/hehe文件

Linux下面的命令都是由左往右执行的。上面第三个解释如下:
1 (1)若 /tmp/abc 不存在故返回$?≠0,则(2)因为||遇到非为 0的$? 故开始mkdir/tmp/abc,由于mkdir /tmp/abc会成功进行,所以返回$?=0(3)因为&&遇到$?=0故会执行touch /tmp/abc/hehe,最终hehe就被建立了;

2 (1)若/tmp/abc存在故返回$?=0,则(2)因为||遇到0的$?不会进行,此时$?=0继续向后传,故(3 )因为&&遇到$?=0就开始建立/tmp/abc/hehe 了,最终/tmp/abc/hehe 被

管道命令(pipe)

管道命令与连续执行命令是不一样的。

假如想要知道/etc/下面有多少文件夹,可以利用ls /etc来查阅,不过/etc下面的文件太多,导致一口气将屏幕塞满,不知道前面输出内容,可以通过less命令协助,具体执行如下命令:

Ls –al /etc | less

如此,就可以利用less命令来翻看输出信息,比较方便。其中主要用到了管道命令| 。管道命令| 仅能处理经由前一个命令传来的正确信息,即标准输出的信息,对于标准错误并没有直接处理的能力。

在每个管道后面接的第一个数据必定是命令,而且这个命令必须能够接收标准输入的数据才行,这样的命令才是管道命令,如less,more,head,tail等都是可以接收标准输入的管道命令。至于ls,cp,mv等就不是管道命令。因为ls,cp,mv并不会接收来自stdin的数据。即管道命令主要有两个比较主要注意的地方:

管道命令仅会处理标准输出,对于标准错误输出会予以忽略,管道命令必须要能够接来自前一个命令的数据成为标准输入继续处理才行。

选取命令:cut,grep

选取命令:就是将一段数据经过分析后,取出所想要的,或者是经由分析关键字,取得所想要的那一行。注意:一般来说,选取信息通常是针对行来分析的,并不是整篇信息分析的。

cut

这个命令可以将一段信息的某一段切出来,处理的信息是以行为单位的。

参数:
  -d:后面接分割字符,与-f一起使用

  -f:依据-d的分割字符,将一段信息切割成为数据段,用-f取出第几段的意思

  -c:以字符的单位去除固定字符区间

将PATH的内容取出以冒号分隔,找出第五个
[dmtsai@study ~]$ ehco $PATH | cut –d ‘:’ –f 5    第五个

将PATH的内容取出以冒号分隔,找出第三个和第五个
[dmtsai@study ~]$  echo $PATH | cut –d ‘:’ –f 3,5   第三个和第五个

将export输出的信息取得第12字符以后的所有字符串
[dmtsai@study ~]$ export | cut –c 12-

cut主要的用途是将同一行里面的数据进行分解,最常用在分析一些数据或文字数据的时候。有时可以以某些字符当做切割的参数,然后将数据加以切割,以取得所需要的数据。在日志log分析时,此命令较常用,但cut在处理多空格相连的数据时,可能效果不是特别好。

grep

cut是在一行信息当中取出某部分想要的,而grep则是分析一行信息,若当中有我们所需的信息,就将该行拿出来,其语法如下:

参数:

 -a:将二进制文件以txt文件的方式查找数据

 -c:计算找到’查找字符串’的次数

 -i:忽略大小写的不同,所以大小写视为相同

 -n:顺便输出行号

 -v:反向选择,即显示出没有‘查找字符串’内容的那一行

 --color=auto:可以将找到的关键字部分加上颜色显示,好多Linux版本都已经内置了,所以不用加该选项就有颜色

将last当中出现root的哪一行取出来
[dmtsai@study ~]$ last | grep ‘root’

将没有root的行取出
[dmtsai@study ~]$last | grep –v ‘root’

在last的输出信息中,只要有root就取出,并仅取一列
[dmtsai@study ~]$last | grep ‘root’ | cut –d ‘ ‘ –f 1

grep是个很好的命令,它支持的语法很多,可以用在正则表达式中,用来处理的数据很多。

排序命令:sort,wc,uniq

sort命令

sort命令,可以帮助我们进行排序,并可以依据不同的数据类型来排序。如数字与文字的排序就不一样。此外排序的字符与语系的编码有关,因此需要排序,建议使用LANG=C来让语系同一,数据排序比较好。

参数:

-f:忽略大小写的差异,如A与a视为编码相同

-b:忽略最前面的空格符部分

-M:以月份的名字来排序,如JAN,DEC等

-n:使用纯数字进行排序(默认是以文字类型来排序的)

-r:反向排序

-u:相同的数据中,仅出现一行代表

-t:分割符,默认使用Tab键来分割

-k:以哪个区间(field)来进行排序的意思

个人账户记录在/etc/passwd,请将账号进行排序
[dmtsai@study ~]$ cat /etc/passwd | sort

/etc/passwd内容是以:来分割的,以第三列排序
[dmtsai@study ~]$ cat /etc/passwd | sort –t ‘:’ –k 3

利用last将输出的数据仅任取账号,并加以排序
[dmtsai@study ~]$ last | cut –d ‘ ‘ –f 1 | sort

uniq命令

如果排序完成后,想要将重复的数据仅显示一个,做法如下:


参数:

 -i:忽略大小写字符的不同

 -c:进行计数

使用last将账号取出,仅取出账号列,进行排序后仅取出一位
[dmtsai@study ~]$ last | cut –d ‘ ‘ –f 1 | sort | uniq

想要知道每个用户登录总次数
[dmtsai@study ~]$ last | cut –d ‘ ‘ –f 1 | sort | uniq –c

这个命令将重复的东西减少,故可以配置排序的文件处理来减少重复。

wc命令

wc命令用来计算输出信息的整体数据。

参数:

 -l:仅列出行

 -w:仅列出多少字(英文单字)

 -m:多少字符

/etc/man.config里面到底有多少相关的字、行、字符数

[dmtsai@study ~]$ cat /etc/man.config | wc

wc命令在计算文件内容上是非常有用的一个工具组。

双向重定向:tee

tee会同时将数据流送与文件与屏幕(screen):而输出到屏幕是stdout。

参数:

 -a:以累加的方式,将数据加入file当中。

[dmtsai@study ~]$ last | tee last.list | cut –d ‘ ‘ –f1 将last的输出存一份到last.list中去

[dmtsai@study ~]$ ls –l /home | tee ~/homefile | more 将ls的数据存一份到~/homefile同时输出到屏幕上

tee可以让标准输出转存一份到文件内并将同样的数据继续送到屏幕去处理。这样除了可以同时分析一份数据并记录下来之外,还可以作为处理一份数据的中间缓存记录之用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值