• 硬件、内核与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
    • 记录在/etc/passwd文件的最后一个字段中
  • bash shell的功能
    • 当前linux的标准shell
    • 命令记忆
      • 默认记忆1000个命令
      • 这一次登录的命令会暂存到临时内存中
      • 注销后会把最近的HISTSIZE条命令记录在~/.bash_history文件中
      • 如果同时打开多个bash,只有最后注销的bash的命令会写入文件中
      • 登录后系统会主动读取~/.bash_history文件
      • 但这个功能也有可能会被黑客利用,所以记忆的命令条数最好少一些
      • history n
        • 列出最近的n条命令
        • 若不指定n,则为内存中的全部记忆
      • history -c
        • 清空当前shell的history内容
      • history [-raw] histfiles
        • -r:将histfiles的记录读取到当前shell的history记忆中
        • -a:将此次登录新增的history记忆加入histfiles中
          • 若不给出histfiles,默认写入~/.bash_history
        • -w:将目前的所有history记忆另存到histfiles中
          • 若不给出histfiles,默认写入~/.bash_history
      • 快速执行history中的命令
        • !number
          • 执行history中的第number条命令
        • !command
          • 执行histroy中最近的一条开头为command的命令
        • !!
          • 执行上一条命令
    • 命令与文件补全
      • [tab]接在命令的第一个字后面为命令补全
      • [tab]接在命令的第二个字后面为文件补全
    • 命令别名设置(alias)
      • 直接输入alias可以列出目前所有的命令别面
      • 设置
        • 如:alias lm='ls -al'
        • 则lm命令代表了ls -al
      • 取消
        • 如:unalias lm
    • 作业控制、前后台控制(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
        • ?:上一个执行命令的回传码
          • 成功执行一般回传0
          • 失败则回传非0数,表示错误代码
        • OSTYPE,HOSTTYPE,MACHTYPE
          • 主机硬件与内核的等级
    • 环境变量
      • 一般用大写字符表示
      • 查看环境变量:env
        • 是environment的缩写
      • 常见环境变量
        • HOME:用户的主文件夹
        • SHELL:当前使用的shell
        • HISTSIZE:历史命令记忆条数
        • MAIL:邮件信箱文件
        • PATH:执行文件查找路径
        • LANG:语系数据
        • RANDOM:产生一个0~32767的随机数
          • 通过/dev/random文件
    • 显示:echo
      • echo $PATH
      • echo ${PATH}
    • 设置:直接用等号赋值
      • myname=YaHei
      • 若变量未设置,则默认内容为“空”(与空字符串('')不同)
      • 规则:
        • 等号两边不能有空格
        • 只能是英文字母或数字,首字符不能为数字
        • 若变量内容有空格,需要用双引号或单引号包含起来
          • 双引号:保留特殊字符的特性
            • 即可以在引号内通过$引用变量等
          • 单引号:引号内的内容只做纯文本处理
        • 可用反斜杠(\)转义特殊字符
        • 引用其他命令的信息
          • 可将命令包含在反引号(``)内
          • 也可以将命令包含在$()内
          • 如:version=`uname -r`
          • 或:version=$(uname -r)
          • 建议使用第二种方式
        • 内容累加
          • "$变量"累加内容
          • ${变量}累加内容
          • 如:PATH="$PATH":/home/bin
          • 或:PATH=${PATH}:/home/bin
          • 即将“:/home/bin”累加到变量PATH中
        • 转换为环境变量:export
          • 不带参数表示显示所有环境变量
          • 以供父进程或其他子进程使用
          • 子进程会继承父进程的环境变量,而不会继承自定义变量
          • export PATH
        • 取消:unset
          • unset myname
    • 语系变量(locale)
      • 显示当前支持的所有语系
        • locale -a
      • 显示当前各种环境采用的编码
        • local
      • 可以直接通过改变某个环境对应的语系变量
      • 也可以直接通过设置LANG或者LC_ALL直接改变所有环境的编码
      • 语系文件都放置在/usr/lib/local/目录中
      • 整体系统默认的语系定义/etc/sysconfig/i18n
    • 有效范围
      • “环境变量”类似于“全局变量”
      • “自定义变量”类似于“局部变量”
      • 变量的内存配置关系
    • 键盘读取:read
      • 基本语法:read [-pt] variable
      • -p:提供提示符
      • -t:指定等待输入的秒数
    • 声明类型:declare或typeset
      • declare和typeset是一样的
      • 基本语法:declare [-aixr] variable
      • 不带参数:显示所有变量名称和内容
      • -a:数组(array)
        • 设置
          • var[index]=content
        • 引用
          • 建议用${var[indext]}
      • -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=exprvar=var=$str
        var=${str:-expr}var=exprvar=exprvar=$str
        var=${str+expr}var=var=exprvar=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输出到stderrvar=var=$str
        var=${str:?expr}expr输出到stderrexpr输出到stderrvar=$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]
        • -a:将目前所有stty参数列出
      • 基本语法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>>
        • 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命令创建一个文件
      • cat > file
      • 按下ctrl + d 离开
    • 指定输入某段字符后即可离开(无需ctrl + d)
      • cat > file << "eof"
      • 那么当file读到eof时即会离开,但是"eof"并不会写入文件中
    • 用stdin代替键盘输入来用cat命令创建一个文件
      • cat > file < ~/.bashrc
    • 重定向的常用情况
      • 保存屏幕输出的信息
      • 不希望后台程序的信息干扰屏幕输出
      • 保存某些例行程序的执行结果
      • 忽略某些错误信息
      • 分别获取错误信息和正确信息
  • 命令执行的判别依据:; 、, 、&& 、 ||
    • 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的命令)
    • 文本命令
      • less、more、head、tail等
    • 选取命令:cut、grep
      • cut:取下各一行的匹配部分
        • 基本语法1:cut -d '分隔符' -f fields
          • 用于有分隔符的信息
          • -d:指定分隔字符,注意(' ')只能匹配单一空格不能匹配多个空格
            • cut在处理多空格数据比较吃力
          • -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]
          • -i:忽略大小写
          • -c:进行计数
        • 如:
          • last | cut -d ' ' -f 1 | sort | uniq -c
      • wc:统计
        • 基本语法:wc [-lwm]
          • 不带参数:分别列出行数、字数、字符数
          • -l:仅列出行数
          • -w:仅列出字数
          • -m:仅列出多少字符
    • 双向重定向:tee
      • 同时将数据流送到文件和屏幕
      • 基本语法:tee [-a] file
        • -a:累加的方式(默认覆盖)
      • 如:
        • 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的分析字段
            • 默认-1 1 -2 1
        • 如:
          • join -t ':' -1 4 /etc/passwd -2 3 /etc/group
        • 用join之前需要对文件进行排序(sort),否则可能略过某些数据
      • paste:将两个文件的对应行直接贴在一起
        • 基本语法:paste [-d] file1 file2 .......(可以多个文件)
          • -d:分隔符,默认[tab]
          • file1和file2可以写成-,代表stdin
      • expand:将tab转换为任意个数空格(可不对等)
        • 基本语法:expand [-t] file
          • -t:后接数字,表示一个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)解压出来
\00