- 硬件、内核与shell
 - 通过shell将我们输入的命令和内核通信,让内核可以控制硬件正确无误的工作
 - shell只是提供用户操作系统的接口
 - 狭义的shell是指命令行方面的软件;广义的shell包括图形界面的软件
 
- bash
 - 全称Bourne Again SHell
 - 是Bourne Shell的增强版本
 
- 查询当前linux可用的shell(/etc/shells文件)
 - 至少有以下几个
 - /bin/sh:已为bash取代
 - /bin/bash:默认shell
 - /bin/ksh:Kornshell,兼容于bash
 - /bin/tcsh:整合C Shell,提供更多功能
 - /bn/csh:已被tcsh取代
 - /bin/zsh:基于ksh,功能更强大
 -  
 - 系统某些服务运行中会通过该文件查询用户可用的shells
 
- 用户登录取得的shell
 - bash shell的功能
 - 当前linux的标准shell
 - 命令记忆
 - 默认记忆1000个命令
 - 这一次登录的命令会暂存到临时内存中
 - 注销后会把最近的HISTSIZE条命令记录在~/.bash_history文件中
 - 如果同时打开多个bash,只有最后注销的bash的命令会写入文件中
 - 登录后系统会主动读取~/.bash_history文件
 - 但这个功能也有可能会被黑客利用,所以记忆的命令条数最好少一些
 - history n
 - 列出最近的n条命令
 - 若不指定n,则为内存中的全部记忆
 
- history -c
 - history [-raw] histfiles
 - -r:将histfiles的记录读取到当前shell的history记忆中
 - -a:将此次登录新增的history记忆加入histfiles中
 - 若不给出histfiles,默认写入~/.bash_history
 
- -w:将目前的所有history记忆另存到histfiles中
 - 若不给出histfiles,默认写入~/.bash_history
 
- 快速执行history中的命令
 - !number
 - !command
 - 执行histroy中最近的一条开头为command的命令
 
- !!
 
- 命令与文件补全
 - [tab]接在命令的第一个字后面为命令补全
 - [tab]接在命令的第二个字后面为文件补全
 
- 命令别名设置(alias)
 - 直接输入alias可以列出目前所有的命令别面
 - 设置
 - 如:alias lm='ls -al'
 - 则lm命令代表了ls -al
 
- 取消
 
- 作业控制、前后台控制(job control, foreground, background)
 - 程序脚本(shell script)
 - 通配符(wildcard)
 
- type:bash内置命令
 - 主要功能:找出“执行文件”(类似which)
 - 基本语法:type [-tpa] name
 - 不带参数:显示name为外部命令或是bash内置命令
 - -t:只以下列字眼显示命令的意义
 - file:外部命令
 - alias:命令别名
 - builtin:bash内置命令
 
- -p:只name为外部命令时才显示完整文件名
 - -a:列出PATH路径中所有含name的命令(包括alias)
 
- 多行命令
 - 用反斜杠(\)转义回车[Enter],使命令可以多行书写
 
- 变量
 - 查看所有变量:set
 - 包括环境变量和用户自定义变量
 - 常见系统变量(以下变量不是环境变量,但与bash的操作环境有关)
 - PS1:命令提示符的格式
 - 设置与格式化字符串类似,有以下特殊符号
 - \d:“星期 月 日”的日期格式
 - \H:完整主机名
 - \h:仅取主机名的第一个字段(以小数点 . 为分隔符)
 - \t:显示24小时制时间“HH:MM:SS”
 - \T:显示12小时制时间“HH:MM:SS”
 - \A:显示24小时制时间“HH:MM”
 - \@:显示12小时制的“am”“pm”
 - \u:当前用户名
 - \v:当前bash信息
 - \w:完整工作目录名
 - \W:工作目录的最后一个目录名,通过basename函数
 - \#:登录以来执行的第几个命令
 - \$:提示符,root的#和一般用户的$
 
- $:当前shell的PID
 - ?:上一个执行命令的回传码
 - OSTYPE,HOSTTYPE,MACHTYPE
 
- 环境变量
 - 一般用大写字符表示
 - 查看环境变量:env
 - 常见环境变量
 - HOME:用户的主文件夹
 - SHELL:当前使用的shell
 - HISTSIZE:历史命令记忆条数
 - MAIL:邮件信箱文件
 - PATH:执行文件查找路径
 - LANG:语系数据
 - RANDOM:产生一个0~32767的随机数
 
- 显示:echo
 - 设置:直接用等号赋值
 - myname=YaHei
 - 若变量未设置,则默认内容为“空”(与空字符串('')不同)
 - 规则:
 - 等号两边不能有空格
 - 只能是英文字母或数字,首字符不能为数字
 - 若变量内容有空格,需要用双引号或单引号包含起来
 - 双引号:保留特殊字符的特性
 - 单引号:引号内的内容只做纯文本处理
 
- 可用反斜杠(\)转义特殊字符
 - 引用其他命令的信息
 - 可将命令包含在反引号(``)内
 - 也可以将命令包含在$()内
 - 如:version=`uname -r`
 - 或:version=$(uname -r)
 - 建议使用第二种方式
 
- 内容累加
 - "$变量"累加内容
 - ${变量}累加内容
 - 如:PATH="$PATH":/home/bin
 - 或:PATH=${PATH}:/home/bin
 - 即将“:/home/bin”累加到变量PATH中
 
- 转换为环境变量:export
 - 不带参数表示显示所有环境变量
 - 以供父进程或其他子进程使用
 - 子进程会继承父进程的环境变量,而不会继承自定义变量
 - export PATH
 
- 取消:unset
 
- 语系变量(locale)
 - 显示当前支持的所有语系
 - 显示当前各种环境采用的编码
 - 可以直接通过改变某个环境对应的语系变量
 - 也可以直接通过设置LANG或者LC_ALL直接改变所有环境的编码
 - 语系文件都放置在/usr/lib/local/目录中
 - 整体系统默认的语系定义/etc/sysconfig/i18n
 
- 有效范围
 - “环境变量”类似于“全局变量”
 - “自定义变量”类似于“局部变量”
 - 变量的内存配置关系
 
- 键盘读取:read
 - 基本语法:read [-pt] variable
 - -p:提供提示符
 - -t:指定等待输入的秒数
 
- 声明类型:declare或typeset
 - declare和typeset是一样的
 - 基本语法:declare [-aixr] variable
 - 不带参数:显示所有变量名称和内容
 - -a:数组(array)
 - -i:整型(integer)
 - -x:环境变量
 - -r:只读(readonly),通常需要注销重新登录才能恢复
 
- bash变量基本定义
 - 默认类型为字符串
 - 数值运算的精读最多仅能达到整数类型
 
- 文件系统及程序的限制:ulimit
 - 基本语法:ulimit [-SHacdfltu] [配额]
 - -H:hard limit,限制值
 - -S:soft limit,警告值
 - -a:不带配额,列出所有限制
 - -c:core file,限制内核文件的最大容量
 - 内核文件core file,进程错误时会将内存中的信息写成文件
 
- -f:当前shell可创建的最大文件容量(单位kb)
 - -d:进程可用最大断裂内存(segment)容量
 - -l:可用于锁定(lock)的内存量
 - -t:可使用的最大CPU时间(秒)
 - -u:单一用户可以使用的最大进程数
 -  
 - 复原ulimit设置
 - 注销再登录
 - 也可以直接重新以ulimit设置
 - 但一般用户如果用了ulimit -f,则只能继续减小文件容量而不能增加
 
- 变量的删除、替换
 - ${变量#关键字}:    从前向后搜索,删除第一个符合关键字的最短数据(非贪婪)
 - ${变量##关键字}:  从前向后搜索,删除第一个符合关键字的最长数据(贪婪)
 - ${变量%关键字}:   从后向前搜索,删除第一个符合关键字的最短数据(非贪婪)
 - ${变量%%关键字}:从后向前搜索,删除第一个符合关键字的最长数据(贪婪)
 -  
 - ${变量/旧字符串/新字符串}:替换第一个匹配项
 - ${变量//旧字符串/新字符串}:替换所有匹配项
 
- 变量的测试、设置
 - 变量设置为“空”和“空字符串”是不同的概念
 - var和str为变量,expr为字符串常量
 - 不影响str
 | 设置方式 | str为空 | str为空字符串 | str为非空字符串 | 
| var=${str-expr} | var=expr | var= | var=$str | 
| var=${str:-expr} | var=expr | var=expr | var=$str | 
| var=${str+expr} | var= | var=expr | var=expr | 
| var=${str:+expr} | var= | var= | var=expr
  | 
- 可能影响str
 设置方式  | str为空 | str为空字符串 | str为非空字符串 | 
| var=${str=expr} | str=expr 
var=expr | str不变 
var= | str不变 
var=$str | 
| var=${str:=expr} | str=expr 
var=expr
  | str=expr 
var=expr | str不变 
var=$expr
  | 
| var=${str?expr} | expr输出到stderr | var= | var=$str | 
| var=${str:?expr} | expr输出到stderr | expr输出到stderr | var=$str | 
- 命令查找顺序
 - 相对/绝对路径的命令
 - alias命令别名
 - bash内置命令(builtin)
 - $PATH中查找的第一个命令
 
- bash的登录和欢迎信息
 - 登录信息
 - /etc/issue文件
 - 普通的字符和特殊字符
 - 特殊字符
 - \d:本机端日期
 - \l:第几个终端机接口
 - \m:硬件等级
 - \n:主机网络名称
 - \o:domain name
 - \r:操作系统版本
 - \t:本机端时间
 - \s:操作系统名称
 - \v:操作系统版本
 
- 用telnet连接主机时,显示的是/etc/issue.net而不是/etc/issue
 
- 欢迎信息
 - /etc/motd文件
 - 无特殊字符,直接给出文字信息
 
- bash配置文件
 - login shell:通过完整的登录流程取得bash
 - non-login shell:不需要重复登录的方式取得bash,如图形化界面下直接打开终端及其子进程
 - 关于su命令
 - 默认情况下取得的是non-login shell
 - 加入参数-或-l或--login后取得的是login shell
 
- login shell只读取两个文件
 - /etc/profile:系统整体设置
 - 包含变量PATH、MAIL、USER、HOSTNAME、HISTSIZE等变量
 - 并以此再去调用以下数据
 - /etc/inputrc:记录自定义输入的按键功能、热键等有无声音功能等
 - /etc/profile.d/*.sh:(需要r权限)规定接口的颜色、语系、部分命令别名等
 - /etc/sysconfig/i18n:(是由/etc/profile.d/lang.sh调用的)语系的相关设置
 
- ~/.bash_profile或~/.bash_login或~/.profile:用户个人设置
 - 按照上述顺序读取,只读其中一个
 - 只是为了照顾用户的习惯
 
- non-login shell只读取~/.bashrc文件
 - 不过有的发行版也会去读取/etc/bashrc文件或其他名字的文件
 - 其中定义出以下数据
 - 依据不同UID规定umask
 - 依据不同的UID福鼎提示符(即PS1)
 - 调用/etc/profile.d/*.sh
 
- 其他配置文件
 - /etc/man.config
 - 定义了man page的路径
 - 有时候手动安装程序,需要将/usr/local/程序名/man加入到该配置文件中
 
- ~/.bash_history
 - ~/.bash_logout
 - 记录了注销bash后系统需要完成的操作
 - 默认只进行清屏操作
 - 还可以加入备份、清空暂存盘等操作
 
- 读入方式:source命令
 - 如果修改了配置文件而不像注销重启
 - 可以直接用source命令重新读取配置文件
 
- 终端机环境设置:stty,set
 - stty(setting tty):终端机按键操作设置
 - 基本语法1:stty [-a]
 - 基本语法2:stty 操作 按键
 - 其中^一般代表Ctrl组合键
 - ^?代表[Backspace]
 
- 常见操作:
 - eof:(默认^D)结束输入
 - erase:(默认^?)向后删除字符
 - intr:(默认^C)送出一个interrupt中断信号给当前程序
 - kill:(默认^U)删除目前命令行上所有文字
 - quit:(默认^\)送出一个quit信号给当前程序
 - start:(默认^Q)在某个进程停止后,重启他的输出
 - stop:(默认^S)停止目前屏幕的输出
 - susp:(默认^Z)送出一个terminal stop信号给当前进程,即暂停当前命令
 
- set:终端机功能设置
 - 基本语法:set [-uvCHhmBx]
 - -u:(默认关闭)使用未设置变量时会显示错误信息
 - -v:(默认关闭)讯息输出前会先显示讯息的原始内容
 - -x:(默认关闭)命令被执行前会显示命令内容(前面有++符号)
 - -h:(默认开启)与历史命令有关
 - -H:(默认开启)与历史命令有关
 - -m:(默认开启)与工作管理有关
 - -B:(默认开启)与括号[]的作用有关
 - -C:(默认关闭)使用>等数据流重定向时,若文件存在则不会被覆盖
 -  
 - 若要取消设置,则将减号(-)改为加号(+)即可
 
- 通配符(wildcard)
 - 注意,通配符与正则表达式不同,但有点类似
 - *:代表0~∞个任意字符
 - ?:代表一个任意字符
 - []:代表一个括号内的任意字符,可以用减号(-)指定范围,可以用^符号表示反向选择
 
- bash下的特殊字符
 - #:批注
 - \:转义
 - |:管道
 - ;:连续命令的分隔符
 - ~:用户主文件夹
 - $:变量前导符
 - !:逻辑“非”(not)
 - /:目录路径分隔符
 - >,>>:数据流重定向,输出导向
 - <,<<:数据流重定向,输入导向
 - '':字符串,不置换变量,纯文本
 - "":字符串,可置换变量
 - ``:可执行命令,也可用$()
 - ():子shell的起止
 - {}:命令块的起止
 
- 数据流重定向
 - 标准输入输出
 - standard output:输出命令回传的正确信息
 - standard error output:输出命令回传的错误信息
 -  
 - 标准输入(stdin):代码0,<或<<
 - 标准输出(stdout):代码1,>或>>
 - 标准错误输出(stderr):代码2,2>或2>>
 
- /dev/null:垃圾桶黑洞设备
 - 可以吃掉任何导向这个设备的信息
 - 比如想要忽略错误信息:
 - find /home -name .bashrc > list_right 2> /dev/null
 
- 将stdout和stderr分别写到两个文件去
 - find /home -name .bashrc >list_right 2> list_error
 
- 将stdout和stderr写到同一个文件去
 - find /home -name .bashrc > list 2>&1
 - find /home -name .bashrc &> list
 
- 用cat命令创建一个文件
 - 指定输入某段字符后即可离开(无需ctrl + d)
 - cat > file << "eof"
 - 那么当file读到eof时即会离开,但是"eof"并不会写入文件中
 
- 用stdin代替键盘输入来用cat命令创建一个文件
 - 重定向的常用情况
 - 保存屏幕输出的信息
 - 不希望后台程序的信息干扰屏幕输出
 - 保存某些例行程序的执行结果
 - 忽略某些错误信息
 - 分别获取错误信息和正确信息
 
- 命令执行的判别依据:; 、, 、&& 、 ||
 - linux下的命令是从左至右执行的
 - 一次执行多条命令(;)
 - 如sync; sync; shutdown -h now
 
- 依据命令回传码($?)判断是否执行
 - cmd1 && cmd2:只有cmd1正确执行才执行cmd2
 - cmd1 || cmd2:只有cmd1不能正确执行才执行cmd2
 - 有趣的是,对于($?),0表示正确执行,非0表示错误执行,这点与编程语言不同
 
- cmd1 && cmd 2 || cmd3
 - 以cmd1为条件,若正确执行则执行cmd2,若错误执行则执行cmd3
 - 类似C语言的cmd1?cmd2:cmd3;
 
- cmd1 || cmd2 && cmd3
 - 以cmd1为条件,若正确执行则执行cmd3,若错误执行则执行cmd2
 - 若cmd2正确执行,则接着执行cmd3
 
- 管道命令(pipe)
 - 嗯……类似于过滤筛选功能
 - (|)仅能处理前一个命令回传的正确信息,不能处理错误信息,其后的命令必须是管道命令(即能处理stdin的命令)
 - 文本命令
 - 选取命令:cut、grep
 - cut:取下各一行的匹配部分
 - 基本语法1:cut -d '分隔符' -f fields
 - 用于有分隔符的信息
 - -d:指定分隔字符,注意(' ')只能匹配单一空格不能匹配多个空格
 - -f:将-d分隔的结果中的第fields段取出(从1记起),多个字段用逗号(,)隔开
 
- 基本语法2:cut -c 字符范围a-b
 - 用于排列整齐的信息
 - 取出每一行的第a-b的信息,若从头取则省略a,若取到底则省略b
 
- 如:
 - export | cut -c 12-
 - last | cut -d ' ' -f 1
 
- grep:取下匹配的所有行
 - 基本语法:grep [-acinv] [--color=auto] '查找字符串' filename
 - -a:将binary文件以text文件的方式查找
 - -c:计算找到的“查找字符串”的次数
 - -i:忽略大小写
 - -n:输出行号
 - -v:反向选择
 - --color=auto:将找到的关键词部分加上颜色显示
 
- 如:
 - last | grep 'root'
 - last | grep 'root' | cut -d ' ' -f 1
 
- 排序命令:sort、wc、uniq
 - sort:排序
 - 基本语法:sort [-fbMnrtuk] [file or stdin]
 - -f:忽略大小写
 - -b:忽略最前面的空格部分
 - -M:以月份的名字来排序(JAN, DEC等)
 - -n:用纯数字来排序(默认根据字符,即'20'<'3')
 - -r:反向排序
 - -u:uniq,重复数据只出现一次
 - -t:分隔符,默认用[tab]
 - -k:以(分隔符)指定字段排序(从1记起)
 
- 如:
 - cat /etc/passwd | sort -t ':' -k 3
 
- uniq:重复数据仅显示一次
 - 基础语法:uniq [-ic]
 - 如:
 - last | cut -d ' ' -f 1 | sort | uniq -c
 
- wc:统计
 - 基本语法:wc [-lwm]
 - 不带参数:分别列出行数、字数、字符数
 - -l:仅列出行数
 - -w:仅列出字数
 - -m:仅列出多少字符
 
- 双向重定向:tee
 - 同时将数据流送到文件和屏幕
 - 基本语法:tee [-a] file
 - 如:
 - last | tee last.list | cut -d ' ' -f 1
 - 将数据流存入last.list
 - 将数据流通过管道cut处理后输出到屏幕
 
- 字符转换命令:tr、col、join、paste、expand
 - tr:删除或替换部分文字
 - 基本语法:tr [-ds] SET1 [SET2]
 - 不带参数:用SET2取代SET1
 - -d:删除SET1
 - -s:替换掉重复的字符
 - 可用正则表达式
 
- 如:
 - last | tr '[a-z]' '[A-Z]'
 - cat /root/passwd | tr -d '\r' > /root/passwd.linux
 - \r是tr命令中定义的特殊字符,代表DOS断行字符^M
 
- col:将tab转换为空格、去除转义字符(将man page转存为文本文件)
 - 基本语法:col [-xb]
 - -x:将tab转换成对等的空格键
 - -b:在文字内有反斜杠(\)时,仅保留反斜杠最后接的那个字符(去除转义字符?)
 
- 如:
 - man col | col -b > /root/col.man
 
- join:将两个文件中的相同数据的行拼在一起
 - 基本语法:join [-ti12] file1 file2
 - -t:分隔符,拼起来的数据也用该分隔符隔开,默认为空格
 - -i:忽略大小写
 - -1:后接第几个字段,代表file1的分析字段
 - -2:后接第几个字段,代表file2的分析字段
 
- 如:
 - join -t ':' -1 4 /etc/passwd -2 3 /etc/group
 
- 用join之前需要对文件进行排序(sort),否则可能略过某些数据
 
- paste:将两个文件的对应行直接贴在一起
 - 基本语法:paste [-d] file1 file2 .......(可以多个文件)
 - -d:分隔符,默认[tab]
 - file1和file2可以写成-,代表stdin
 
- expand:将tab转换为任意个数空格(可不对等)
 - unexpand:将指定数量的空格转换为tab
 
- 切割命令:split
 - 基本语法:split [-bl] file PREFIX
 - -b:按大小切割,后接单个文件大小,可加单位b,k,m等
 - -l:按行切割,后接行数
 - PREFIX:前导符,作为切割文件的前导文字
 - 如PREFIX为xxx时
 - 切割后文件会依次命名为xxxaa, xxxab, xxxac依次类推(这样至少可以表示26*26个文件)
 
- 合并切割文件
 - 直接用数据流重定向即可
 - cat PREFIX* >> file
 
- 参数代换:xargs
 - 常用于不支持管道命令的命令
 - 读入stdin数据,以空格或断行符将数据分隔成command的arguments
 - 基本语法:xargs [-Oepn] command
 - -O:将stdin中的特殊字符还原成一般字符
 - -e:后接终止字符串,当分析到该字符串时即停止工作,该字符串不会作为参数代入
 - -p:在执行每个命令参数时,会询问是否执行“.........”command
 - -n:后接个数,表示每次命令使用几个参数
 
- 如:
 - find /sbin -perm +7000 | xargs ls -l
 
- 关于减号-
 - 代表stdin或stdout
 - 如:
 - tar -cvf - /home | tar -xvf -
 - 将/home打包到-(stdout)
 - 再将-(stdout)解压出来