Linux的bash的基础特性

什么是 shell和bash?

我看了这位大佬的一篇文章,感觉不错,有助于各位理解
https://www.jianshu.com/p/a702a01db5c7

基础特性一

history命令:
命令历史:shell进程会在其会话中保存此前用户提交过的命令 
		可以使用 ~]# history 查看
		定制history的功能,可以通过环境变量实现。
		HISTSIZE:shell进程可以保留的命令历史的条数  ~]# echo $HISTSIZE    1000 显示可以保留的历史纪录为1000条命令
		HISTFILE: 持久保存命令历史的文件 对于每个用户来讲都时保存自己的文件 .bash_history
		每一个用户命令历史的shell首先会从.bash_history 中加载命令历史文件到内存中,而后新执行的命令会补加在内存中
		所以history 看到的是整个内存中的命令。 注意文件中不会保留下来刚刚执行的命令
		HISTFILESIZE:存储历史命令的文件的大小
选项:-c 清空所有历史命令 ~]# history -c
	  -d offset n 清空指定行的命令 ~]# history -d 164 清空从164行开始10行的命令 ~]# history -d 164 10
	  -r 从文件读取命令历史到历史列表(内存)中 
	  -w 把历史列表中(内存)的命令追加到历史文件中
	  ~]# history 10 显示最近的十条命令
调用命令历史列表中的命令
	!#:再一次执行历史列表中的第#条命令  ~]# !174
	!!:再一次执行上一条命令   ~]# !!
	!String:再一次执行命令历史列表中最近一个以String开头的命令 ~]# !ca
			命令的重复执行需要依赖于幂等性
调用上一条命令的最后一个参数
	先执行 ~]# ls /etc/sysconfig/network-scripts
	后执行 ~]# ll /etc/sysconfig/network-scripts
	想要快速获取上一条命令后面跟的参数 使用ESC(按一下松开)然后按.号
	第二种方法  ~]# ll !$  !$ 可以获取上一条命令后面的参数
控制命令历史记录的方式
	环境变量:HISTCONTROL  ~]# echo $HISTCONTROL ignoredups  忽略重复命令
	ignoredups :忽略重复命令
	ignorespace:忽略以空白字符开头的命令
	ignoreboth:以上两者同时生效
	修改HISTCONTROL ~]# HISTCONTROL=ignorespace  只对当前shell有效,重启或者登录其他用户无效

基础特性二

命令补全:
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当做命令
	命令处理机制:
		先查找内部命令,
		如果没有则根据PATH环境变量中设定的目录,/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
		自左而右逐个搜索目录下的文件名,找到第一个匹配的启动为一个进程
	命令补全:
		给定的打头字符串能被唯一确定 则单机TAB键之后 会自动补全命令
		如果无法唯一确定,则单击两次TAB键,会以列表的形式列出所有命令
	路径补全:
		在给定的起始路径下,以对应路径下的打头字符串来逐一匹配起始路径下的每个文件
		单击TAB,如果能唯一标识,直接补全,否则再按一次TAB,给出列表

基础特性三

命令行自动展开
	~:自动展开为用户的家目录
	{}:可承载一个以逗号分隔的路径列表,并能够展开为多个路径
		例如:/tmp/{a,b} 相当于/tmp/a,/tmp/b
		]# mkdir -p /tmp/x/{y1/{a,b},y2} 在tmp/x下创建 y1,y2其中y1下创建a,b
		]# mkdir -v {a,b}_{c,d}  在当前目录下创建a_c,a_d,b_c,b_d
		创建如下目录结构
				tmp	
				├── mysysroot
				│   ├── bin
				│   ├── etc
				│   │   └── sysconfig
				│   │       └── network-scripts
				│   ├── sbin
				│   ├── usr
				│   │   ├── bin
				│   │   ├── lib
				│   │   ├── lib64
				│   │   ├── local
				│   │   │   ├── bin
				│   │   │   ├── etc
				│   │   │   ├── lib
				│   │   │   └── sbin
				│   │   └── sbin
				│   └── var
				│       ├── cache
				│       ├── log
				│       └── run

					
		]# mkdir -pv mysysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib},lib,lib64},var/{cache,log,run}}
	tree命令:树形结构显示目录结构
		选项:
			]# tree -L 2 /tmp/  -L:以树状结构最多显示两层

基础特性四

命令执行的状态结果
	命令执行的状态结果:bash通过状态返回值来输出此结果,成功0,失败1-255其中的一个值,命令执行完成后
	其状态返回值保存于bash的特殊变量$?中
	 ~]# echo $?  显示:0
	 执行一个错误命令 ~]#lsss /etc 然后执行~]# echo $? 显示:127 只返回上条执行的命令的状态结果
	 命令正常执行时,有的会有命令返回值,根据命令及其功能不同,结果各不相同,不是状态结果
引用命令的执行结果
	$(COMMOND) 或者 `COMMOND`
	例如创建一个当前时间为目录名的目录:~]# mkdir $(date +%H-%M-%S)

基础特性五

引用
	强引用:‘’	其内部的任何字符串都直接显示,不做任何替换
	弱引用:""	弱引用中的变量名会做变量替换,替换为变量中所存储的值
	命令引用:`` 或 $()

基础特性六

快捷键:
	ctrl + a: 在输入命令时,跳转到命令行首
	ctrl + e: 在输入命令时,跳转到命令行尾
	ctrl + u: 在输入命令时,删除命令行首到光标位置的所有内容
	ctrl + k: 在输入命令时,删除光标位置到命令行尾的所有的内容
	ctrl + l: 清屏 相当于clear

基础特性七

globbing:文件名通配(整体文件名匹配),一种匹配模式,
元字符:metacharacter 
指的是一个字符出现以后,并不表示字符本身的意义,而是用来匹配一定范围内的,或者指定范围内的字符
				*,匹配任意长度的任意字符串,例如查看/etc/所有pa打头的文件 ~]# ls /etc/pa*
				?,表示匹配任意单个字符 
				[]:匹配指定范围内的任意单个字符,有几种特殊格式
					[a-z],[A-Z],[0-9],[a-z0-9],
					[[:upper:]] 表示所有大写字母 查看以大写字母开头中间两位数字结尾为a的文件 test]# ls [[:upper:]][0-9][0-9]a
					[[:lower:]] 表示所有小写字母   [[:alpha:]] 表示所有字母    [[:digit:]]表示所有数字
					[[:alnum:]] 表示所有的字母和数字 [[:space:]] 表示所有空白字符 [[:punct:]] 表示所有标点符号
				[^]:匹配指定范围之外的任意单个字符
					[^[:upper:]]匹配任意大写字母范围之外的字符
					{^0-9]:匹配任意非数字
					[^[:alnum:]]:匹配任意非正常字符

基础特性八

IO重定向以及管道

可用于输入的:文件
键盘设备,文件系统上的常规文件,网卡等

可用于输出的:文件
显示器,文件系统上的常规文件,网卡等

程序的数据流有三种:
输入的数据流:<-- 标准输入(stdin),键盘
输出的数据流:–> 标准输出(stdout),显示器
错误输出流 :–> 标准输出(stderr),显示器

fd:file descriptor ,文件描述符 (相当于windows中的句柄)
对于任何一个程序,因为一切皆文件,所以其标准输入的fd为0,
标准输出fd为1,错误输出fd为:2

IO重定向: 将本来的标准输入输出位置改为其他位置,比如标准输入流为键盘,但是通过重定向改为其他位置
	输出重定向:>  
		test]# cat /etc/issue > /tmp/issue.out 将本应输出到显示器的issue重定向到/tmp/issue.out文件中
		特性:覆盖输出,
		注意:可以使用命令 ~]# set -C  命令使得覆盖重定向丧失覆盖功能,只对当前shell有效
		禁止覆盖后,可以使用强制覆盖输出: >|
		恢复覆盖功能 ~]# set +C
	输出重定向:>>
		test]# cat /etc/issue >> /tmp/issue.out 将本应输出到显示器的issue重定向到/tmp/issue.out文件中
		特性:追加输出,保留原有内容保留追加
	
	错误输出重定向:2>(覆盖重定向) ,2>>(非覆盖重定向)
	
	合并正常输出流和错误输出流: &>,&>>
	
	另一种方式:
	]# cat /etc/rc.d/init.d/functions >> /tmp/function.out 2>&1
	将functions输出至/tmp/function.out  如果发生错误 也输出到 /tmp/function.out
	
	输出重定向的特殊设备:/dev/null 数据黑洞 是一个软设备,任何输出送给它都会被抛弃,不返回执行结果,只返回状态结果,可以根据此状态来判断后续是否要执行其他
	~]# ls /varr &> /dev/null
	~]# echo $?
	2
	表示命令执行错误
	
	输入重定向:<
		例如:]# cat < /etc/issue 将本来是来自键盘的输入 重定向至文件 /etc/issue
		tr:命令,tr [OPTION]... SET1 [SET2]
		把输入的数据当中的字符,凡是在SET1定义范围内出现的,一律对应位置转换为SET2中的字符
		tr abc ABC 将所有的a转换为A 将所有的b转换为B 将所有的c转换为C
		~]# tr [a-z] [A-Z]
		how are you        
		HOW ARE YOU
		
		~]# tr [a-z] [A-Z] < /etc/issue
		CENTOS RELEASE 6.5 (FINAL)
		KERNEL \R ON AN \M
		
		~]# tr -d '[A-Z]' < /etc/issue 将/etc/issue全部的大写字母删除,但是并不会修改源文件
		ent release 6.5 (inal)
		ernel \r on an \m
	输入重定向:<< 表示此处创建文档
		~]# cat << EOF
		> how are you?
		> what's your name
		> EOF
		how are you?
		what's your name
	Here Document:<<
		cat << EOF
		cat > /PATH/TO/SOMEFILE << EOF

	管道:连接程序,将前一个命令的输出直接定向给后一个程序当作输入
		COMMOND1 | COMMOND2 | COMMOND3....
		~]# cat /etc/issue | tr 'a-z' 'A-Z' 将cat命令的结果送给tr命令 将a-z转换为A-Z
		]# who | head -1 | tr 'a-z' 'A-Z' 查看登录的用户| 只查看第一行 | 将小写的‘a-z'转换为大写的'A-Z'
		tee命令:将标准输入流分叉,一条流向可以存入一个文件,另一条流向可以发送至标准输出流或者管道
		
			~]# cat /etc/issue | tee /tmp/issue.tee | tr 'a-z' 'A-Z'
				CENTOS RELEASE 6.5 (FINAL)
				KERNEL \R ON AN \M

			~]# cat /tmp/issue.tee 
				CentOS release 6.5 (Final)
				Kernel \r on an \m
								
			该例中,将/etc/issue的输出流通过管道发送给tee,tee命令将输入流分叉,一条输入流输出到/tmp/issue.tee,另一条输出给tr命令
发布了32 篇原创文章 · 获赞 6 · 访问量 903

猜你喜欢

转载自blog.csdn.net/EEEEEEcho/article/details/104206844