一、SHELL简介
Linux Shell种类非常多,常见的SHELL如下:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell 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 中,变量的本质是字符串。定义变量时,等号两边不能有空格;引用变量时,需要在变量名前加上 $ 符号。
var=name
变量的规则:
- 变量与变量内容之间用"="连接,且两边不能有空格
- 数字不能作为变量名的开头
- 变量内容若有空格可使用双引号""或单引号''将变量的内容连接起来。双引号内的特殊字符保留原有特性;单引号内的特殊字符仅为普通字符
- 可用跳脱字符"\"将特殊字符变成一般字符
- 执行指令中借由其他指令提供信息时,可用``
- 扩增变量内容时,可用"变量名称"累加内容,或{变量名称}累加内容
- 需要在其他子程序中执行:
export 变量名称将变量变成环境变量- 通常大写为系统变量,小写为自定义变量
- 取消变量:
unset 变量名称
四、变量读取
可以通过如下命令获取变量值。
echo $变量名或echo ${变量名}
五、变量类型
Shell 变量根据其作用域和来源,主要可分为四大类:自定义变量 、环境变量 、位置变量 和特殊变量。
自定义变量 :由用户自行定义,仅在当前 Shell 会话中有效,子进程无法继承。定义时直接使用 var=value 格式赋值。
环境变量 :全局有效,当前进程及其子进程均可访问。通过 export var=value 设置,常见的有 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的进程号;
var=name #定义了一个变量;
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 sum=100+50+50
echo ${sum}
数组: Var[index]=content
示例:
var0="aa"
var1="bb"
var2="cc"
echo "{var\[0\]},{var1},${var2}"
七、语系设定
Linux locale 就是系统用来决定显示什么语言、怎么排日期数字的一套规则。如果没有设置合适的编码,可能会导致显示乱码问题。
locale -alocaleLANG=en_US.UTF-8LC_ALL=en_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快捷键
- Ctrl+D #在空行时退出 Shell
- Ctrl+M #回车键(Enter)
- Ctrl+A #移动到命令行首
- Ctrl+E #移动到命令末尾
- Ctrl+U #冲当前光标位置删到行首
- Ctrl+K #从当前光标位置删到行尾
十一、通配符
- *: 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。欢迎关注留言交流。
