目录
一、shell概述
1、什么是shell
2、shell的分类
二、shell的执行方式
1、echo 命令
echo [选项] [输出内容]
选项:
-e : 支持方反斜线控制的字符转换
-n: 取消输出后汉行末执行的换行符(就是内容输出后不换行)
例:
[root@itpuxhsdb52 ~]# echo -n "abccc" abccc[root@itpuxhsdb52 ~]#
控制字符 作用 \\ 删除\ 本身 \a 输出警告音 \b 退格键 \c 取消行末输出的换行符。和“-c”选项一致 \e ESCAPE键 \f 换页符 \n 换行符 \r 回车键 \t 制表符,也就是TAB键 \v 垂直制表符 \0nnn 按照八进制ASCII码表输出字符。其中0是数字0 ,nnn是三位8进制数 \xhh 按照16进制ASCII码表输出字符。其中hh是两位十六进制数
2、shell脚本的执行方法
①.写一个shell脚本
vim test.sh
#!/bin/bash #固定写法,执行复杂的人家交互时必须要加,建议每次写时加上 。 echo "123456! " # !后面一定要加空格,否则无法正常执行。
② .两种执行方法:
A.赋予执行权限直接运行 (建议使用此种方法)
[root@itpuxhsdb52 ~]# vi test.sh [root@itpuxhsdb52 ~]# [root@itpuxhsdb52 ~]# chmod 755 test.sh [root@itpuxhsdb52 ~]# [root@itpuxhsdb52 ~]# [root@itpuxhsdb52 ~]# /root/test.sh #绝对路径下执行(建议使用这种) 123456! [root@itpuxhsdb52 ~]# [root@itpuxhsdb52 ~]# ./test.sh #相对路径下执行 123456! [root@itpuxhsdb52 ~]#
B.通过bash调用执行脚本(可以不赋予执行权限)
[root@itpuxhsdb52 ~]# bash test.sh 123456! [root@itpuxhsdb52 ~]#
三、Bash的基本功能
1、历史命令
1)历史命令的查看
history [选项] [历史命令保存文件]
选项:
-c :清除历史命令。包括缓存和文件中的历史命令 (此参数一般不建议使用)。
-w:把缓存中的历史命令写入历史命令保存文件。如果不手工指定历史命令保存文件,则默认放入历史命令保存文件 ~/.bash_history中 。
历史命令保存条数的设置:
vi /etc/profile
...省略部分输出...
HISTORY=1000
...省略部分输出...
2) 历史命令的调用
如果想要使用原先的历史命令有以下几种方法:
- 使用上下键箭头调用以前的历史命令
- 使用“!n” 重复执行第n条历史命令
- 使用“!!”重复执行上一条命令
- 使用“!字串” 重复执行最后一条以该字串开头的命令
- 使用“!$”重复上一个命令的最后一个参数
2、命令与文件的补全
tab键
3、命令别名
alias #查询系统中已经命令好的别名 。
设定命令别名
alias 别名='原命令'
例如:
alias cp='cp -i'
alias l.='ls -d .* --color=auto'
别名永久都生效的方法:
可以把别名写入环境变量配置文件“~/.bashrc” : vi /.bashrc 执行 source .basgrc 生效 。
别名的优先级:
1、第一顺序位为绝对路径或相对路径执行的命令;
2、第二顺序位执行别名;
3、第三顺序为执行Bash的内部命令;
4、第四顺位执行按照$PASH环境变量定义的目录顺序找到的第一个命令 。
4、Bash常用快捷键
快捷键 | 作用 |
ctrl+A | 把光标移动到命令行开头。 |
ctrl+E | 把光标移动到命令行尾。 |
ctrl+C | 强行终止当前的命令。 |
ctrl+L | 清屏。 |
ctrl+U | 删除或剪贴光标之前的命令。 |
ctrl+K | 删除或剪贴光标之后的命令。 |
ctrl+Y | 粘贴ctrl+U或ctrl+K剪贴的命令。 |
ctrl+R | 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索 。 |
5、输入输出重定向
1).Bash的标准输入输出
设备 | 设备文件名称 | 文件描述符 | 类型 |
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2).输出重定向
类型 | 符号 | 作用 |
标准输出重定向 | 命令>文件 | 以覆盖的方式,把命令的正确输出输出到指定的文件或设备中。 |
命令>>文件 | 以追加的方式,把命令的正确输出到是定的文件或设备中。 | |
标准错误输出重定向 | 错误命令 2>文件 | 以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中。 |
错误命令 2>>文件 | 以追加的方式,把命令的错误输出输出到指定的文件或设备当中。 | |
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 以覆盖的方式把正确输出和错误输出都保存到同一个文件中。 |
命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件中。 | |
命令 &>文件 | 以覆盖的方式把正确输出和错误输出都保存到同一个文件中。 | |
命令 &>> 文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件中。 | |
命令 >> 文件1 2>> 文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中。 |
3)、输入重定向
wc [选项] [文件名]
选项:
-c: 统计字节数
-w: 统计单词数
-l: 统计行数
6、多命令顺序执行
多命令执行符 | 格式 | 作用 |
; | 命令1; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑。 |
&& | 命令1&&命令2 | 当命令1正确执行时,命令2才会执行 当命令1执行不正确时,则命令2不会执行 |
|| | 命令1|| 命令2 | 当命令1执行不正确时,则命令2才会执行 当命令1 正确执行时,命令2则不会执行 |
root@itpuxhsdb52 ~]# llll && echo yes || echo no
bash: llll: command not found...
no
[root@itpuxhsdb52 ~]#
root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]# date && echo yes || echo no
Thu Jun 16 23:00:13 CST 2022
yes
[root@itpuxhsdb52 ~]#
7、管道符
1)、行提取命令
grep [选项] "搜索内容" 文件名
选项:-A 数字: 列出符合条件的行,并列出后续的n行
-B数字: 列出符合条件的行,并列出前面的n行
-c : 统计找到符合条件字符串的次数
-i : 忽略大小写
-n : 输出行号
-v: 反向查找
--color=auto 搜索出的关键字用颜色表示
[root@itpuxhsdb52 ~]# grep "/bin/bash" /etc/passwd root:x:0:0:root:/root:/bin/bash user1:x:1000:1000:user1:/home/user1:/bin/bash oracle:x:61001:60001::/home/oracle:/bin/bash [root@itpuxhsdb52 ~]#
2)、find与grep的区别
find命令是在系统当中查找符合条件的文件名,如果需要模糊查询,使用通配符进行匹配,搜索时文件名完全匹配 。
[root@itpuxhsdb52 ~]# find . -name "test.sh" ./test.sh [root@itpuxhsdb52 ~]#
grep是在文件当中符合条件的字符串,如果需要模糊查询,则使用正则表达式进行匹配,搜索时字符串是包含匹配。
8、通配符
通配符 | 作用 |
? | 匹配一个任意字符 |
* | 匹配0个或多个任意字符,也就是可以匹配任何内容 |
[] | 匹配括号中任意一个字符。例如[abc] . 代表一定匹配一个字符,或者是a,或者是b,或者是c |
[-] | 匹配括号中任意一个字符。例如[a-z] ,代表匹配任意一个小写字母。 |
[^] | 逻辑非,表示不是括号内的一个字符。例如 [^0-9] 代表匹配一个不是数字的字符 。 |
9、Bash中其他特殊符号
符号 | 作用 |
‘’ | 单引号。在单引号中所有的特殊符号(如:$ ^ 反引号)没有特殊含义。 |
" " | 双引号。在双引号中特殊符号都没有特殊含义,但是”$“ 、”^“ 、"\"是例外,拥有”调用变量的值“、"引用命令"和转义符的特殊含义。 |
`` | 反引号。反引号括起来的内容就是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$(),因为反引号非常容易看错。 |
$() | 和反引号作用一样,用来应用系统命令。 |
() | 用于一串命令执行时,() 中的命令会在子shell中运行 。 |
{} | 用于一串命令执行时,{}中的命令会在当前shell中执行。也可以用于变量变形与替换 。 |
[] | 用于变量的测试。 |
# | 在设立了脚本中,#开头的代表注释。 |
$ | 用于调用变量的值,如果需要调用变量name的值时,需要用$name 的方式得到变量的值。 |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将 |
[root@itpuxhsdb52 ~]# name=sjw
[root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]# echo '$name'
$name
[root@itpuxhsdb52 ~]# echo "$name"
sjw
[root@itpuxhsdb52 ~]# ##############################################
[root@itpuxhsdb52 ~]# a=`date`
[root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]# echo $a
Fri Jun 17 00:48:16 CST 2022
[root@itpuxhsdb52 ~]# ##############################################
[root@itpuxhsdb52 ~]# b=$(pwd)
[root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]# echo $b
/root
[root@itpuxhsdb52 ~]################################################
root@itpuxhsdb52 ~]# name=123456
[root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]# (name=7890; echo $name)
7890
[root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]#
[root@itpuxhsdb52 ~]# echo $name
123456
[root@itpuxhsdb52 ~]# ###############################################
大括号与小括号的区别:
- () 执行一串命令时,需要重新开一个子shell进行执行
- {} 执行一串命令时,是在当前shell执行;
- ()和{} 都是把一串的命令放在括号里面并且命令之间用;号隔开 ;
- ()最后一个命令可以不用封号;
- {} 最后一个命令要用封号;
- {}的第一个命令和左括号之间必须要有一个空格;
- () 里的各命令不必和括号有空格;
- ()和{}中括号里面的某个命令的重定向只影响该命令,但该括号外的重定向则影响到括号里面的所有命令。