Bash Shell介绍
- shell:Shell是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。
- 文字形式shell接口的优势
• 功能完善,且各发行版都使用相同的bash
• .远程管理,文字接口传输速度更快
• 更好地管理主机 - 可以通过/etc/shells文件查看当前系统支持的shell
- Bash Shell功能:
• 命令编修功能(history)
• 命令与文件补全功能(tab)
• 命令别名设定功能(alias)
• 工作控制、前景背景控制(jobs)
• 程序化脚本(shellscripts)
• 通配符:(Wildcard) - type[-tpa] name可以查看指令的类型, -t 显示命令意义,-p如果为外部命令,显示完整文件名,-a根据path变量,将所有含有name的命令都进行罗列,包括别名,不加任何选项时,显示是内建指令还是外部命令。file表⽰为外部命令;alias表⽰该命令为命令别名所配置的名称;builtin表⽰该命令为bash內建命令。
Shell变量
- shell变量的好处
• 影响bash环境的变量:用户成功登录,使用shell,获得bash运行程序;系统通过变量提供数据的存取,或一些环境的参数配置
• 脚本程序中的变量 - 变量取用:echo ${var}或echo $var;
- 变量设定:var=123;bash中,当一个变量未被设定时,也可以访问,预设值是空的。
- 变量设定规则:
• 变量与变量内容以等号连接,等号两边不能有空格
• 变量名称只能是英文字母和数字,不能以数字开头
• 变量内容中如果有空格符,可以使⽤双引号”或者单引号’,将变量内容结合起来,但两者存在区别: 双引号内的特殊字符保持原有特性,单引号内特殊字符仅代表该字符
• 可用’'将特殊字符变为一般字符
• 其他命令的返回值作为变量值的情况,可以使⽤cmd
或 ( c m d ) 。 如 : v e r s i o n = (cmd)。如:version= (cmd)。如:version=(uname -r);
• 增加变量内容:PATH=“$PATH”:/home/bin - 如果该变量需要运⾏与其他⼦程序,则需要以export来使变量成为环境变量:export PATH
- 通常⼤写字符为系统默认变量,⾃⾏配置的变量尽量使⽤⼩写字符,⽅便判断,⾮强制;
- 取消变量使⽤unset,unset var,如:unset myname
- shell中的环境变量:
• 环境变量是指由Shell定义和赋初值的Shell变量,能够被子程序所引用
• Shell用环境变量来确定查找路径、注册目录、终端类型、终端 名称、用户名等。
• 都是全局变量,并可以由用户重新设置。
• env指令查看当前shell环境中的所有环境变量
• export将自定义变量转换成环境变量 - 常用环境变量
• PATH 决定了shell将到哪些目录中寻找命令或程序
• HOME 当前用户主目录
• HISTSIZE 历史记录数
• LOGNAME 当前用户的登录名
• HOSTNAME 指主机的名称
• SHELL 当前用户Shell类型
• LANGUGE 语言相关的环境变量,多语言可以修改此环境变量
• MAIL 当前用户的邮件存放目录 - 环境变量在子程序可见,自定义变量在子程序不可见,可以用eport把自定义变量变为环境变量
- 重要系统变量
• set命令查看所有变量,重要的系统变量包括:
• PS1: 基本提示符,对于root用户是#,对于普通用户是$
• $:当前shell的进程id
• ?:上一个指令所回传的值,指令执行成功回传0,发生错误回传非0错误代码 - read -p “input a num” num;从键盘读取变量num,-t后加等待的秒数
- declare定义变量类型:-a将变量定义成数组,-i定义为整数,-x定义为环境变量,-r设为只读,不可更改
命令的别名与历史命令
- 添加别名: alias 别名=‘指令 选项’
- 查看别名:alias
- 取消命令别名:unalias 别名
- 查看历史命令: history
• n: 数字,列出最近n条历史命令;
• -c: 将⽬前shell的所有历史命令清除;
• -a: 将⽬前新增的history命令追加到histfiles中;如果没有
• 指定histfiles,默认写⼊~/.bash_history;
• -r: 将histfiles中的内容读到⽬前shell的histroy中;
• -w: 将⽬前history所记录的内容写⼊histfiles。 - 历史命令读取和记录的过程:
• 登陆,从~/.bash_history读取;
• 数量: HISTSIZE;
• 登出: 更新~/.bash_history;
• history –w 可强制写入 - !number:执行历史命令中的第number调指令。 !command:由最近指令向前搜索,找到开头为“command的指令”,并执行 。!!: 执行上一条指令
Bash Shell的操作环境
- 路径与命令搜索顺序:
• 在bash shell环境中,下达指令后的搜索顺序为:
• 以相对/绝对路径执行指令,例如 bin/ls 或 ./ls
• 由alias找到该指令来执行
• 由bash内建的指令来执行
• 透过$PATH这个变量的顺序搜寻到的第一个指令来执行 - login与non-login shell
• Login shell 取得bash需要完整的登录流程,需要输入账号密码
• non-login没有输入账号密码的 - login shell读取的配置文件:/etc/profile用于系统整体设定,~/.bash profile或~/.bash login或~/.profile:用于个人设定,可修改自己的配置信息。登录后,先读整体配置文件/etc/profile, 然后依序选择读取一个个人配置文件。
- /etc/profile, ~/.bash_profile 都是在取得login shell的时候才会读取的配置文件, 所以添加后需要注销登录才能生效。 可用source 命令或‘.’,使配置文件立即生效。如:source ~/.bashrc 或. ~/.bashrc
- non-login shell读取的配置文件 :~/.bashrc:会调用/etc/bashrc ;/etc/bashrc
- stty [-a]列出当前环境的按键设置
- set除显示变量外,还可以通过set设定整个指令的输入/输出环境,-u使用未设定变量会显示错误信息,-v信息被输出之前会显示信息原始内容,-x指令被执行前会显示指令内容
- Ctrl c终止当前命令,ctrl d 输入结束,ctrl m相当于enter, ctrl s暂停屏幕输出,ctrl q回复屏幕输出,ctrl u在提示字符下,将整列命令删除,ctrl z暂停目前命令
输入输出重定向
- 输出重定向:
• 命令 > 文件,命令执行结果输出到文件,清空文件原内容,>>表示追加到原文件
• 命令 2> 文件,错误结果输出到文件
• 命令 >> 文件 2>&1或者命令 &>> 文件:将标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。
• 不想显⽰也不想存储的信息,可以重定向到/dev/null,可以看作回收站。 - 输入重定向:
• 标准输⼊(stdin): 代码为0,使⽤<或<<;
• 命令 < 文件: 将指定文件作为命令的输入设备
• 命令 << 分界符: 表示从标准输入设备(键盘)中读入,直到遇到分界符才停
• 止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串
• 命令 < 文件 1 > 文件 2: 将文件 1 作为命令的输入设备,该命令的执行结果输 出到文件 2 中。
• 常用cat:cat >> new.txt < result.txt 把result.txt文件内容追加到new.txt
• cat >> result.txt << “eof”向result.txt中追加文件,直到eof停止
多命令间的逻辑关系
- cmd;cmd; 指令间不存在相关性
- cmd1 && cmd2 cmd1执行正确则执行cmd2,否则不执行cmd2
- cmd1 || cmd2 cmd1执行错误则执行cmd2,否则不执行cmd2
- 判断命令执行正确与否,依据变量$?的值,为0表示正确,否则表示不正确。
- 测试/tmp/test 是否存在,若存在则显示“exist”,不存在则显示“not exist”
- Ls /tmp/test && echo “exist” || “not exist”
管道命令
- 管道命令的限制:
• 管道命令仅处理标准输出,忽略标准错误输出;
• 管道命令必须能够接收来自另一个指令的数据作为其标准输入继续处理才以。
• 常用的管道命令:more、less、cut、sort、grep、,而ls、 cp、mv等不能收前一个指令的数据,不是管道命令 - cut 选项 file :将同一行数据进行分割。-d自定义分隔符,-f指定显示哪个区域,-c以字符为单位分割. Cut -d ‘:’ -f 3,4 以:分割的第3,4列,cut -c 5-10显示每一行第5-10个字符
- grep 选项 查找模式 file: -v列出不匹配的行,-c对匹配的行计数,-l只显示包含匹配模式的文件名,-h:抑制包含匹配模式的文件名的显示,-n:每个匹配行只按照相对的行号显示,-i:对匹配模式不区分大小写
- sort -b 忽略每行开始的空格,-f将小写字母视为大写字母,-m将前三个字母按照月份缩写排序,-n 依照数值大小排序,-u输出结果是去重的,-o<输出文件>排序后的结果存入指定文件,-r以相反顺序排序,-t <分隔符>指定分隔符, -k对第几栏排序
- uniq 用于检查及删除文本文件中重复出现的行,-i忽略大小写字符的不同,-c进行计数
- tee [-a] file tee指令可以前条指令的结果输出到标准输出设备,同时保存成文件。 -a:以累加的方式,将数据加入到file中
- tr -d 字符串,删除字符串,-s 取代重复字符串,tr ‘[a-z]’ '[A-Z]'把小写字母换成大写字母
- col -x把tab键转换成对等的空格键
- split [-bl] file PREFIX ,-b:后面可接欲区分成的文件大小,可加单位,如b,k,m等 ,-l:以行数来进行分区,PREFIX:代表前导符的意思,可作为分区文件的前导文字
- xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具
• xargs [-0epn] command
• 说明:产生某个指令的参数,读入标准输入的数据,以空格字符或断行字符将文
• 件分割成参数。
• -0:将标准输入的特殊字符还原成一般字符;
• -e:end of file,后面可以接字符串,xargs分析到这个字符串时,会停止工
• 作。
• -p:在执行每个指令的参数时,都会询问使用者
• -n:后面接次数,每次command指令执行时,需要使用几个参数的意思
正则表达式
- . Shell中的grep、egrep都使用POSIX规范。POSIX规范包括:
• 基本的正则表达式
• 扩 展 的 正 则 表 达 式
• \ 转义符号,将特殊字符转义
• ^ 匹配行首
• $ 匹配行尾
• *重复前一个字符多次
• . 匹配除换行符\n之外的任意单个字符
• [] 匹配包含在[字符]之中的任意一个字符
• [^] 匹配[^字符]之外的任意一个字符
• [-] 匹配[]中指定范围内的任意一个字符,要写成递增
• {n,m} 匹配 连续n到m个前一个 字符 - POSIX字符:
• [:alnum:] 匹配任意一个字母或数字字符
• [:alpha:] 匹配任意一个字母字符(包括大小写字母)
• [:blank:] 空格与制表符(横向和纵向)
• [:digit:] 匹配任意一个数字字符
• [:lower:] 匹配小写字母
• [:upper:] 匹配大写字母
• [:punct:] 匹配标点符号
• [:space:] 匹配一个包括换行符、回车等在内的所有空白符
• [:graph:] 匹配任何一个可以看得见的且可以打印的字符
• [:xdigit:]任何一个十六进制数(即:0-9,a-f,A-F)
• [:cntrl:] 任何一个控制字符(ASCII字符集中的前32个字符)
• [:print:] 任何一个可以打印的字符 - 正则表达式与通配符的区别
• 通配符是bash 操作接口的一个功能
• 正则表达式是一种字符串处理的表示方式。
• 例如:
• 通配符中,代表0~无限多个字符, 而正则中标识重复前一个
• 字符多次通配符中,?表示任意一个字符, 正则中则用’.’表示 - 扩展正则表达式:egrep或grep -E
• +重复一个或一个以上的前一个字符
• ?零个或一个前一个字符
• | a|b寻找a或b
• ()找出群组字符串
• ()+多个重复群组
sed和awk
- sed [-hnV] [-e] [-f<script文件>] [文本文件]
• 参数:
• -e<script文件>或–expression=<script文件> 以选项中指定的script来处理输入的文本文件。
• -f<script文件>或–file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
• -h或–help 显示帮助。
• -n或–quiet或–silent 仅显示script处理后的结果。
• -V或–version 显示版本信息。
• script用单引号(‘’)括起来 - 动作说明:
• a :新增, a 的后面可以接字串,而这些字串会在下一行出现
• c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
• d :删除, d 后面通常不接任何东西;
• i :插入, i 的后面可以接字串,而这些字串会在上一行出现
• p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
• s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g !
• nl -number lines of files 打印文件内容并在每行前加行号
• nl passwd | sed '2,5d’删除2-5行
• nl passwd | sed‘2a hello world‘#第2行后
• nl /etc/passwd | sed ‘2i drink tea’ #第2行前
• nl /etc/passwd | sed '2a Drink tea or …\ > drink beer ?’# 多行添加
• nl passwd | sed‘2,5c No 2-5 number’ #把2-5行替换成NO 2-5 number
• nl passwd | sed ‘5,7p ’ #仅显示5-7行
• nl /etc/passwd | sed '/root/p’ 搜索root并显示,sed '/word/'搜索
• nl /etc/passwd | sed -n ‘/root/{s/bash/blueshell/;p;q}’ 搜索root所在的行,把bash换成blueshell并输出,q是退出。{}中的每个命令之间用;隔开
• nl /etc/passwd | sed -n ‘s/root/sroot/g’搜索root并替换
• sed –i‘s/.$/!/g’ regular.txt直接在源文件修改,把以点结尾的修改为! - awk处理一行中的每个字段,默认以空格或tab键分隔。
• awk ‘条件类型1 {动作1} 条件类型2 {动作2}…’ filename 。注意*:条件类型和动作一定用单引号括起来。
• 处理流程:
• 1.读入第一行,并将第一行的资料填入dollar0,dollar1,dollar2,…
• 2.依据“条件类型的限制”,判断是否需要进行后面的动作
• 3.完成所有动作
• 4.对后续行重复上面的步骤1~3,直到所有的数据都读完为止
• 常用内建变量:
• NF:每一行拥有的字段总数
• NR:目前awk所处理的是第几行
• FS:目前的分隔字符,默认是空格
• dollar0代表第一个字段,以此类推
• BEGIN{ 执行前的语句 } 在执行所有语句之前先执行begin里的语句
• END { 处理完所有的行后要执行的语句 }
• exit 结束脚本程序的执行,该函数接受一个整数作为参数表示 AWK 进程结束状态。 如果没有提供该参数,其默认状态为 0。 可以使用$?来查看exit返回值