Linux中bash shell入门
▲初探shell
Shell分为图形界面shell(如win中的explorer,linux中的kDE和GNOME)和命令行shell。Shell是一个命令解释器,又分为交互式和非交互式。也可分为登陆式shell(需输入用户名和密码)和非登陆式shell
Linux中支持的shell在/etc/shells文件中
Linux使用的默认shell为bash(Bourne 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下变量设定的规则
- 变量与变量内容以等号=来连接,等号两边不能直接接空格符
- 变量名称只能是英文字母与数字,但是数字不能做开头
- 有空格符可以使用双引号"或单引号‘来将变量内容结合起来,但要注意,双引号内的特殊字符可以爆出原有变量特性,但是单引号内的特殊字符只是一般字符
- 必要时可以使用转义字符\来将特殊符号转变成一般符号
- 在一串指令中,如果还需要由其他指令提供的信息,可以使用quote,‘command‘
- 若该变量为扩增变量内容时,则需以双引号和$变量名称。例如PATH="$PATH":/home继续累加变量内容
- 若该变量需要在其他子程序中使用,可以使用export将变量变成环境变量
- 取消变量的方法为????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),对于错误信息没有处理能力
?
选取命令????cut和grep
????就是将一段数据经过分析后,取出我们想要的部分,或者是通过分析关键字取得我们想要的行。选取信息通常是针对逐行分析得到的,而不是针对整个信息分析的。
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????????后面可接欲分割成的档案大小,可加单位,例如b,k,m等
????参数-l????????以行数来进行分割
?
参数代换xargs
xargs [-epn] command????没接参数时,默认echo输出
????参数-e????????eof的意思。后面可以接字符串,当xargs分析到这个字符串时,就会停止工作
????参数-p????????在执行每个命令的参数时,都会询问用户的意思
????参数-n????????后面接次数,每次command命令执行时,要使用几个参数
?
?
?
?
?
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。