目录

history,$?,命令行展开,alias,命令引用,

通配符,输入输出重定向,管道,多道输出


bash 特性一: history   命令历史

              命令历史记录功能是bash自己提供的,history可以管理命令历史

持久保存的位置:HISTFILE=~/.bash_history

该文件保存的历史命令条数:HISTSIZE=1000

用法:

      history      显示所有的历史命令(包括持久保存和内存缓存的历史命令)

      history N:显示最近的N个

      history -c:清空内存缓存中的历史命令(但是会保存该次清空命令的操作) 

[root@Node3 ~]# history
   62  history
   63  cat .bash_history 
   64  history
[root@Node3 ~]# history -c
[root@Node3 ~]# history
   62  history

 history -d N:清楚指定编号的历史命令

    hitory -a  /PATH/TO/FILENAME:保存内存缓存中的历史命令到指定文件中

   !#                                  再次执行指定编号的历史命令

 !!                                    再次执行上一条命令

    !STRING                          再次执行命令历史中最近一次以STRING开头的命令

    !$或者先按一下ESC再按'.'号        调用上一次命令的最后一个参数


bash的特性之二:自动补全

命令补全:

       根据内建命令或外部命令各自查找方式查找以用户指定的字符开头的命令

       如果用户指定的开头的字符串能唯一标识某命令,则TAB键可直接补全此命令,否则两次TAB键可显示所有以指定字符串开头的命令

[root@Node3 ~]# if
if         ifcfg      ifconfig   ifdown     ifenslave  ifnames    ifup

路径补全:

      以用户指定的字符串为起始路径进行文件名查找,完成补全:

      如果用户指定的开头的字符串能唯一标识某文件,则TAB键可直接补全此文件,否则两次TAB键可显示所有以指定字符串开头的文件名

[root@Node3 ~]# cat /etc/init
init/    init.d/  inittab  
[root@Node3 ~]# cat /etc/inittab

bash的特性之三:命令执行状态返回值

      命令执行成功与否的状态,由bash自己追踪,保存在特殊变量“$?”中

             返回值:0-255    

                             0:成功  

                             1-255:失败

[root@Node3 ~]# echo "abc"
abc
[root@Node3 ~]# echo $?
0
[root@Node3 ~]# echoa "abc"
bash: echoa: command not found
[root@Node3 ~]# echo $?
127
[root@Node3 ~]# ll /etcas
ls: 无法访问/etcas: 没有那个文件或目录
[root@Node3 ~]# echo $?
2

   命令执行成功返回的值都是0,执行错误则根据不同的错误类型,返回不同的值;此所谓幸福的家庭都是相似的,不幸福的家庭各有各的不幸


bash的特性之四:命令行展开    #Linux运维工程师十大常用技巧之一

~:自动展开为当前用户的主目录

~USERNAME:自动展开为指定用户的家目录

{}:以逗号分隔多项,以展开为多项

(x+y)z=xz+yz

(x+y)(m+n)=xm+xn+ym+yn

/tmp/{x,y,z}=/tmp/x,/tmp/y,/tmp/z

/tmp{x,y}{m,n}

练习:

1、创建/tmp下a_c,a_d,b_c,b_d

[root@Node3 ~]# mkdir -pv /tmp/{a_c,a_d,b_c,b_d}
mkdir: 已创建目录 "/tmp/a_c"
mkdir: 已创建目录 "/tmp/a_d"
mkdir: 已创建目录 "/tmp/b_c"
mkdir: 已创建目录 "/tmp/b_d"
[root@Node3 ~]# mkdir -pv {a,b}{_c,_d}
mkdir: 已创建目录 "a_c"
mkdir: 已创建目录 "a_d"
mkdir: 已创建目录 "b_c"
mkdir: 已创建目录 "b_d"
[root@Node3 ~]# mkdir -pv {a,b}_{c1,d1}
mkdir: 已创建目录 "a_c1"
mkdir: 已创建目录 "a_d1"
mkdir: 已创建目录 "b_c1"
mkdir: 已创建目录 "b_d1"

2、创建/tmp/mylinux下

boot

        grub

bin

sbin

        rc.d

               init.d

        sysconfig

                        network-scripts

lib

      modules

lib64

usr

     local

             bin

             sbin

proc

sys

dev

var

      log

      run

      lock

tmp

目录结构。             

[root@Node3 ~]# mkdir -pv /tmp/mylinuc/{boot/grub,bin,sbin,ect/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,usr/local/{bin,sbin},proc,sys,dev,var/{log,run,lock},tmp}
mkdir: 已创建目录 "/tmp/mylinuc"
mkdir: 已创建目录 "/tmp/mylinuc/boot"
mkdir: 已创建目录 "/tmp/mylinuc/boot/grub"
mkdir: 已创建目录 "/tmp/mylinuc/bin"
mkdir: 已创建目录 "/tmp/mylinuc/sbin"
mkdir: 已创建目录 "/tmp/mylinuc/ect"
mkdir: 已创建目录 "/tmp/mylinuc/ect/rc.d"
mkdir: 已创建目录 "/tmp/mylinuc/ect/rc.d/init.d"
mkdir: 已创建目录 "/tmp/mylinuc/ect/sysconfig"
mkdir: 已创建目录 "/tmp/mylinuc/ect/sysconfig/network-scripts"
mkdir: 已创建目录 "/tmp/mylinuc/lib"
mkdir: 已创建目录 "/tmp/mylinuc/lib/modules"
mkdir: 已创建目录 "/tmp/mylinuc/lib64"
mkdir: 已创建目录 "/tmp/mylinuc/usr"
mkdir: 已创建目录 "/tmp/mylinuc/usr/local"
mkdir: 已创建目录 "/tmp/mylinuc/usr/local/bin"
mkdir: 已创建目录 "/tmp/mylinuc/usr/local/sbin"
mkdir: 已创建目录 "/tmp/mylinuc/proc"
mkdir: 已创建目录 "/tmp/mylinuc/sys"
mkdir: 已创建目录 "/tmp/mylinuc/dev"
mkdir: 已创建目录 "/tmp/mylinuc/var"
mkdir: 已创建目录 "/tmp/mylinuc/var/log"
mkdir: 已创建目录 "/tmp/mylinuc/var/run"
mkdir: 已创建目录 "/tmp/mylinuc/var/lock"
mkdir: 已创建目录 "/tmp/mylinuc/tmp"
[root@Node3 ~]# tree /tmp/mylinux             
/tmp/mylinux [error opening dir]

0 directories, 0 files
[root@Node3 ~]# tree /tmp/mylinuc      #把mylinux打成mylinuc,不影响
/tmp/mylinuc
├── bin
├── boot
│   └── grub
├── dev
├── ect
│   ├── rc.d
│   │   └── init.d
│   └── sysconfig
│       └── network-scripts
├── lib
│   └── modules
├── lib64
├── proc
├── sbin
├── sys
├── tmp
├── usr
│   └── local
│       ├── bin
│       └── sbin
└── var
    ├── lock
    ├── log
    └── run

24 directories, 0 files

bash特性之五:命令别名

命令别名的定义方式:alias  ALIAS='COMMAND'   #重启失效

撤销方式:unalias ALIAS

                unalias  -a撤销所有的定义过的命令别名

命令别名与命令名称相同时,可使用\COMMAND,来调用命令本身,而非命令别名,

                                         另一种方式:使用命令程序的绝对路径

命令别名设置只对当前shell有效,要写入配置文件才可以一直有效

alias 定义别名:

[root@Node3 network-scripts]# alias NET='/etc/sysconfig/network-scripts/'
[root@Node3 network-scripts]# 
[root@Node3 network-scripts]# cd
[root@Node3 ~]# cd NET                       #讲路径别名没用
-bash: cd: NET: 没有那个文件或目录
[root@Node3 ~]# alias                        #查看当前shell生效的alias
alias NET='/etc/sysconfig/network-scripts/'
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@Node3 ~]# alias cd NET='cd /etc/sysconfig/network-scripts/'
-bash: alias: cd: not found
[root@Node3 ~]# alias "cd NET"='cd /etc/sysconfig/network-scripts/'  #不能有空格
-bash: alias: `cd NET': invalid alias name
[root@Node3 ~]# alias "CDNET"='cd /etc/sysconfig/network-scripts/'
[root@Node3 ~]# 
[root@Node3 ~]# CDNET
[root@Node3 network-scripts]#

unalias 取消别名

[root@Node3 ~]# alias
alias CDNET='cd /etc/sysconfig/network-scripts/'
alias NET='cd /etc/sysconfig/network-scripts/'
alias cd_net='cd /etc/sysconfig/network-scripts'
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@Node3 ~]# unalias NET
[root@Node3 ~]# unalias cd_net
[root@Node3 ~]# alias
alias CDNET='cd /etc/sysconfig/network-scripts/'
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@Node3 ~]# alias cdnet
-bash: alias: cdnet: not found
[root@Node3 ~]# alias CDNET
alias CDNET='cd /etc/sysconfig/network-scripts/'

[root@Node3 ~]# unalias -a
[root@Node3 ~]# alias

bash特性之六:命令引用

bash支持三类引用:

     强引用:‘’     “所见即所得”,单引号内的内容不能被替换

     弱引用:“”        双引号的内容可以被替换

     命令引用:``,$()     引用一个命令的执行结果,而非命令本身 

引用变量:

[root@Node3 ~]# echo ${name}

[root@Node3 ~]# name=xj
[root@Node3 ~]# echo ${name}
xj
[root@Node3 ~]# echo $name        #引用变量是{}一般可省略
xj
[root@Node3 ~]# echo "$name"
xj
[root@Node3 ~]# echo '$name'
$name
[root@Node3 ~]# echo "$namesb"   #此时就不能省略,省略的话,引用的是变量namesb

[root@Node3 ~]# echo "{$name}sb"
{xj}sb

a=x,b=y,a=b怎么输出a=y?

[root@Node3 ~]# a=1
[root@Node3 ~]# b=2
[root@Node3 ~]# a=b
[root@Node3 ~]# echo ${!a}
2

命令结果的引用:

[root@Node3 ~]# echo "`date '+%F %T'`"
2016-12-04 20:02:44
[root@Node3 ~]# echo '`date '+%F %T'`'
`date +%F %T`

将一个命令赋值给一个变量,怎么运行这个命令呢(将字符串解析成命令来执行)?

[root@Node3 ~]# sb="date +'%F-%T'"
[root@Node3 ~]# echo `$sb`
'2016-12-04-20:14:04'
[root@Node3 ~]# sb='date +'%F-%T''
[root@Node3 ~]# echo `$sb`
2016-12-04-20:14:27
[root@Node3 ~]# eval $sb
2016-12-04-20:18:15

bash特性之七:文件名通配

文件名中可用的通配符:

*:匹配任意长度的任意字符

?:匹配任意单个字符

[ ]:字符范围,匹配指定字符集合中的任意单个字符

          [a-z](可以匹配大小写的A-Z),[0-9],[a-z0-9],[a-z0-9_]

[^]:字符范围,匹配除指定字符集合中的任意单个字符

           [^a-z],[0-9],[^a-z0-9]

字符集合表示方式:

     所有的小写字母:[:lower:]

     所有的大写字母:[:upper:]

     所有的字母:[:alpha:]

     所有数字[:digit:]

     所有的字母和数字:[:allnum:]

     所有的标点符号:[:punct:]

     所有的空白字符:[:space:]

[^[:lower:]]除小写字母外所有字母

【linux基础】04、bash特性_Linux


bash特性之八:输入、输出重定向管道

1、概念理解

程序:指令+数据=算法+数据结构

数据输入的方式:交互式,文件,进程

数据输出的方式:监视器,文件,进程

标准输入(stdin):0  键盘

标准输出(stdout):1 监视器

错误输出(stderr):2 监视器

每个文件被进程打开都有一个唯一的描述符:file descriptor(fd) 文件描述符

0,1,2就是文件描述符

正常输出和错误是两个不同的数据流


重定向

输出重定向>,>>

    COMMAND > NEW_POSTION    覆盖重定向,会清空文件中原有的数据   

                                                       危险操作,可使用set -c打开bash内置功能,拒绝重定向覆盖文件,相反操作为set +c

   COMMAND >> NEW_POSTION    追加重定向,新数据会被附加在原有文件数据的后面 

错误输出重定向2>,2>>

正确和错误输出可以保存在同一个文件中: 

    COMMAND >|>> NEW_POSTION  2>|>> NEW_POSTION1    #这个用的很少

    COMMAND > NEW_POSTION   2>&1    #这个用的也很少,而且后面的后面错误重定向只能用>,用>>会报错,错误重定向是否覆盖和前面的标准输出重定向是否覆盖一致

  COMMAND &> NEW_POSTION      #用这个

  示例:       

[root@Node3 src]# echo "aaa"
aaa
[root@Node3 src]# echo "aaa" > test
[root@Node3 src]# cat test
aaa
[root@Node3 src]# echo "bbb" > test
[root@Node3 src]# cat test
bbb
[root@Node3 src]# echo "ccc" >> test
[root@Node3 src]# cat test
bbb
ccc
[root@Node3 src]# echoa "ddd" > test
-bash: echoa: command not found
[root@Node3 src]# echoa "ddd" 2> test
[root@Node3 src]# cat test
-bash: echoa: command not found
[root@Node3 src]# echoa "ddd" 2>> test
[root@Node3 src]# cat test
-bash: echoa: command not found
-bash: echoa: command not found
[root@Node3 src]# set -c
-bash: set: -c: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
[root@Node3 src]# set -C
[root@Node3 src]# echo "ddd" 2> test
-bash: test: cannot overwrite existing file
[root@Node3 src]# echo "ddd" > test
-bash: test: cannot overwrite existing file
[root@Node3 src]# set +C
[root@Node3 src]# echo "ddd" 2> test
ddd

清空文件:

[root@Node3 src]# cat test
aaa
[root@Node3 src]# echo > test
[root@Node3 src]# cat test

[root@Node3 src]# > test

输入重定向:<

    COMMAND < NEW_IN        #只能<,<<就变成下面的模式了

    COMMAND << EOF            #只能<<

           Here Document

           EOF

 COMMAND >> FILENAME <<EOF    #文件名前面的>>和>都可以,

         Here Document

          EOF

[root@Node3 src]# cat
^C
[root@Node3 src]# cat < test
aaa

[root@Node3 src]# cat << EOF
> aaaaaa
> bbbbbb
> 
> ccccccc
> EOF
aaaaaa
bbbbbb

ccccccc

[root@Node3 src]# cat << a  #任意字符都行,只要1个开头,1个结尾就行  #写脚本时经常用到
> nib
> ddd
> a
nib
ddd

[root@Node3 src]# cat >> sb << EOF
> nihao
> heelo
> 
> world
> eof
> EOF
[root@Node3 src]# ls
1  &1  grub.conf  mariadb-10.1.16-linux-x86_64.tar.gz  sb  test  test1  test2  test.sh
[root@Node3 src]# cat sb
nihao
heelo

world
eof

管道  

   管道是一个固定大小的缓冲区,大小为1页,即4K字节。  

   也是输出重定向的一种,讲输出重定向给文件是用>或>>,重定向给进程是用管道|

COMMAND1|COMMAND2|COMMAND3|、、、

[root@localhost ~]# who
root     tty1         2015-08-17 14:09
root     pts/1        2015-08-20 09:01 (172.16.11.84)
root     pts/3        2015-08-20 09:26 (172.16.11.84)
[root@localhost ~]# who|wc -l
3
[root@Node3 src]# who|wc -l|wc     #管道可以使用多次
      1       1       2
[root@Node3 src]# head -10 /etc/passwd|tail -1
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

多道输出

tee

    tee [OPTION]... [FILE]...

         从标准输入读入数据,输出到标准输出并保存在文件中

[root@localhost ~]# cat /etc/issue|tee /tmp/tee.out
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]# cat /tmp/tee.out
CentOS release 6.5 (Final)
Kernel \r on an \m

[root@localhost ~]#

练习:

【linux基础】04、bash特性_Linux_02