一、SHELL简介Linux Shell种类非常多常见的SHELL如下Bourne Shell/usr/bin/sh或/bin/shBourne Again Shell/bin/bashC Shell/usr/bin/cshK Shell/usr/bin/kshShell for Root/sbin/sh不同的Shell语言的语法有所不同最常用的shell是Bash也就是Bourne Again Shell。我们为什么需要shell呢用户需要操作硬件硬件是通过内核驱动的但用户是不能操作内核的这时shell就起到一个用户和内核之间沟通的桥梁作用。用户可以输入shell命令执行又可以利用 Shell脚本编程去运行。Bash架构二、命令类型在Linux系统中命令可以分为两类内建命令Built-in Commands和外部命令External Commands。内建命令是由shell本身提供的而外部命令则是独立的程序通常存储在文件系统的某个目录下比如/bin、/usr/bin等。内建命令的执行速度通常比外部命令快因为它们不需要加载独立的程序。type: 查询是否为内建命令示例:type [指令]三、变量定义在 Linux Shell 中变量的本质是字符串。定义变量时等号两边不能有空格引用变量时需要在变量名前加上$符号。varname变量的规则变量与变量内容之间用连接且两边不能有空格数字不能作为变量名的开头变量内容若有空格可使用双引号或单引号将变量的内容连接起来。双引号内的特殊字符保留原有特性单引号内的特殊字符仅为普通字符可用跳脱字符\将特殊字符变成一般字符执行指令中借由其他指令提供信息时可用扩增变量内容时可用$变量名称累加内容或${变量名称}累加内容需要在其他子程序中执行export 变量名称将变量变成环境变量通常大写为系统变量小写为自定义变量取消变量unset 变量名称四、变量读取可以通过如下命令获取变量值。echo $变量名或echo ${变量名}五、变量类型Shell 变量根据其作用域和来源主要可分为四大类自定义变量、环境变量、位置变量和特殊变量。自定义变量由用户自行定义仅在当前 Shell 会话中有效子进程无法继承。定义时直接使用varvalue格式赋值。环境变量全局有效当前进程及其子进程均可访问。通过export varvalue设置常见的有PATH、HOME、USER等。位置变量在脚本传参时自动接收以$1、$2…$n形式表示其中$0为脚本名$#为参数个数。特殊变量由 Shell 内置不可手动赋值例如$$当前进程 PID、$?上一条命令的退出状态、$*和$所有参数。1、环境变量常用的环境变量有PATH、HOME、USER、PS1等PS1: 提示字符的设定\d 日期\H 完整主机名\h 主机名第一段\t 24小时时分秒\T 12小时时分秒\A 24小时时分\ 12小时am/pm\u 用户\V bash版本\w 完整工作目录\W 工作目录\# 第几条指令\$ 提示字符HOME: 用户的家目录PATH: 命令的查找路径从前往后查找如果没有找到输出“command not found”USER: 当前用户2、特殊变量$: 本shell的PID?: 上一个命令执行的回传值export: 环境变量示例:export 变量名称如上图echo $? #上一条命令的执行结果成功显示0非0则表示失败echo $$ #表示本shell的进程号varname #定义了一个变量export var #转换成一个环境变量bash #创建了一个子shell然后在子shell中可以获取到父shell的变量var的值因为在父shell中var被转换成了环境变量是用env可以查看环境变量。3、位置变量在执行脚本时通常使用./shell.sh name age score的形式命令执行脚本。$0: 表示脚本名称shell.sh$1:表示脚本执行的第一个参数$2:表示脚本执行的第二个参数。。。。。。$#表示为参数个数$: 表示所有参数每个参数是独立的$*: 表示所有参数所有参数作为一个整体。六、变量的输入、数组和声明read [-pt] variable示例:read -p please enter yes/no: -t 30 test-p: 给出提示信息-t: 设置超时时间declare:declare [-aixr] variable示例:declare -i sum1005050echo ${sum}数组:Var[index]content示例:var[0]aavar[1]bbvar[2]ccecho ${var[0]},${var[1]},${var[2]}七、语系设定Linux locale 就是系统用来决定显示什么语言、怎么排日期数字的一套规则。如果没有设置合适的编码可能会导致显示乱码问题。locale -alocaleLANGen_US.UTF-8LC_ALLen_US.UTF-8八、命令别名与历史命令alias, unalias:alias 别名命令 选项 #设置命令别名unalias 别名 #取消别名设定历史命令history [n]history [-c]history [-raw] histfiles!number#执行第多少条命令!command#执行包含command的命令!!#执行上一条命令九、Bash欢迎信息/etc/issue:\d: 本地端的日期\l: 第几个终端\m: 显示硬件的等级\n: 显示主机名称\O: 显示domain name\r: 作业系统的版本\t: 本地端时间\S: 作业系统名称\v: 作业系统版本/etc/motd:登陆后的提示信息十、Bash快捷键CtrlD #在空行时退出 ShellCtrlM #回车键EnterCtrlA #移动到命令行首CtrlE #移动到命令末尾CtrlU #冲当前光标位置删到行首CtrlK #从当前光标位置删到行尾十一、通配符*: 0到无穷个任意字符?: 匹配1个字符[]: 匹配括号内的一个字符[-]: 匹配范围内的一个字符[^ ]: 匹配非括号内的一个字符#: 注释\: 转义字符|: 管道符;: 连续下达多条命令~: 家目录$: 变量读取: 进程变成后台运行!: 逻辑运算非/: 目录符号, : 输出表示覆盖表示追加, : 输入: 单引号内为纯文字: 双引号内可有变量功能: 先执行命令(): 子shell起始与结束的组合{}: 中间为命令区块的组合十二、重定向, # 输出重定向表示覆盖表示追加。, # 输入重定向 将现有文件的内容作为命令的标准输入stdin替代键盘输入; 在命令行中直接定义多行文本块作为命令的输入直到遇到指定的结束标记如EOF。2, 2 #2覆盖模式将命令执行产生的错误信息重定向到指定文件。如果文件已存在会清空原内容并覆盖如果文件不存在则创建新文件;2追加模式将命令执行产生的错误信息重定向到指定文件的末尾。如果文件已存在内容会累加而不覆盖如果文件不存在则创建新文件。实例十三、连续执行多条命令;: 连续下达多条指令: 前一条指令执行成功才能执行后一条指令||: 前一条指令没有执行成功才能执行后一条指令十四、管道命令|: 前一个命令的输出作为后面命令的输入十五、截取命令cut -d 分隔字符 -f fields filename-d指定分割符号-f指定需要选取的字段十六、排序命令sort命令用于对文本文件内容进行排序-r逆序排序降序。-n按数值进行排序。-k 字段按指定的字段进行排序。该参数可指定多个字段使用逗号分隔。默认字段分隔符为制表符或空格。-t 分隔符指定字段的分隔符。-u去除重复行仅保留第一次出现的行。-f忽略大小写进行排序。-b忽略行首的空白字符进行排序。-c检查文件是否已经排好序如果未排序则输出第一个不符合排序顺序的行。-f忽略大小写进行排序。例如sort -f file.txt 将忽略行首字母的大小写进行排序。-b忽略行首的空白字符进行排序。-c检查文件是否已经排好序如果未排序则输出第一个不符合排序顺序的行。uniq是Linux中专门用来处理重复行的命令-c在每行前面添加该行在文件中出现的次数-d仅显示有重复的行-u仅显示没有重复的行-i在比较行时忽略字符大小写。wc命令用于统计文件中的字节数、字数、行数等-l:选项表示只统计行数-w:统计单词数-c:统计字节数举例统计地址列表中重复次数最多的前10个地址十七、其他命令双向重定向:tee -a file输出到文件和屏幕字符转换命令: tr/col/join/paste/expand分割命令: split本节介绍了一些shell命令的用法是shell编程的基础下一节将介绍shell文本处理“四剑客”grep、sed、awk、find。欢迎关注留言交流。