Bash 是 GNU 计划中重要的工具软件之一,目前也是 Linux distributions 的标准 shell 。 bash 主要兼容于 sh ,并且依据一些使用者需求,而加强的 shell 版本。不论你使用的是那个 distribution ,你都难逃需要学习 bash 的宿命!那么这个 shell 有什么好处,干嘛 Linux 要使用他作为默认的 shell 呢? bash 主要的优点有底下几个:
命令历史
命令补全、路径补全
命令替换
命令行展开
命令别名
glob通配符
bash快捷键
bash变量
IO重定向与管道
一、命令历史
(1).查看命令历史:history
-a:追加当前会话的命令历史至历史文件中去 -c:清空命令历史 -d offset [n]:删除第offset条命令 -w:将当前缓冲区中历史命令写入到历史文件中去 [root@soysauce ~]# history -d 500 10 # 从第五百条命令往后删10条 [root@soysauce ~]# history 10 # 列出最近10条命令 history 10 1003 history 10 1004 ls 1005 cd /etc/ 1006 cd - 1007 ls /root/ 1008 cd .. 1009 cd /usr/local/ 1010 date 1011 hwclock 1012 history 10
(2). 命令历史相关的环境变量
HISTSIZE:命令历史中可以保存的命令的个数 HISTFILE: 命令历史文件 HISTFILESIZE:命令历史文件可以保存的命令的个数 HISTCONTROL: 控制命令历史的生成 ignoredups: 忽略记录重复的命令;连续的相同命令才为重复 ignorespace: 不记录以空白字符开头的命令 ignoreboth: 同时具有上面两种特性
(3).history快捷方式
!## 执行命令历史中的第#条命令 !!# 执行上一条命令 !-## 执行命令历史中的倒数第#条命令 !$# 引用上一条命令最后的参数,另两种方式:(1)ESC,. # ESC键按完之后再按. (2)ALT+. #按住ALT,再按. !string# 执行命令历史中最近一条以string开头的命令
二、命令补全、路径补全
(1).命令补全
[root@soysauce ~]# Display all 1771 possibilities? (y or n) # 在命令行下连敲两下Tab键即可
(2).路径补全
[root@soysauce ~]# ls /usr/ # 在命令行下连敲两下Tab键即可,如果能唯一确定,则敲一下Tab即可 bin/ games/ kerberos/ lib64/ local/ share/ tmp/ etc/ include/ lib/ libexec/ sbin/ src/ X11R6/
三、命令替换
(1). ``(反引号)替换
[root@soysauce ~]# mkdir `date +%F` [root@soysauce ~]# ls 2015-11-06 iptables.sh
(2).$()替换
[root@soysauce ~]# mkdir $(date +%F) [root@soysauce ~]# ls 2015-11-06 iptables.sh
四、命令行展开
当shell遇到{}时会自动将花括号里面的内容展开为多个条目
[root@soysauce test]# mkdir {a,b}_{c,d} [root@soysauce test]# ls a_c a_d b_c b_d [root@soysauce test]# cd /etc/yum.repo.d/ [root@soysauce yum.repos.d]# mv CentOS-Base.repo{,.back} # 备份此yum源 [root@soysauce yum.repos.d]# ls CentOS-Base.repo.back
五、命令别名
(1).显示当前shell中定义的所有别名
[root@soysauce test]# alias alias cp=‘cp -i‘ alias fdisk=‘fdisk -H 224 -S 56‘ alias l.=‘ls -d .* --color=tty‘ alias ll=‘ls -l --color=tty‘ alias ls=‘ls --color=tty‘ alias mv=‘mv -i‘ alias rm=‘rm -i‘ alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘
(2).创建命令别名
syntax alias CmdAlias=‘Command [options] [arguments]‘ [root@soysauce test]# alias cdnet=‘cd /etc/sysconfig/network-scripts/‘ # 定义cdnet别名 [root@soysauce test]# alias alias cdnet=‘cd /etc/sysconfig/network-scripts/‘ alias cp=‘cp -i‘ alias fdisk=‘fdisk -H 224 -S 56‘ alias l.=‘ls -d .* --color=tty‘ alias ll=‘ls -l --color=tty‘ alias ls=‘ls --color=tty‘ alias mv=‘mv -i‘ alias rm=‘rm -i‘ alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘ [root@soysauce test]# cdnet [root@soysauce network-scripts]#
(3).撤销别名
[root@soysauce network-scripts]# unalias cdnet [root@soysauce network-scripts]# alias # 此时cdnet这个别名已经被撤销了 alias cdnet=‘cd /etc/sysconfig/network-scripts/‘ alias cp=‘cp -i‘ alias fdisk=‘fdisk -H 224 -S 56‘ alias l.=‘ls -d .* --color=tty‘ alias ll=‘ls -l --color=tty‘ alias ls=‘ls --color=tty‘ alias mv=‘mv -i‘ alias rm=‘rm -i‘ alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘ [root@soysauce network-scripts]# cdnet -bash: cdnet: command not found
(4).永久保存此命令别名
[root@soysauce test]# echo "alias cdnet=‘cd /etc/sysconfig/network-scripts‘" >> ~/.bashrc [root@iZ23fi07mooZ network-scripts]# su - # 需要重新打开一个登录式shell或是重新连接才能生效 [root@iZ23fi07mooZ ~]# cdnet [root@iZ23fi07mooZ network-scripts]#
六、Glob通配符
(1). *: 匹配任意长度的任意字符
[root@soysauce test]# touch abc abb abm xab ab Abc [root@soysauce test]# ls ab abb abc abm xab [root@soysauce test]# ls ab* ab abb abc abm
(2). ?:匹配任意单个字符
[root@soysauce test]# ls ab? abb abc abm
(3). []: 匹配指定字符范围内的任意单个字符
[[:upper:]] 所有大写字母[A-Z] [[:lower:]] 所有小写字母[a-z] [[:alpha:]] 所有字母(大小写)[a-zA-Z] [[:digit:]] 所有数字[0-9] [[:alnum:]] 所有字母和数字[a-zA-Z0-9] [[:space:]] 空白字符 [[:punct:]] 标点符号 [root@soysauce test]# ls [[:upper:]]bc Abc
(4). [^]: 匹配指定字符范围外的任意单个字符
[root@soysauce test]# ls [^[:upper:]]bc abc
七、bash快捷键
ctrl + a:从光标所在处跳至命令行首 ctrl + e:从光标所在处跳至命令行尾 ctrl + u:删除光标所在处至命令行首的内容 ctrl + k:删除光标所在处至命令行尾的内容 ctrl + w:从光标所在处向前删除一个单词 ctrl + y:将粘贴至光标后 ctrl + 光标右键:向右跳转一个单词 ctrl + 光标左键:跳转一个单词 ctrl + c:终止或取消 ctrl + z:将当前命令送至后台 ctrl + l:清屏 ctrl + r:逆向搜索命令历史 Alt + .:使用上一条命令的最后一个参数(按住ALT,不松开,再按.) ESC + .:同上一个相同(先按一下ESC,松开,再按.)
八、Bash变量
1.变量的类型
(1).本地变量:只对当前shell进程有效,对其子shell以及其它shell都无效
[root@soysauce test]# A=‘jerry‘ # 定义一个本地变量A
(2).局部变量:仅对局部代码生效(且只能在函数中定义)
[root@soysauce test]# local B=‘tom‘ # 命令行不能定义局部变量 -bash: local: can only be used in a function
(3).环境变量:对当shell进程及其子shell有效
[root@soysauce test]# export C=‘natash‘# 定义环境变量C [root@soysauce test]# echo $C natash [root@soysauce test]# bash # 重新打开一个子shell [root@soysauce test]# echo $C # 之前定义的环境变量在子shell中依然有效,但是重新登陆就没效了 natash
(4).位置变量$[1-10]
$1 # 表示向脚本传递的第一个参数 $2 # 表示向脚本传递的第二个参数
(5).特殊变量
$0:脚本名称自身 $#:传递到脚本的参数个数 $?:上一条命令的执行状态返回值,0代表成功 $$:脚本运行的当前shell进程的id号 $!:后台运行的最后一个进程的进程ID号 $*:以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个 $@: 与$*相同,但是使用时加引号,并在引号中返回每个参数
2.变量命名规则
只能使用数字、字母和下划线组成
不能以数字开头
不能使用程序中的关键字
见名知义;NameAlias
九、IO重定向与管道
1.输入输出
INPUT:标准输入,stdin, 0
OUPUT: 标准输出,stdout, 1
标准错误:stderr, 2
2.输入重定向
<: 输入重定向 << EOF: 此处创建文件, Here Document,常用于在脚本中创建文件或生成菜单 [root@soysauce test]# cat < /etc/issue # cat读取/etc/issue文件内容,通过输入重定向 CentOS release 5.8 (Final) Kernel \r on an \m [root@soysauce test]# cat > note.txt << OK # 将键盘输入的内容重定向至note.txt中 > Hello,World > Hello,Python > OK
3.输出重定向
>: 覆盖输出 >>: 追加输出 set -C:禁止使用覆盖重定向至已经存在的文件 set +C: 关闭上述特性 >|:在-C特性下,强制使用覆盖重定向 [root@soysauce test]# ls iptables.sh note.txt [root@soysauce test]# cat /etc/issue >> note.txt # 将issue文件的内容追加重定向至note.txt尾部 [root@soysauce test]# cat note.txt # 再次查看note.txt的文件内容 Hello,World Hello,Python CentOS release 5.8 (Final) Kernel \r on an \m [root@soysauce test]# cat /etc/fstab > note.txt # 将fstab文件的内容覆盖重定向至note.txt LABEL=/ / ext3 defaults,barrier=0 1 1 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 [root@soysauce test]# set -C note.txt # 禁止对此文件使用覆盖重定向 [root@soysauce test]# cat /etc/issue > note.txt # inittab文件的内容覆盖重定向至note.txt bash: note.txt: cannot overwrite existing file [root@soysauce test]# cat /etc/issue >| note.txt # 在set -C特性下,强制进行覆盖重定向 [root@soysauce test]# cat note.txt # 再次查看note.txt的文件内容 CentOS release 5.8 (Final) Kernel \r on an \m [root@soysauce test]# set +C note.txt # 撤销禁止覆盖重定向的操作
4.错误重定向
2>:错误覆盖输出 2>>:错误追加重定向 [root@soysauce test]# ls /vars/abc 2>> note.txt # 将此命令执行结果错误输出追加重定向至note.txt [root@soysauce test]# cat note.txt # 再次查看note.txt的文件内容 CentOS release 5.8 (Final) Kernel \r on an \m ls: /vars/abc: No such file or directory [root@soysauce test]# ls /etc/fsabc 2> note.txt # 将此命令执行结果错误输出覆盖重定向至note.txt [root@soysauce test]# cat note.txt # 此时文件内容已变成了执行命令产生的错误输出信息 ls: /etc/fsabc: No such file or directory
5.同时重定向标准输出和标准错误输出
COMMAND > /path/to/outfile 2> /path/to/errfile COMMAND &> /path/to/somefile COMMAND > /path/to/somefile 2>&1 [root@soysauce test]# # 额 以后写个脚本的时候再举个例子
6.管道(pipe)
使用目的单一的小程序 组合小程序完成复杂任务 COMMAND1 | COMMAND2 | COMMAND3 | ... [root@soysauce test]# grep "bash" /etc/passwd|head -1|cut -d: -f1 # 取出passwd文件中shell为bash的用户列表中的第一行的用户名 root [root@soysauce test]# seq -s "+" 100|bc # 计算1到100的和,seq用来生成列表,-s选项指定列表分隔符 5050
总结:
~/.bash_history 记录的是前一次登陆以前所运行过的命令, 而至于这一次登陆所运行的命令都被缓存在内存中,当你成功的注销系统后,该命令记忆才会记录到 .bash_history 当中
本文出自 “Hello,Linux” 博客,请务必保留此出处http://soysauce93.blog.51cto.com/7589461/1710456
原文地址:http://soysauce93.blog.51cto.com/7589461/1710456