Linux基础知识整理[5]——Bash

来源:互联网 发布:网络尖兵软件下载 编辑:程序博客网 时间:2024/05/20 03:42

Bash

什么是shell:基本上,替我们工作的是硬件,而控制硬件的是核心,用户是利用Shell控制kernel提供的工具(Utility)来操控硬件正确工作。进一步来说,由于kernel听不懂人类语言,而人类也没有办法直接使用kernel的语言,所以两者的沟通就得藉由shell

BASH是GNU计划中重要的工具软件之一,目前也是GNU操作系统中标准的shell,它主要兼容于sh,并依据一些用户需求而加强,可以说目前几乎所有的Linux版本都是使用bash作为管理核心的主要shell.

BASH主要的优点:

①命令编辑能力: 它能记忆使用过的指令,您只要在命令行中按上下键就可以找到输入的前一个指令.记录的文件在根目录的.bash_history下。记录的是上一次登入以前执行过的指令,至于这一次登入执行的指令都被暂存在内存中.

②补全功能:

指令补全:用在执行命令时不想按太多按键的时候。例如指令pcprofiledump够长,如果在输入pcprofile之后按下Tab键,bash马上会自动将后面的dump接上来。如果有重复的指令,按下两次Tab将会把所有重复的指令都列出来。

文件名称补全:如果您用vi读取某个文件,例如/etc/man.config,可以在输入vi /etc/man.之后直接按下Tab键,那么该文件名称会被自动补全。

③命令别名: 要实现自定义命令可以使用alias,在命令行输入alias就可以知道当前的命令别名都有哪些。也可以直接输入下列命令来设定别名:

    alias lm='ls -al'

④作业控制、前景背景控制;

⑤Shell scripts 的强大功能;

 

输入指令的方式:

[root@test /root]# command [-options]parameter1 parameter2 ...

指令 选项 参数(1) 参数(2)

1. command为指令的名称,例如变换路径的指令为cd

2. 中括号[]并不存在于实际的指令中,在加入参数时,通常为“-”符号,有时候完整名称会输入“--”符号。例如ls --help

3. parameter1 parameter2为依附在option之后的参数,或者是command的参数

4. command, -options, parameter1这几项之间以空格分隔,不论空几格shell都视为一格

5. 指令太长的时候,可以使用 \ 符号来跳转Enter,使指令连续到下一行

实例:

[root@test /root]# ls -al /root

以ls列出/root目录中的隐藏文件与相关的属性参数

[root@test /root]# ls –al /root \

> /

上面这两行实际上是一行指令,但是加上 \ 跳转符号后,指令可以连续到下一行。请注意,\字符之后直接按下enter就可以,不可在后面接空格符

[root@test /root]# ls -al /root

这个指令与第一个相同,空格符不论几个,仅视为一个来处理

 

变量与变量的设定

Linux系统预设变量名称前会加一个$符号:

[root @test root]# echo $PATH

/bin:/sbin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin

env指令:基本上,在Linux默认情况下,使用{大写字母}设定的变量一般都是系统的预设变量, 简单地使用env指令就可以列出所有环境变量。

set指令:set的使用方法就是直接输入set。它除了会显示当前的环境变量,也会显示您的自定义变量。

?变量:如果您上一个命令执行过程中没有发生错误,那么这个变量会被设为0,如果上个命令出现错误信息,那么这个变量会变成1。

     echo $?

$变量:当前shell的PID;

 

设定变量的规则:

1. 变量与变量内容以等号“=”连结;

2. 等号两边不能直接接空格符;

3. 变量名称只能是英文字母与数字,其中数字不能是开头字符;

4. 若有空格符,可以使用双引号或单引号将变量内容结合起来,但要特别留意,双引号内的特殊字符可以保留变量特性,单引号内的特殊字符则仅为一般字符;

5. 必要时以转义字符“\”将特殊符号(如Enter,$,\,空格符,'等)变成一般符号;

6. 在一串指令中,还需要借助其他指令提供的信息,这时可以使用quote“` command`”;

7. 若该变量为扩增变量内容时,则需以双引号及$变量名称(如"$PATH":/home)继续累加内容;

8. 若该变量需要在其他子程序执行,则以export使变量可以动作,如export PATH;

9. 通常大写字符为系统预设变量,自定义变量可以使用小写字符,方便判断(纯粹依照用户兴趣与嗜好);

10. 取消变量的方法为:unset变量名称。

一般变量设定:

[root @test root]# 12name=VBrid <==错误。因为变量开头不能是数字

[root @test root]# name = VBird <==错误。因为等号两边不能直接接空格符

[root @test root]# name=VBird <==正确。echo$name显示VBird

[test @test test]# name=VBird name <==错误。需要加双引号

[test @test test]# name="VBirdname" <==正确。

[test @test test]# name="VBird'sname" <==正确。

[test @test test]# name=’VBird’s name’<==错误。因为有3个单引号

[test @test test]# name=VBird\’s\ name <==正确。

变量累加设定:

[test @test test]# name=$nameisme <==错误。需要用双引号将原变量圈起来

[test @test test]#name="$name"isme <==正确。

[test @test test]#PATH="$PATH":/home/test <==正确。

[test @test test]#PATH="$PATH:/home/test" <==正确。这个形式对于PATH来说也是正确的格式

变量延伸到下一个子程序:

[test @test test]# name="VBird'sname" <==设定name变量

[test @tset test]# echo $name <==显示name变量的指令

[test @test test]# VBird's name

[test @test test]# /bin/bash <==另开一个bash的子程序

[test @tset test]# echo $name <==显示name变量

[test @tset test]# <==会显示空字符串,因为name这个变量不能用在子程序

[test @test test]# exit <==退出子程序bashshell

[test @test test]# export name <==正确。如此则$name可以用于下一个子程序中

指令中的指令:

[test @test test]# cd /lib/modules/`uname–r`/kernel

上式中,会先执行`uname –r`这个内嵌的指令,然后输出结果附加在/lib/module… 中,所以,执行这个指令可以完成几个附指令程序

取消变量设定:

[test @test test]# unset name

单引号与双引号的最大不同在于双引号仍然可以保留变量的内容,但单引号内仅能是一般字符,而不会有特殊符号

[root @test root]# name=VBird

[root @test root]# echo $name

VBird

[root @test root]# myname="$name itsme"

[root @test root]# echo $myname

VBird its me

[root @test root]# myname='$name its me'

[root @test root]# echo $myname

$name its me

 

quote:在一串指令中,在 ` 之内的指令将被首先执行,而其执行结果将作为外部的输入信息。

cd /lib/modules/`uname –r`

export 变量:在引用他人的文件或其他程序时,export相当重要,尤其在需要两三个文件互相引用时,如果忘记设定export,那么不同文件中的相同变量值将需要一再地重复设定。所以,只要在头一个文件使用export,那么后续的文件引用该变量时,将会自动读取该变量内容。

 

history指令配合“!”的用法:

[test @test test]# history

[test @test test]# [!number] [!command][!!]

number :第几个指令

command :指令的开头几个字母

! :上一个指令

[test @test test]# history <==底下列出的就是(1)历史指令的编号;(2)指令的内容

66 man rm

67 alias

68 man history

69 history

[test @test test]# !66 <==执行第 66 个历史指令

[test @test test]# !! <==执行上一个指令(在本例中,就是 !66指令)

[test @test test]# !al <==执行最近一次以 al 为开头的指令内容,就是第 67 个指令

 

bash shell 的配置文件

在命令行输入的变量也好、命令别名也罢,都只是针对该次登入的设定,所以,只要您注销,那么上次的设定值就会不见了。

系统设定值

/etc/profile:这个文件设定了几个重要变量,例如PATH、USER、MAIL、HOSTNAME、HISTSIZE、umask等,也同时规划出/etc/inputrc 这个针对键盘热键设定的文件数据内容;

/etc/bashrc:这个文件用于规划umask,同时规划提示符的内容;

/etc/man.config:这个文件指定了输入man时查看数据的路径设定;

通常设定完这几个文件之后,需要先注销再登录后才会启动设定。

个人设定值

~/.bash_profile:里面定义了个人路径(PATH)与环境变量的文件名称。可以在这里修改个人路径,当然,也可以在~/.bashrc这个个人设定的变量中修改。

~/.bashrc:这个文件对于个人喜好的bash设定是最重要的,因为我都是在这里设定我的个人变量,例如命令别名的设定,路径的重新定义等。

~/.bash_history:这个文件用于将您曾经用过的命令记录下来,而当您再次以上下

键搜寻或者直接以history搜寻时,就可以找到曾经用过的指令。

~/.bash_logout:这个文件则是在您注销shell的时候BASH为您所做的事情。通常默认是只有清除屏幕这件事;

不注销而直接读入变量配置文件使用source即可!

[root @test root]# source 变量配置文件

 

通配符与特殊符号:在bash中常会用到一些通配符,这些通配符搭配一些特殊符号可以更好地利用指令;

* 通配符,代表任意字符(0到多个)

? 通配符,代表一个字符

# 注释,这个最常用在脚本中,视为说明

\ 跳转符号,将特殊字符或通配符还原成一般字符

| 分隔两个管线命令的界定

; 连续性命令的界定(注意,与管线命令不同)

~ 用户的根目录

$ 即变量前需要加的变量值

& 将指令变成在背景下工作

! 逻辑运算中的“非”(not)

/ 路径分隔符号

>, >> 输出导向,分别为“取代”与“累加”

' 单引号,不具有变量置换功能

" 具有变量置换功能

` ` 两个“`”中间为可以先执行的指令

( ) 中间为子shell的起始与结束

[ ] 中间为字符组合

{ } 中间为命令区块组合

[test @test test]# ls test* <==*代表后面不论接几个字符都予以接受(没有字符也接受)

[test @test test]# ls test? <==?代表后面一定要接一个字符

[test @test test]# ls test??? <==???代表一定要接3个字符

[test @test test]# cp test[1-5] /tmp<==test1, test2, test3, test4, test5若存在,就将其复制到/tmp 下

[test @test test]# cd /lib/modules/`uname-r`/kernel/drivers <==被 ` ` 括起来的内容会先执行

 

组合键

Ctrl + C 终止当前命令

Ctrl + D 输入结束(EOF),例如邮件结束的时候

Ctrl + M 就是Enter

Ctrl + S 暂停屏幕的输出

Ctrl + Q 恢复屏幕的输出

Ctrl + U 在提示符下,将整行命令删除

Ctrl + Z 暂停当前命令

 

连续输入指令的方式

command1; command2 不论 command1 执行结果为何,command2 都会被执行

command1 && command2 当command1执行结果返回值为0时,也就是没有错误时,command2才会开始执行

command1 || command2 当command1有错误信息时,command2才会执行

 

命令重定向

基本的指令书写方式为:

                   >

指令     2>     设备或文件

                   >>

                   <

左边一定是指令,右边则可能是设备或文件。

命令重定向里几个常用的符号与设备:

< :由 < 的右边读入参数文件;

> :将原本由屏幕输出的正确数据输出到> 右边的file(文件名称)或device(设备,如printer);

>> :将原本由屏幕输出的正确数据输出到>> 右边,与 > 不同的是,该文件将不会被覆盖,而新的数据将以累加方式添加到文件的最后面;

2> :将原本应该由屏幕输出的错误数据输出到2>的右边;

/dev/null :可以视为垃圾设备。

[test @test test]# ls -al > list.txt

将显示结果输出到 list.txt 文件中,若该文件已存在则予以取代

[test @test test]# ls -al >> list.txt

将显示结果累加到list.txt 文件中,该文件为累加的,旧数据保留!

[test @test test]# ls -al 1> list.txt2> list.err

将显示数据正确输出到 list.txt,错误的数据输出到list.err

[test @test test]# ls -al 1> list.txt2>&1

将显示数据不论正确或错误均输出到list.txt中。注意,错误与正确信息输出到同一个文件中,则必须以上面的方法来写,不能写成其他格式

[test @test test]# ls -al 1> list.txt2> /dev/null

将显示的数据,正确的输出到list.txt,错误的数据予以丢弃!

1. 完全由键盘输入数据:

[root @test test]# mail -s "test"root <==-s表示标题,root为收件者

I am root! <==以下的数据都是由键盘输入的

That's OK

. <==要结束键盘输入时,需要在一行的最前面加上“.”

CC. <==是否需要有密件副本?不需要的话,直接按下 Enter

EOF <==表示送出

2. 由文件代替输入

[test @test tset]# mail -s "test"root < /root/.bashrc

将.bashrc内容寄给root

 

管线命令

管线命令“|”仅能处理经由前一个指令传来的正确信息,也就是标准输出(Stdout)信息,对于标准错误信息并没有直接处理能力。

① cut

[root @test /root ]# cut -d "分隔字符"[-cf] fields

-d :后面接的是分隔字符,默认是空格符

-c :后面接的是第几个字符

-f :后面接的是第几个区块

[root @test /root]# cat /etc/passwd | cut-d ":" -f 1

将 passwd文件中每一行里的“:”用作分隔符,列出第一个区块,也就是姓名所在

[root @test /root]# last | cut -d "" -f1

以空格符作为分隔,并列出第一个区块

[root @test /root]# last | cut -c1-20

将 last 之后的数据,每一行的1~20个字符取出来

② sort

[root @test /root ]# sort [-t 分隔符] [(+起始)(-结束)][-nru]

-t 分隔符:使用分隔符隔开不同区块,默认是 tab

+start -end:由第 start 区块排序到end区块

-n: 使用纯数字排序(否则会以字母方式排序)

-r: 反向排序

-u: 相同出现的一行,只列出一次

[root @test /root]# cat /etc/passwd | sort

将列出来的个人账号排序!

[root @test /root]# cat /etc/passwd | sort-t: +2n

将个人账号以用户ID排序(以 : 作分隔符,第三个为ID,但第一个代号为 0)

[root @test /root]# cat /etc/passwd | sort-t: +2nr

反相排序

③ wc

[root @test /root ]# wc [-lmw]

-l :多少行

-m :多少字符

-w :多少字

[root @test /root]# cat /etc/passwd | wc -l

这个文件里有多少行

[root @test /root]# cat /etc/passwd | wc -w

这个文件里有多少字

④ uniq

[root @test /root ]# uniq

[root @test /root]# last | cut -d" " -f1 | sort | uniq

这个指令用来删除重复的行从而只显示一个,举个例子,您要知道这个月登入您主机的用户有谁,而不在乎他的登入次数,那么就使用上面的范例,(1)先列出所有的数据;(2)将人名独立列出来;(3)排序;(4)只显示一个。由于这个指令是将重复的东西减少,所以需要配合排序过的文件来处理。

⑤ split

[root @test /root ]# split [-bl] 输入文件输出文件前导字符

-b :以文件 size 来分

-l :以行数来分

 [root @test /root]# split -l 5 /etc/passwdtest

会产生 testaa,testab, testac等文件

 

原创粉丝点击