1、Shell概述
(1)Shell说明:
- Shell 就是命令解释器,而shell Script 是利用 shell 所写的一个程序
- 简单理解就是将多个指令汇集在一起,然后一次执行
- 查询系统支持的 shell类型:
cd /etc/
cat shells
(2)ShellScript编写建议
- 指令和参数之间的多个空格会被忽略
- 当读到回车符(enter)的时候尝试执行
- 当一行的内容过长时可以使用跳脱字符(\enter)来分行
- #是被用作注解(注释),除 shell文件定义
- 编写的文档里面加上文档的用途,历史修改,作者等信息
(3)建议在 Script 档案中声明的东西
- 文档的功能
- 文档的版本信息,作者及其联系
- 修改的历史记录
- 内部特殊的指令
- 预设的环境变量
2、echo命令
man echo:
NAME
echo -- write arguments to the standard output
SYNOPSIS
echo [-n] [string ...]
DESCRIPTION
The echo utility writes any specified operands, separated by single blank (` ') characters and followed by a newline (`\n') character, to the standard output.
The following option is available:
-n Do not print the trailing newline character. This may also be achieved by appending `\c' to the end of the string, as is done by iBCS2 compatible systems. Note that this
option as well as the effect of `\c' are implementation-defined in IEEE Std 1003.1-2001 (``POSIX.1'') as amended by Cor. 1-2002. Applications aiming for maximum portabil-
ity are strongly encouraged to use printf(1) to suppress the newline character.
Some shells may provide a builtin echo command which is similar or identical to this utility. Most notably, the builtin echo in sh(1) does not accept the -n option. Consult the
builtin(1) manual page.
EXIT STATUS
The echo utility exits 0 on success, and >0 if an error occurs.
SEE ALSO
builtin(1), csh(1), printf(1), sh(1)
转义说明:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
3.shell 脚本样例开发
创建文件:
(1)创建Shell脚本文件
vim helloShell.sh
(2)定义bashbang
#!/bin/bash
(3)脚本开发
echo hello shell
执行方式:
- 赋予执行权限,在相对/绝对路径下进行执行
chmod 755 helloShell.sh
./helloShell.sh
- 通过 bash 进行调用
bash helloShell.sh
4、Bash基本功能
(1) history
说明:
- history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。
- 该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2;
- history more 是记录 1000 个历史命令,并且是在退出系统时进行记录。具体的记录位置为 用户 home 目录下 .bash_hostory 文件中。
语法:
history [选项] (参数)
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中。
样例:
- history: 默认查询1000 条历史命令。
- history -a: 系统为 logout前,将缓冲区中的命令记录写入到.bash_history 中
(2) 命令和文件的补全
- 使用 tab 键进行文件和命令的补全操作。
- 输入命令后,连续敲两次 tab 会列出以该命令开头的所有可用命令
(3) alias
说明:
- alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。
- 使用alias时,用户必须使用单引号''将原来的命令引起来,防止特殊字符导致错误。
- alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中。
语法:
alias [选项] (参数)
[选项]:
-p:打印已经设置的命令别名。
[参数]:
格式为 命令别名=‘实际命令’ 例如: alias lt = 'ls -ltr'
样例:
- 设置别名: alias lt = 'ls -ltr'
- 查询设置的别名: alias -p
(4)bash 快捷键
快捷键 | 作用 |
---|---|
ctrl+c | 强制结束当前命令 |
Ctrl+A | 把光标移动到命令行开头 |
ctrl+E | 把光标移动到明亮行结尾 |
Ctrl+L | 清屏 相当于 clear |
ctrl+U | 删除或者剪切光标之前的命令 |
ctrl+K | 删除或者剪切光标之后的命令 |
ctrl+Y | 粘贴 ctrl+u 或者 ctrl+K 之后的内容 |
ctrl+R | 在历史命令中搜索 |
ctrl+Z | 暂停,并放入后台 |
ctrl+S | 暂停屏幕输出 |
Ctrl+Q | 恢复屏幕输出 |
(5)、输入输出重定向
1) Bash的标准输入输出
操作设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | / dev/stout | 1 | 标准输出 |
显示器 | /dev/sterr | 2 | 标准错处输出 |
2) 输出重定向
3)输入重定向
说明:
- < 改变标准输入路径,使用文件作为数据源
- << 改变标准输入路径,使用输入作为数据源,需要一个结束符
wc [选项] [文件名]
选项
-c 统计字节数
-w 统计单词数
-l 统计行数
(6)多命令顺序执行
说明:
执行符 | 格式 | 作用 |
---|---|---|
; | cmdA ;cmdB ; cmdC | 多个命令顺序执行,每个命令之间没有联系 |
&& | cmdA && cmdB | 当 cmdA 成功执行结束后,执行 cmdB;当 cmdA执行异常是,不会执行 cmdB |
| | cmdA || cmdB | 当 cmdA 执行异常时,cmdB才会执行;当 cmdA执行正常时,cmdB不会执行 |
样例:
单分支if:如果ls执行成功输出yes,执行失败输出no
ls && echo yes || echo no
(7)管道符
1)行提取命令 grep
说明:
grep [选项] "搜索内容" 文件名
[选项]:
-A 数字 列出符合条件的行,并列出后续的n行
-B 数字 列出符合条件的行,并列出前面的n行
-c 统计符合条件的字符串的次数
-i 忽略大小写
-n 输出行号
-v 反向查找
--color=auto 搜索出的关键字用颜色显示
样例:
- grep ls .bash_history
- grep -A 3 "ls" .bash_history
- grep --color=auto -A 3 "ls" .bash_history
- grep -c "ls" .bash_history
2)搜索命令 find
用途: 在指定目录下查找文件
说明:
find path -option [-print] [-exec -ok |xargs |grep] [command {} \;]
path:要查找的目录路径
~ 表示$HOME目录
. 表示当前目录
/ 表示根目录
-option:查找方式
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup #查无有效属组的文件
-nouser #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-mount #查文件时不跨越文件系统mount点
-follow #如果遇到符号链接文件,就跟踪链接所指的文件
-prune #忽略某个目录
[-print] : 将结果作为标准输出
[-exec]: 对匹配到的文件执行shell命令
[-ok]: 对匹配到的文件执行 Shell 命令,执行之前会进行确认
样例:
- find . -name '*.txt' -print:当前目录查找txt结尾的文件
- find . -path "./testDir" -prune -o -name "*.txt" -print : 在当前目录除testDir之外的子目录内搜索txt结尾的文件
- find . -perm 755 -print: 在当前目录中查询具有执行权限的文件
-
find . -size -39k: 查找当前目录下,大小为 39K的文件
执行命令: - find . -name '*.txt' -exec echo "ok" {} ; :查找以txt结尾的文件,找到之后输出ok;
- find . -name 'test.txt' -ok cp {} {}.bak ; :备份test.txt
3)find 与 grep的区别
- find是在系统当中搜索符合条件的文件名,如果需要模糊查询,使用通配符或者正则进行匹配。
- grep命令是在文件中搜索符合条件的字符串,如果需要模糊查询,则可使用正则进行匹配。
(8)通配符
通配符 | 说明 | 样例 |
---|---|---|
* | 匹配0个或多个任意字符 | a*b,a与b之间可以有任意长度的字符,也可以没有。 |
? | 匹配一个任意字符 | a?b,a与b之间必须但也只能存在一个字符,该字符可以是任意字符 |
[] | 匹配[]中的任意单个字符 | a[xyz]b,a与b之间必须但也只能存在一个字符,该字符只能是x或y或z |
[! ] | 匹配除list中的任意单个字符 | a[!a-z]b,a与b之间必须但也只能存在一个字符,该字符不能是小写字母 |
[c1-c2] | 匹配c1-c2间的任意单个字符 | a[0-1]b,a与b之间必须但也只能存在一个字符,该字符只能是数字 |
{} | 匹配{} 中的一个字符串 | a{abc,xyz,opq}b,a与b之间必须但也只能存在一个字符串,字符串只能是abc或xyz或opq |
(9)特殊字符
1) 说明
符号 | 作用 |
---|---|
'' | 单引号,被单引号包含的所有特殊字符都没有特殊含义 |
"" | 双引号,在双引号内的特殊符号是没有特殊含义的,但是$,`, \例外 |
`` | 反引号,反引号括起来的就是系统命令 |
$() | 引用系统命令 |
() | 用于一串命令执行时,回去子shell中执行 |
{} | 异常命令执行时,{}中的命令会在当前 Shell 中执行 |
[] | 用于变量测试 |
# | 在 Shell 中,除BashBang 之外,其他情况下均代表注释 |
$ | 用于调用变量的值 |
\ | 转义符 |
2)$()和 ` `(反引号)
- bash shell 中,$( ) 与
(反引号) 都可用做命令替换用。
- `` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高,但反单引号容易打错或看错
- 在部分编辑器中反引号与单引号相似,容易出现混淆,建议使用${}进行系统命令引用