bash基础特性(一)
bash是Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。 Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。
bash基础特性之一:命令历史history
linux命令历史对于在经常要使用命令时候,提高工作效率非常有帮助。bash会记录用户在当前的shell进程会话中执行过的命令,保存在内存里面。正常退出后记录在用户家目录里面的隐藏文件/root/.bash_history里面。当下次登录linux主机时候,bash就会从这个文件读取里面的命令到内存。默认记录是1000条。
和history相关的几个的环境变量:
1.$HISTFILE 命令历史文件存放路径 可用echo $HISTFILE查看。
2.$HISTSIZE 当前shell进程内存里可保存的命令历史条数。
3.$HISTFILESIZE 定义命令历史文件.bash_history里面可以保存的命令历史条数。
4.$HISTCONTROL 控制命令历史记录的方式
它们可以用echo命令来查看,例如 ~]# echo $HISTSIZE
history不带任何参数参数下使用方法
history -c: 清空命令历史;
history -d offset:删除当前shell进程中指定命令历史 。例如:~]# history -d 211删除第211条命令。history -d 211 5 删除第211--216条命令.
history -r: 从历史记录文件读取命令历史至历史列表中。
history -w:把当前shell进程中历史命令列表中的命令追加至命令历史记录文件中。
history #:显示最近的#条命令;例如~]# history 5 显示最近执行过的5条命令。
调用命令
历史列表中的命令!!:再一次执行上一次的命令。或者ctrl+p 再敲回车也可以。
!n:再一次执行当前shell进程中历史命令列表中的的第n条命令,例如:!10,表示再次执行第十条历史命令。
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令。
注意:命令的重复执行有时候需要依赖于幂等性;
调用上一条命令的最后一个参数
快捷键:ESC, .:先按下ESC松开再按 . 。
字符串:!$
使用 HISTSIZE 控制历史命令记录的总行数
[root@dxlcentOS ~]# vi .bash_profile
HISTSIZE=100
HISTFILESIZE=100
把这两行追加到.bash_profile文件中,可改为100条,这种改法只对当前用户有效。追加入/etc/profile这文件里面对所有用户有效。
使用 HISTCONTROL 从命令历史中剔除连续重复的条目
[root@dxlcentOS ~]# HISTCOMTROL=ignoredups
使用 HISTCONTROL 清除整个命令历史中的重复条目
[root@dxlcentOS ~]# HISTCOMTROL=erasedups
使用 HISTCONTROL history 忽略以空格开头的命令
[root@dxlcentOS ~]# HISTCOMTROL=ignorespace
或者 ~]# export HISTCOMTROL=ignoreboth 忽略以空格开头的命令并剔除连续重复的条目
基础特性之二:命令补存,路径补存
命令补存
shell程序在接收到用户执行命令请求并分析完成后,最左边的字符串会被当做命令。按下一次tab键后,shell程序会根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名,给定的打头字符串如果能惟一标识某命令程序文件,则直接补全命令名。不能惟一标识某命令程序文件,再击tab键一次,会给出以你输入的字符开头的命令列表。例如:要执行whereis命令
[root@dxlcentOS ~]# wh 输入wh后,假设后面的字母忘记了,按两次键
whatis which whiptail whoami
whereis while who
[root@dxlcentOS ~]# whereis 再加多一个e,是给出列表唯一性,这时候再按一次tab键会补存
路径补存
在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件:按一次tab键,如果能惟一标识,则直接补全;否则,再一次tab,给出列表。
总结:无论是命令补存还是路径补存,在输入的时候敲多敲两次tab键,用自动补存来提高输入速度。
基础特性之三:命令行展开
~波浪线展开:自动展开为用户的家目录,或指定的用户的家目录;
{}花括号展开:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b
在/tmp下创建a_c,a_d,b_c,b_d
[root@dxlcentOS tmp]# mkdir -pv ./{a,b}_{c,d} 可以通俗地理解为多项式相乘。
mkdir: 已创建目录 "./a_c"
mkdir: 已创建目录 "./a_d"
mkdir: 已创建目录 "./b_c"
mkdir: 已创建目录 "./b_d"
[root@dxlcentOS tmp]# ls
a_c
a_d
b_c
b_d
ks-script-F5Sw7L
test.txt
[root@dxlcentOS tmp]#
命令行展开创建多层目录结构:
[root@dxlcentOS tmp]# mkdir -pv /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sbin},var/{lock,log,run}}
mkdir: 已创建目录 "/tmp/mylinux"
mkdir: 已创建目录 "/tmp/mylinux/bin"
mkdir: 已创建目录 "/tmp/mylinux/boot"
mkdir: 已创建目录 "/tmp/mylinux/boot/grub"
mkdir: 已创建目录 "/tmp/mylinux/dev"
mkdir: 已创建目录 "/tmp/mylinux/etc"
mkdir: 已创建目录 "/tmp/mylinux/etc/rc.d"
mkdir: 已创建目录 "/tmp/mylinux/etc/rc.d/init.d"
mkdir: 已创建目录 "/tmp/mylinux/etc/sysconfig"
mkdir: 已创建目录 "/tmp/mylinux/etc/sysconfig/network-scripts"
mkdir: 已创建目录 "/tmp/mylinux/lib"
mkdir: 已创建目录 "/tmp/mylinux/lib/modules"
mkdir: 已创建目录 "/tmp/mylinux/lib64"
mkdir: 已创建目录 "/tmp/mylinux/proc"
mkdir: 已创建目录 "/tmp/mylinux/sbin"
mkdir: 已创建目录 "/tmp/mylinux/sys"
mkdir: 已创建目录 "/tmp/mylinux/tmp"
mkdir: 已创建目录 "/tmp/mylinux/usr"
mkdir: 已创建目录 "/tmp/mylinux/usr/local"
mkdir: 已创建目录 "/tmp/mylinux/usr/local/bin"
mkdir: 已创建目录 "/tmp/mylinux/usr/local/sbin"
mkdir: 已创建目录 "/tmp/mylinux/var"
mkdir: 已创建目录 "/tmp/mylinux/var/lock"
mkdir: 已创建目录 "/tmp/mylinux/var/log"
mkdir: 已创建目录 "/tmp/mylinux/var/run"
[root@dxlcentOS tmp]# tree /tmp/mylinux/
快速创建多个文本文件:~]# touch a{1..10}.txt /tmp 一次性创建a1.txt a2.txt a3.txt .....
基础特性之四:命令执行状态结果
bash命令执行完成之后,其状态返回值保存于bash的特殊变量$?中。可用~]# echo $?查看
通过状态返回值来输出结果:
成功:用 0 表示命令执行成功
失败:1-255 间的一个值表示命令执行失败,根据命令及其功能不同,返回结果不同。
引用命令执行结果:
$(COMMAND)
或`COMMAND`
命令执行状态结果这个特性编程中常用。
基础特性之五:引用
分 强引用:' ' 通俗的说所见即所得,例如
[root@dxlcentOS tmp]# echo '$HISTFILESIZE'
$HISTFILESIZE
强引用字符,特殊符号都会按照原原样输出
弱引用:" " 引用的字符要是变量则会输出变量值。例如
[root@dxlcentOS tmp]# echo "$HISTFILESIZE"
1000
命令引用:` `(反引号)
基础特性之六:快捷键
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符
Ctrl+k:删除光标所在处至行尾的所有字符
Ctrl+l:清屏,相当于clear