码迷,mamicode.com
首页 > 其他好文 > 详细

Bash特性总结

时间:2015-11-06 23:39:34      阅读:456      评论:0      收藏:0      [点我收藏+]

标签:bash   特性   

    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

Bash特性总结

标签:bash   特性   

原文地址:http://soysauce93.blog.51cto.com/7589461/1710456

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!