Bash 基础特性

命令别名
  alias 显示当前shell中定义的所有别名
  alias 别名='原始命令'
  unalias 别名 取消定义的别名
在命令前加使用命令本身,而不是别名(或者使用绝对路径执行命令使用命令本身)
 仅对当前用户生效:~/.bashrc
 对所有用户生效:/etc/bashrc
 配置文件配置后不会立即生效需要重新运行配置文件
   source /etc/bashrc
  . /etc/bashrc

文件名通配(globbing)
  * 匹配任意长度的任意字符
  ? 匹配任意单个字符
 [^] 匹配指定字符范围外的任意单个字符
  [ ] 匹配指定字符范围内的任意单个字符,不区分大小写
  [[:upper:]] 大写字母[A-Z]
  [[:lower:]] 小写字母[a-z]
  [[:alpha:]] 所有字母[A-Za-z]
  [[:digit:]] 所有数字[0-9]
  [[:alnum:]] 字母+数字[0-9A-Za-z]
  [[:space:]] 空格
  [[:punct:]] 标点符号 特殊字符

命令历史
  bash默认会保持此前执行过的命令列表,当前shell进程的保存在缓冲区中,缓冲区中的命令会在shell退出时保存在文件.bash_history;使用上下箭头键可以翻看此前执行过的命令:
  history命令用法
  选项:
  -c  清空命令历史
  -d 删除历史中指定的命令 history -d 3
  #  显示最近的#条历史命令 history 5
  -a 追加本次会话新执行的命令历史列表至历史文件
  -n 读取所有在会话列表中的,但是不在当前会话列表中的
  -r 读历史文件附加到历史列表
  -w 保存历史列表到指定的历史文件
  -p 展开历史参数成多个行,但不存在历史列表中
  -s 展开历史参数成一行,附加在历史列表后 (伪造命令)

命令历史相关的环境变量
  HISTSIZE 历史命令中可以保存的个数
  HISTFILE 历史命令保存的文件
  HISTFILESIZE 历史文件中可以保存的命令个数
  HISTTIMEFORMAT="%F %T" 显示时间格式
  HISTCONTROL 控制命令历史的生成机制
      ignoredups  忽略记录重复的命令,连续的相同命令
      ignorespace 以空格开头的命令不会被记录
      ignoreboth 同时具有上面两种特性
    erasedups  删除重复命令

  !#    执行history中第#条的命令
 !!    上一条命令
 !-#    表示执行命令列表中的倒数第#条命令
 !$     执行上个命令中的最后一个参数:ESC,.
 !string 执行命令列表中的最近一次以string开头的命令

命令及路径补全
  内部命令:bash程序本身提供的命令
 外部命令:在系统某路经下有一个可执行程序
 命令补全:是通过在PATH环境变量定义的路径中从左往右搜索补全
 路径补全:在给出的打头路径下补全,如果没有打头路径,则为当前目录

Bash快捷键
  Ctrl+A 把光标移动到命令行开头
 Ctrl+E 把光标移动到命令行结尾
 Ctrl+C 非正常中断—终止前台进程
 Ctrl+D 输入完成的正常信号(退出当前终端)
 Ctrl+G 终端声效
 Ctrl+J 换行—与Enter键功能相同
 Ctrl+L 换页—使bash清屏,也可以用来刷新屏幕,对于许多基于屏幕的语言程序而言,如vi,如果意外的信息弄乱了显示,使用Ctrl+L可以让程序刷新屏幕,正确的重绘屏幕
 Ctrl+S 锁住终端显示
 Ctrl+Q 解锁终端显示
 Ctrl+H 后退一格—删除前一个字符
 Ctrl+W 删除或剪切光标前的单词
 Ctrl+K 删除或剪切光标之后的内容
 Ctrl+U 删除光标前的所有内容(如果密码输入错误了,可以用Ctrl+U清除)
 Ctrl+Y 粘贴ctrl+U或ctrl+K剪切的内容
 Ctrl+Z 挂起前台进程,转入后台运行(fg调回命令)
 Ctrl+R 在历史命令中搜索
 Ctrl+P 重复上一条命令
 ESC+T  调换光标前的两个单词
 Ctrl+向右箭头  光标移动到下一个词首
 ESC+F     光标移动到下一个词首
 Ctrl+向左箭头 光标移动到上一个词首 
 ESC+B     光标移动到上一个词首
 ESC+.     调用上一条命令的参数

命令行展开
 ~ 展开为当前用户的家目录
  ~USERNAME 展开为指定用户的家目录
  { } 里面是一个以逗号分割的列表,并将其展开为多个路径
  例如:/tmp/{a,b} 相当于 /tmp/a、/tmp/b

多命令执行
  复合式: 命令会一个接一个的执行
    COMMAND1;COMMAND2;COMMAND3;...
  date; who | wc -l

 子shell:所有的输出看做一个整体,都被发送给单个STDOUT和STDERR
  (date; who | wc -l ) >>/tmp/trace
演示:
[root@centos7 ~]# date;who
2017年 02月 19日 星期日 11:51:24 CST
root tty1 2017-02-19 11:50
root pts/0 2017-02-19 11:02 (192.168.1.100)

# 按顺序执行
[root@centos7 ~]# date;who |wc -l
2017年 02月 19日 星期日 11:50:21 CST
2

# 为子shell,括号中的执行结束后,再管道
[root@centos7 ~]# (date;who) |wc -l
3

Bash特性引用
 '' 强引用,不会进行变量替换
 "" 弱引用,会进行变量替换
 `` 命令替换,引用命令的执行回显结果,另外一种方式$()
 ${变量名} 变量替换,或者直接"$变量名"

I/O重定向及管道
  I/O设备在系统起来的时候注册IO端口(这些端口其实就是寄存器),注册IO端口就是给这些寄存器一个地址,CPU通过这些寄存器地址跟IO设备交互

 Linux系统中标识用户用UID,标识组用GID,标识进程用PID;都是通过名称解析将名字转换成ID;同样的系统在运行的时候,会打开很多文件,这些打开的文件也有ID,通常叫文件描述符(windows中叫文件句柄):file descriptor简写为FD,是内核用来追踪当前打开的文件属性;文件描述符是内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符;读写文件也需要使用文件描述符来指定待读写的文件

 INPUT:标准输入/dev/stdin  文件描述符为0  标准默认输入是键盘
 OUTPUT:标准输出/dev/stdout  文件描述符为1 标准默认输出是显示器
  标准错误输出:/dev/stderr  文件描述符为2 标准默认错误输出是显示器

I/O重定向:改变标准的输入和输出位置就是I/O重定向
 输入重定向 <、<<
   <  输入重定向
  << 此处创建文件,常用于在脚本中创建文件或生成菜单
  创建文件例子:将输出信息保存到/tmp/filename文件
    cat > /tmp/filename << EOF
    a:show user info
    b:show disk info
    c:show cpu info
    EOF      
   生成菜单例子:EOF为起始结束符,可以用任意字符,但是起始结束符要一样
    cat << EOF
    a:show user info
    b:show disk info
    c:show cpu info
    EOF
   
  输出重定向 >、>>
  >  以覆盖的方式,把命令的正确输出重定向到指定的文件或设备
  >> 以追加的方式,把命令的正确输出重定向到指定的文件或设备

set命令作用主要是显示系统中已经存在的shell变量,以及设置shell变量的新变量值。使用set更改shell特性时,符号"+"和"-"的作用分别是打开和关闭指定的模式。set命令不能够定义新的shell变量。
  set -C 禁止覆盖重定向至已经存在的文件
  set +C 关闭上述特性
  >|    在-C 特性下,强制使用覆盖重定向

  /dev/null:bit bucket 位桶,所有输入到该设备的信息都会被丢弃,在编写脚本不需要命令指定的返回结果就可以重定向到该设备

错误重定向:2>、2>>,会输出正确信息
   2>  以覆盖的方式,把命令的错误输出重定向到指定的文件或设备
  2>> 以追加的方式,把命令的错误输出重定向到指定的文件或设备

  同时重定向正确输出和错误输出:
  &>  以覆盖的方式,把命令的正确和错误输出重定向到指定的文件或设备
  &>> 以追加的方式,把命令的正确和错误输出重定向到指定的文件或设备
   command &> /path/to/somefile
   command > /path/to/somefile 2>&1

  正确输出到outfile,错误输出errfile
    command > /path/to/outfile 2>/path/to/errfile

合并多个程序的标准输出
  (ls;who) > /tmp/test.txt

  管道:把前一个命令的输出当下一个命令的输入
    组合目的单一的小程序完成复杂的任务
   command1 | commadn2 | command3 | ......
    command1、commadn2是在当前shell执行的,command3(最后一个命令)第三个命令后是在子shell中运行
tee 分叉输出,命令不会处理,会送到下一个管道
 将输出信息分叉,/etc/passwd的文件内容输出到/tmp/filename;同时给管道的下一个命令wc命令作为输入统计行数
  cat /etc/passwd | tee /tmp/filename | wc -l 

tr命令
  转换或删除字符,tr '集合1' '集合2',必须使用管道输出作为该命令参数
 转换字符:会把第一个字符集的对应转换为第二个字符集中的对应转换
  [root@localhost ~]# echo "hello word" | tr [a-z] [A-Z]
  HELLO WORD
 -d 删除字符集中出现的字符
   [root@localhost ~]# echo "hello word" | tr -d r
   hello wod
 -s 压缩输入中重复的字符
   [root@localhost ~]# echo "GNU is     not    UNIX. Recursive right ?" | tr -s ' ' (去除连续重复的空白字符)
   GNU is not UNIX. Recursive right ? 
 -c 取字符集的补集 

演示:
tr 加选项 -t 和不加的区别,如下:
# 对位替换
[root@centos7 ~]# echo abcde |tr 'a-c' 'A-Z'
ABCde
[root@centos7 ~]# echo abcde |tr 'abc' 'A-Z'
ABCde
[root@centos7 ~]# echo abcde |tr 'abc' 'D-Z'
DEFde
[root@centos7 ~]# echo abcde |tr 'a-c' 'xyz'
xyzde

# 如果SET2对应的位数不及SET1时,会用SET2对应SET1对应的最后一位补全SET1替换位
[root@centos7 ~]# echo abcde |tr 'abcde' 'xyz'
xyzzz
[root@centos7 ~]# echo abcde |tr 'abcd' 'xyz'
xyzze

# 将第一字符集对应的字符转化为第二字符集对应的字符。
[root@centos7 ~]# echo abcde |tr -t 'abcd' 'xyz'
xyzde

# 用空格替换回车换行符
[root@centos7 ~]# ls /root/ |tr ' ' ' '

#处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格
[root@centos7 ~]# echo "xt.,l 1 jr#'[:digit:]'mn2 c*/fe3 uz4" |tr -cd '[:digit:] '
1 2 3 4

#将PATH变量显示在独立的一行
[root@centos7 ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos7 ~]# echo $PATH |tr ':' ' '
/usr/lib64/qt-3.3/bin
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

原文地址:https://www.cnblogs.com/Link-Luck/p/9849279.html