首页 > 代码库 > Linux中bash shell入门

Linux中bash shell入门

▲初探shell

Shell分为图形界面shell(如win中的explorerlinux中的kDEGNOME)和命令行shellShell是一个命令解释器,又分为交互式和非交互式。也可分为登陆式shell(需输入用户名和密码)和非登陆式shell

Linux中支持的shell/etc/shells文件中

Linux使用的默认shellbashBourne Again Shell

?

type [-at] name????显示name是外部命令还是bash内置命令

????参数-t????????????file表示外部命令,alias表示命令别名,builtin表示bash内置命令

????参数-a????????????path变量定义的路径中列出所有含name的命令

?

▲shell的变量功能

变量就是以一组文字或符号等,来取代一些设定或一串保留的数据。echo $变量名

linux预设的情况中,使用大写字母来设定的变量一般为系统预定义变量。例如PATH

bash中有很多预定义环境变量,系统通过预定义环境变量来定义shell的环境,env可显示目前系统中主要的预定义变量内容,set可以将环境变量和用户自定义变量显示出来

?

PS1提示符的设置

????\d????代表日期

????\t????24小时格式显示时间

????\T????12小时格式显示时间

????\A????24小时格式显示时间(不含秒)

????\H????完整的主机名称

????\h????只取主机名称的第一个名字

????\u????当前帐户名

????\v????bash版本信息

????\w????完整工作目录

????\W????只列出最后一个目录

????\#????执行的第几个指令

????\$????root用户提示符是#,其他用户提示符是$

?

export可以将用户自定义的变量变成环境变量。在启动shell的时候,系统给shell分配一块内存,用来存储系统环境变量。export可以将用户自定义变量移动到该内存中。当进入子shell时,子shell将父shell的系统环境变量读入到子shell的内存中

?

bash下变量设定的规则

  1. 变量与变量内容以等号=来连接,等号两边不能直接接空格符
  2. 变量名称只能是英文字母与数字,但是数字不能做开头
  3. 有空格符可以使用双引号"或单引号来将变量内容结合起来,但要注意,双引号内的特殊字符可以爆出原有变量特性,但是单引号内的特殊字符只是一般字符
  4. 必要时可以使用转义字符\来将特殊符号转变成一般符号
  5. 在一串指令中,如果还需要由其他指令提供的信息,可以使用quote‘command‘
  6. 若该变量为扩增变量内容时,则需以双引号和$变量名称。例如PATH="$PATH":/home继续累加变量内容
  7. 若该变量需要在其他子程序中使用,可以使用export将变量变成环境变量
  8. 取消变量的方法为????unset 变量名称

?

语系文件的变量locale

locale –a????显示系统支持的所有语系

改变系统支持的语系,可修改/etc/sysconfig/i18n(系统默认的语系文件)

?

变量键盘读取和声明变量????????

read [-pt] 变量

????-p????后面可以接提示符

????-t????后面可以接秒数,限制等待的时间

declare/typeset [-airx] 变量

????-a????声明的变量为数组a[i]

????-i????整数数字

????-r????变量为只读

????-x????变量变成系统环境变量

?

▲命令别名与历史命令

设置alias取消unalias

????命令格式????alias 命令别名=‘命令内容

????命令格式????unalias 命令别名

history n

history [-crw]

????参数-c????????将当前shell中的所有历史命令全部清除

????参数-r????????histfile中的内容读到shell的命令记忆中

????参数-w????????将当前历史记忆内容写入到histfile

????????!number????执行第几个指令的意思

????????!Command????执行以command开头的指令

????????!!????????上一个指令的意思

?

bash shell使用环境

登陆信息提示????????/etc/issue????/etc/motd

????\d本地端时间的日期????????\l显示第几个终端接口

????\m显示硬件等级????????\n显示主机的网络名称

????\r操作系统的版本????????\t24小时格式显示时间

????\s操作系统的名称????????\v操作系统的版本

?

bash shell系统设定值在/etc/profile(设定了PATH,USER等几个重要的变量)和/etc/bashrc(规划umask的功能和提示字符PS1的内容)。个人设定值在~/.bash_profile~/.bashrc

etc/man.config规范了使用man的时候,man page的路径到哪里去寻找

?

个人设定值

????~/.bash_profile里面定义了个人化的路径PATH与环境变量的文件名称

????~/.bashrc里面设定个人化变量。例如命令别名的设定,路径的重新定义

????~/.bash_logout在注销shell时,BASH会为你所做的事情

????source变量设定文件就可以将设定档的内容读入一次

?

终端环境设置????????stty

????stty –a????????将当前所有的stty参数列出来

????????intr????????给正在运行的程序发送中断信号(Ctrl+C

????????quit????????给正在运行的程序发送退出信号(Ctrl+\

????????erase????????向前删除字符(Delete

????????kill????????删除命令行上的文字(Ctrl+U

????????eof????????停止当前的输出(Ctrl+D

????????start????????重启暂停的输出(Ctrl+Q

????????stop????????停止当前的输出(Ctrl+S

????????susp????????给正在运行的程序发送一个终端停止信号(Ctrl+Z

????????rprnt????????输入命令时提示使用过的历史命令(Ctrl+R

????????werase????????删除命令行的最后一个字(Ctrl+W

?

万用字符与特殊符号

符号

内容

*

代表0个或多个字符(或数字)

?

代表一个字母

#

批注,常用在script当中视作说明

\

跳脱符号,将特殊字符或万用字符还原成一般字符

|

分割两个管道命令的界定

;

连续性命令的界定

~

使用者的家目录

$

变量之前需要加的变量取代值

&

将指令变成背景下工作

!

逻辑运算意义上的非的意思

/

路径分割符号

>,>>

输出导向,分别是取代和累加

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

"

双引号,具有变量置换的功能

``

引用,先执行的命令

()

shell的起始与结束

[]

字符的组合

{}

命令区块的组合

?

?

数据流重导向????????redirect????就是将目前的所得数据输出到其他地方去

三种输出输入的状况

????标准输入stdin????????代码为0????使用<<<

????标准输出stdout????代码为1????使用1>>>

????错误输出stderr????代码为2????使用2>2>>

????????命令格式????????find / -name file 1 > list_right 2 > list_error

同时写入同一个档案时

????????命令格式????????find / -name file 1 > list 2 > &1(得到完整信息)

????????????????????find / -name file > list 2 > list(得到的信息不全)

?

双向重导向????tee –a file????将数据流同时输出到屏幕和文件

????-a????????以累加的方式,将数据加入file

last | cut –d ‘:‘ –f1 | tee lastlist

|| /home | tee /tmp/dirfile

|| /tmp | tee –a /tmp/dirfile

?

为何要使用命令输出重导向(5个原因)

????当屏幕输出的信息很重要,而且我们需要将他存下来

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

????一些系统的例行命令的执行结果,希望他可以存下来时

????一些执行命令,我们已经知道他可能额错误讯息,所以想以2> /dev/null将他丢掉时

????错误讯息与正确讯息需要分别输出时

?

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

????commond1;commond2????不论命令1执行结果如何,命令2都被执行

????commond1&&commond2????如果命令1正确执行,命令2才执行

????commond1||commond2????如果命令1错误,命令2才执行

?

▲管道命令(pipe

管道命令|只能处理通过前面一个命令传来的正确信息也就是标准输出(STDOUT),对于错误信息没有处理能力

?

选取命令????cutgrep

????就是将一段数据经过分析后,取出我们想要的部分,或者是通过分析关键字取得我们想要的行。选取信息通常是针对逐行分析得到的,而不是针对整个信息分析的。

cut????????将一段消息的某段切出来。消息以行为单位

????参数-d????????‘分割字符‘ –f fields

????参数-c????????以字符为单位取出固定的字符范围

????参数-f????????根据-d分隔符将一段消息分为数段,-f是取出第几段的意思

grep????????分析一行信息,若其中有需要的信息,就将这一行信息显示出来

命令格式????grep [-acinv] ‘搜素字符串‘ filename

????参数-a????????将二进制文件以文本文件的方式搜索数据

????参数-c????????计算找到搜索字符串的次数

????参数-i????????忽略大小写的不同

????参数-n????????顺便输出行号

????参数-v????????反向选择,即显示没有搜索字符串的那一行

?

排序命令????sort wc uniq

?

sort [-fbMnrtuk] [file or stdin]

????参数-f????????忽略大小写的差异

????参数-b????????忽略最前面的空格字符部分

????参数-M????以月份的名称来排序

????参数-n????????使用纯数字排序(默认使用文字类型来排序)

????参数-r????????反向排序

????参数-t????????分隔符,默认是tab

????参数-u????????就是uniq,相同数据,只列出一次显示

????参数-k????????按那个字段(field)来进行排序

uniq [-ic]

????参数-i????????忽略大小写

????参数-c????????进行计数

wc [-lwm]

????参数-l????????仅显示多少行

????参数-w????????仅显示有多少字

????参数-m????多少字符

?

字符转换命令????????tr col join paste expand

tr [-ds] str…????删除一段信息当中的文字,或进行文字信息的替换

????参数-d????????删除信息当中的str这个字符串

????参数-s????????取代掉重复的字符

col [-x]

????参数-x????????tab键转换成对等的空格键

expand [-t] file????tab键转换成8个空格键

????参数-t????????后接数字n,自定义将tab键转换成n个空格键

join [-ti12] file1 file2????????

????参数-t????????join预设空格符分割数据,并且比对第一个字段的数据,如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个

????参数-i????????忽略大小写的差异

????参数-1????????代表file1要用那个字段来分析的意思

????参数-2????????代表file2要用那个字段来分析的意思

paste [] file1 file2

????参数-d????????后面可以接分隔字符,预设是以tab键来分割的

????参数- ????????如果file部分写成-,表示来自standard input的意思

split [-bl] file PREFIX????????文件分割,PREFIX为前缀

????参数-b????????后面可接欲分割成的档案大小,可加单位,例如bkm

????参数-l????????以行数来进行分割

?

参数代换xargs

xargs [-epn] command????没接参数时,默认echo输出

????参数-e????????eof的意思。后面可以接字符串,当xargs分析到这个字符串时,就会停止工作

????参数-p????????在执行每个命令的参数时,都会询问用户的意思

????参数-n????????后面接次数,每次command命令执行时,要使用几个参数

?

?

?

?

?

Linux中bash shell入门