Shell:bash基础特性及基础命令
bash基础特性及命令
1,命令历史
history 历史
环境变量:
HISTORYSIZE:命令历史记录的条数:
HISTORYFILE:~/.bash_history
HISTORYFILESIZE:命令历史文件记录历史的条数
history -d OFFSET(删除历史中指定的命令,OFFSET为偏移量)
-c : 清空命令历史:(clear)
history #:显示历史中最近的#条命令
-a : 手动追加当前会话缓冲区的命令历史之历史文件中
调用历史中的命令:
!#: 重复执行第#条命令
!!: 重复运行上一条命令:
!string: 调用历史中最近一个以string开头的命令:
调用上一条命令的最后一个参数:
!$: 后面加上这个命令即可;
ESC,. :先按ESC,松开后按.号;
Alt+ . :按住Alt不放后按住.号;
控制命令历史的记录方式:
环境变量:HISTCONTROL
ignoredups: 忽略重复的命令,连续且相同方为"重复"
ignorespace: 忽略所有以空白开头的命令
ignoreboth: ignoredups,ignorespace ,ignore这两条命令
修改环境变量值得方式:export 变量名=”值”
变量赋值符号后难免的数据存储于变量名指向的内存空间,只对当前shell有效
export命令用于设置或显示环境变量
export HISTCONTROL="ignorespace" 将环境变量更改为忽略所有以空白开头
echo $HISTCONTROL 显示环境变量
2,命令补全
bash执行命令:
内部命令
外部命令:bash根据PATH环境变量定义的路径,自左向右在每个路径搜寻以给定命令命名的文件,第一次找到即为要执行的命令。
直接补全:Tab,用户给定的字符串至于一条位移对应的命令
以用户给定的字符串为开头对应的命令不唯一,则再次Tab会给出列表。
安装bash-completion,yum install -y bash-completion
3,路径补全
把用户给出的字符串这个那个当做路径开头,并在指定的目录下所搜以指定的子字符串开头的文件名;
如果唯一则直接补全;
否则,再次Tab,给出列表。
4,命令行展开:
~: 展开为用户的主目录
~USERNAME:展开为指定用户的主目录
{}: 可承载一个以逗号分隔的雷彪,并将其展开为多个路径
/tmp/{a,b}=/tmp/a,/tmp/b
/tmp/{tom,jerry}/hi=/tmp/tom/hi,/tmp/jerrty/hi
5,目录管理类命令:
cd,pwd,ls
mkdir,rmdir,rm,cp,mv
mkdir rmdir
mkdir 创建目录
mkdir [OPTIONS] /path/to/somewhere
-p: 递归创建目录,存在于不报错,且可以自动创建所需的各目录
-v: 显示详细信息
-m MODE:创建目录时直接指定权限
tree 显示目录
-d: 只显示目录
-L level: 指定显示的层级数目
-P pattern: 只显示由指定pattern匹配到的路径:
rmdir 删除空目录
rmdir [OPTION] …DIRECTORY…
-v: 显示过程 ;
rm:删除目录
-r: 递归
-f: 不用询问
-rf: 递归删除目录,不用询问
-d: 只显示目录
练习:
(1)一次创建多个目录
mkdir -p /tmp/x/y1 /tmp/x/y2 /tmp/x/y1/a /tmp/x/y1/b /tmp/x/y2/a /tmp/x/y2/b=mkdir -p /tmp/x/{y1,y2}/{a,b}
(2)如何创建x_m,y_m,x_n,y_n
mkdir {x,y}_{m,n}
(3)如何创建/tmp/bin, /tmp/sbin, /tmp/usr/bin, /tmp/usr/sbin
mkdir -p /tmp/{bin,sbin,usr/{bin,sbin}}
6,命令的执行结果状态
成功
失败
bash使用特殊变量$?保存最近一条命令的执行状态结果:
0: 成功
1-255: 失败
程序还行有两类结果:
程序的返回值:成功或者失败
程序中的执行状态结果:
7,文本文件查看命令:
cat,tac
more,less,tail,head
more
more [OPTIONS…] FILE…
-d: 显示翻页及退出提示
一屏一屏显示出来,空格键翻屏
less
less [OPTIONS…] FILE…
man命令是使用less来工作的
head
head [OPTIONS…] FILE…
-c #: 指定获取前#字节 例如:head -n 10 /etc/rc.d/rc.sysinit
-n #: 指定获取前#行
-#: 指定获取前#行
tail
tail [OPTIONS…] FILE…
-c #: 指定获取后#字节
-n #: 指定获取后#行
-#: 指定获取后#行
-f: 跟踪显示文件新追加的内容:一般用于查看日志文件
8,文件的时间戳管理工具:
touch
文件:metadata,data
查看文件状态:stat 例如stat /tmp/yum.log
三个时间戳:
access time:访问时间,简写为atime ,读取文件内容
modify time:修改时间,mtime ,改变文件内容(数据)
change time:改变时间,ctime,元数据发生改变。
touch命令:
可以修改atime以及mtime,如果文件不存在,不使用-c时会直接创建一个文件并显示当前时间
touch[OPTION]…FILE…
-a:only atime
-m:only mtime
-t STAMP:
STAMP=[[CC]YY]MMDDhhmm[.ss] >>201805142201.35
-c: 如果文件不存在,则不予创建
9,alias:命令别名
通过alias命令实现
(1)alias
显示当前shell进程中所有可用的命令别名
(2)alias NAME=‘VALUE‘
定义别名NAME,相当于指令命令VALUE
注意:在命令行中定义的别名,仅对当前shell进程有效,如果想永久有效,要定义在配制文件中;
仅对当前用户有效:~/.bashrc 比如可以用上面的编辑器nano:nano .bashrc 进行编辑
对所有用户都有效:/etc/bashrc
注意:编辑配置给出的新配置不会立即生效
bash进程重新读取配置文件,示例如下:
source /path/to/config_file
. /path/to/config_file
撤销别名:unalias
-a: 撤销所有别名
unalias name 撤销某个别名
注意:如果别名同原命令的名称,则如果要执行原命令,可以使用"\COMMAND"
10,glob(globbing)通配
bash中用于实现文件名"通配"
通配符:*, ?, [ ]
(1) * 匹配任意长度的任意字符
a*b(a开头b结尾):aab、ab、a123b
(2) ? 任意单个字符
a?b:aab, acb
a??b: acvb, ahjb
(3) [ ] 匹配指定范围内的任意单个字符
[a-z] 匹配单个字母,不区分大小写
[A-Z] 匹配单个大写字母
(4) [^] 匹配指定范围外的任意单个字符
[^0-9] 匹配0-9之外的任意单个字符,
例如aab, a@b, a2b 中a[^0-9]b: aab, a@b
例如aab, a@b, a2b 中a[[:lower:]]b: aab, 只选中aab
专用字符集合:
[:digit:] 任意数字,相当于数字0-9
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:alpha:] 任意大小写字母
[:alnum:] 任意数字或字母
[:space:] 表示空格
[:punct:] 表示标点符号
练习:
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录;
ls -d /var/l[[:digit:]][[:lower:]]
ls -d /var/l[0-9][[:lower:]]
ls l[[:digit:]][[:lower:]] /var 错误做法
2、显示/etc目录下,以任意一位数字开头,且以非数字结尾的文件或目录;
ls -d /etc/[[:digit:]][^[:digit:]]
ls -d /etc/[0-9][^0-9]
ls [[:digit:]][^[:digit:]] /etc 错误做法
3、显示/etc目录下,以非字母开头,后面跟了一个字母及其他任意长度任意字符的文件或目录;
ls -d /etc/[^[:alpha:]][[:alpha:]]
ls [^[:alpha:]][[:alpha:]] /etc 错误做法
4、复制/etc目录下,所有以m开头,以非数字结尾的文件或目录到/tmp/x目录中;
cp -ra /etc/m*[^[:digit:]] /tmp/x
5、复制/etc目录下,所有/etc目录下,所有以.d结尾的文件或目录到/tmp/x目录中;
cp -ra /etc/*.d /tmp/x
6、复制/etc目录下,所有以.conf结尾,且以m、n、r、p开头的文件或目录/tmp/x目录中;
cp -ra /etc/[mnrp]*.conf /tmp/x
11,bash快捷键
ctrl+l 清屏,相当于clear命令
ctrl+a 光标跳转到命令开始处
ctrl+e 光标跳转到命令结尾处
ctrl+c 取消命令的执行
ctrl+u 删除命令行首到光标所在处的所有内容
ctrl+k 删除光标所在处到命令行结尾处的所有内容
12,bash的I/O重定向及管道
程序:指令+数据
读入数据:Input
输出数据:Output
打开的文件都有一个fd:file descriptor 文件描述符
标准输入:keyboard,0
标准输出:monitor,1
标准错误输出:monitor,2
I/O 重定向:改变标准位置
输出重定向:
COMMAND > NEW_POS,COMMAND >> NEW_POS 若目标不存在,则新建目标文件,后输出重定向;
>: 覆盖重定向,目标文件的原有内容会被消除,覆盖
>>: 追加重定向,新内容会追加到目标文件尾部
# set -C: 禁止将内容覆盖输出到已有文件中;
强制覆盖:>|
# set +C: 允许覆盖重定向
2> 覆盖重定向错误输出数据流,对于正常的输出无能为力
2>> 追加重定向错误输出数据流
标准输出和错误输出各自重定向到不同的位置;
COMMAND > /path/to/file.out 2> /path/to/error.out
合并标准输出和错误输出为同一个数据流进行重定向;
&>: 覆盖重定向
&>>: 追加重定向
COMMAND > /path/to/file.out 2> &1
COMMAND >> /path/to/file.out 2>> &1
使用1代表标准输出,2代表错误输出,进行覆盖重定向
使用1代表标准输出,2代表错误输出,进行追加重定向
输入重定向: <
tr命令: 转换或删除字符, 默认只从标准输入读取数据
tr [option]... set1 [set2]
例如:tr abc ABC < /etc/fstab 将fstab中的abc全转换成对应的ABC,这里强行从文件中读取
-d: 对对应的内容进行删除
HERE Doucumentation << 此处生成文档
#cat << EOF
#cat > /path/to/somefile <<EOF
例如下面:
# cat >> /tmp/test.out << EOF
> how are you?
> how old are you?
> EOF
此处,给定字符EOF(end of file)表示结束,当遇到给定字符代表结束,内容没有到屏幕当中,被储存到test.out文件中了
13, 管道:
把前一个命令的输出当作后一个命令的输入
COMMAND1 | COMMAND2 | COMMAND3 |...
注意:最后一个命令会在当前shell进程的子shell进程中执行
[root@localhost ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘/USR/LIB64/QT3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN [root@localhost ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘ | tr -d U/SR/LIB64/QT3.3/BIN:/SR/LOCAL/SBIN:/SR/LOCAL/BIN:/SBIN:/BIN:/SR/SBIN:/SR/BIN:/ROOT/BIN 复制代码
tee命令
一路输入,两路输出,两路输出为标准输出和输出至文件中并储存起来。
tee [option]... [file]...
[root@localhost ~]# tee /tmp/123 first line. first line. second line. second line. [root@localhost ~]# cat /tmp/123 first line. second line. [root@localhost ~]# echo $PATH | tr ‘a-z‘ ‘A-Z‘ | tee /tmp/path.out /USR/LIB64/QT3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN [root@localhost ~]# cat /tmp/path.out /USR/LIB64/QT-3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN [root@localhost ~]# echo $PATH | tee /tmp/tee.out | tr ‘a-z‘ ‘A-Z‘ /USR/LIB64/QT3.3/BIN:/USR/LOCAL/SBIN:/USR/LOCAL/BIN:/SBIN:/BIN:/USR/SBIN:/USR/BIN:/ROOT/BIN [root@localhost ~]# cat /tmp/tee.out /usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
练习:
1、将/etc/passwd文件中的前5行内容转换为大写保存到/tmp/passwd.out文件中;
head -5 /etc/passwd | tr ‘a-z‘ ‘A-Z‘ | tee /tmp/passwd.out head -5 /etc/passwd | tr ‘a-z‘ ‘A-Z‘ > /tmp/passwd.out head -5 /etc/passwd | tr [[:lower:]] [[:upper:]] > /tmp/passwd.out
2、将登陆到当前系统上用户信息中的后3位的信息转换为大写保存到/etc/who.out文件中;
who | tail -3 | tr ‘a-z‘ ‘A-Z‘ | tee /tmp/who.out who | tail -3 | tr ‘a-z‘ ‘A-Z‘ > /tmp/who.out who | tail -3 | tr [[:lower:]] [[:upper:]] > /tmp/who.out
编程环境、shell脚本、文本文件、变量类型等;
14,提供了编程环境
程序=指令+数据
程序编程风格
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell程序:提供了编程能力,解释执行
程序的执行方式:
计算机:运行二进制指令
编程语言:
低级:汇编
高级:
编译:高级语言-->编译器-->目标代码(C、C++、java)
解释:高级语言-->解释器-->机器代码(shell、perl、python)
过程式编程:
顺序执行、循环执行、选择执行
shell编程:过程式、解释执行
编程语言的基本结构:
数据存储(变量、数组)、表达式、语句
15,shell脚本:文本文件
shebang机制:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
magic number 魔数
运行脚本:
1、给予执行权限,通过具体的文件路径指定文件执行
2、直接运行解释器,将脚本作为解释器程序的参数运行
[root@localhost ~]# mkdir scripts [root@localhost ~]# nano first.sh [root@localhost ~]# cat scripts/first.sh #!/bin/bash *以bash来解释执行* cat /etc/fstab wc -l /etc/fstab [root@localhost ~]# ll scripts/first.sh -rwxr--r-- 1 root root 47 6月 3 09:02 scripts/first.sh [root@localhost ~]# chmod +x scripts/first.sh [root@localhost ~]# ll scripts/first.sh -rwxr-xr-x 1 root root 47 6月 3 09:02 scripts/first.sh [root@localhost ~]# scripts/first.sh *运行脚本第一种方法* # # /etc/fstab # Created by anaconda on Sat May 5 17:43:23 2018 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=edace35a-2d7e-4ec4-9d68-c7c4f14704fc /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 11 /etc/fstab [root@localhost ~]# bash scripts/first.sh *运行脚本第二种方法* # # /etc/fstab # Created by anaconda on Sat May 5 17:43:23 2018 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=edace35a-2d7e-4ec4-9d68-c7c4f14704fc /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 11 /etc/fstab
16,变量:命名的内存空间
数据存储方式:ASCII
字符:110 转换为二进制 24位
数值:110 转换为二进制 8位(整型、浮点型)
变量的作用:
1、数据存储格式;
2、参与的运算、
3、表示的数据范围
类型:
字符
数值:整型、浮点型
编程程序语言:
强类型:C
弱类型:bash
把所有要存储的数据统统当作字符进行,支持隐式类型转换、不支持浮点数
逻辑运算:
true、false(1、0)
与: 1 && 1=1 1 && 0=0 0 && 1=0 0 && 0=0 或: 1 || 1=1 1 || 0=1 0 || 1=1 0 || 0=0 非: !1=0 !0=1
短路运算:
与:
第一个为0,结果必定为0
[root@localhost ~]# catt /etc/issue && cat /etc/issue -bash: catt: command not found [root@localhost ~]# catt /etc/issue && cat /etc/issuee -bash: catt: command not found 第一个为1,第二个必须要参与运算 [root@localhost ~]# cat /etc/issue && echo "true" CentOS release 6.5 (Final) Kernel \r on an \m true [root@localhost ~]# cat /etc/issue && catt /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m -bash: catt: command not found 或: 第一个为1,结果必定为1 [root@localhost ~]# cat /etc/issue || cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@localhost ~]# cat /etc/issue || catt /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m 第一个为0,第二个必须要参与运算 [root@localhost ~]# catt /etc/issue || cat /etc/issue -bash: catt: command not found CentOS release 6.5 (Final) Kernel \r on an \m [root@localhost ~]# catt /etc/issue || cat /etc/issuee -bash: catt: command not found cat: /etc/issuee: No such file or directory
与、或的混合应用
[root@localhost ~]# cat /etc/issue &> /dev/null && echo "true" || echo "false"
true
[root@localhost ~]# catt /etc/issue &> /dev/null && echo "true" || echo "false"
false
17,作业控制
ctrl z暂停一一个任务
jobs查看后台的任务
bg[id]把任务调到后台
fg[id]把任务调到前台
命令后面加&直接丢到后台
变量
env:获取系统常用变量名
set:查看系统常用变量和用户自定义的变量
自定义变量a=1
变量名规则:字母、数字下划线,首位不能为数字
变量值有特殊符号时需要用单引号括起来
变量的累加
全局变量export b=2
unset变量
pstree 查看树
变量类型:
数据存储格式、存储空间大小、参与运算种类
字符型
数值型(整型、浮点型)
强类型:定义变量是必须指定类型,参与运算必须符合类型要求,调用未声明变量会产生错误;例如:C
弱类型:无须指定类型,默认均为字符型,参与运算会自动进行隐式类型转换;例如:bash
bash中的变量的种类:
根据变量的生效范围的标准划分:
本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
位置变量:$1、$2...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?、$0
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步