zl程序教程

您现在的位置是:首页 >  其他

当前栏目

bash shell 特性

shell 特性 Bash
2023-09-11 14:17:06 时间

1、历史命令

执行过的命令会记录到history对应的缓冲区中
用户注销后,会将缓冲区的历史命令追加保存到~/.bash_history文件中;
次登录时,会自动读取文件到缓冲区中。
命令:history
作用:显示和管理曾经执行过的命令列表
参数:
-c 清空历史命令
n 显示n条历史

相关的shell变量:
HISTSIZE 命令历史记录的条数,默认3000
HISTFILE 指定历史文件,默认~/.bash_history
HISTTIMEFORMAT 显示时间,HISTTIMEFORMAT="%F %T"
HISTCONTROL 控制命令记录的记录方式(ignoredups  忽略重复命令默认,连续且相同为重复;ignorespace 忽略所有以空白开头的命令;ignoreboth 包含上面两个;erasedups 删除重复命令)
持久保存上述变量:可存放在/etc/profile或者~/.bash_profile
[root@szb data]# echo 'export HISTTIMEFORMAT="%F %T"' >> ~/.bash_profile
历史命令的快捷方式:
1)重复前一个命令:
1.上下键
2.!!回车
3.!-1回车

2)执行前一个不包含参数的命令:!:0
3) 执行history命令输出对应序号n的命令:!n ; 倒数第n个命令:!-n
4) 重复前一个包含string的命令:!?string
5) 重复前一个以string开头的命令:!string
6) 在命令历史中搜索:Ctrl+r;退出:Ctrl+g
7) 要重新调用前一个命令的最后一个参数:
!$ ; Esc松开后,单击.   Alt+.
8) 调用历史参数
利用上一个命令的全部参数做command的参数:command !*

2、命令行展开
即把命令行中给定的特殊符号自动替换为相应的字符串机制

~ 用户家目录
~username 指定的用户家目录,/home/username
{} 可包含一个以逗号分割的字符串或序列,能够展开为多个字符串

示例:
[root@szb szb]# echo {1..3}
1 2 3
[root@szb szb]# echo {1..4..2}
1 3

3、通配符glob,即特定的字符(元字符),可实现对相关文件名的匹配;man 7 glob,报错的话需要安装man-pages

元字符作用
*匹配任意长度的任意字符
匹配任意单个字符
[]中括号匹配指定集合内的任意单个字符
[szb]:匹配s,z,b三个字符中任意一个
[0-9]:匹配单个数字
[[:upper:]]:匹配任意单个所有大写字母
[[:lower:]]:匹配任意单个所有的小写字母
[[:alpha:]]:匹配任意单个所有字母
[[:digit:]]:匹配任意单个所又数字,等价于[0-9]
[[:alnum:]]:匹配任意单个所有字母和数字
[[:space:]]:匹配单个空白字符
[[:punctl:]]:匹配单个标点符号
[^]:匹配指定集合外的任意单个字符

4、变量
一)变量基础用法

在bash中变量分为  内置变量和自定义变量
内置变量:bash自身带的变量
自定义变量:用户根据自己需要新建的
用法:
1.变量名=变量对应的值
2.变量名不能数字开头,只能包含数字,英文字母,下划线
3.删除自定义的变量:unset 变量名
4.不能使用shell命令和关键字作为变量名,变量内容有空格,需要单/双引号括起来
5.没有赋值的变量,值为空,null;与其他字符相连时,${变量名}_string
6.有些需要转义为一般符号,加\转义符;如:\$
注意:等号两侧不能有空格,引用变量:$变量名

二)变量分类

根据变量的有效范围可分为:
1.普通变量
2.环境变量
3.本地变量
普通变量
作用域:当前shell进程,不包括子进程,shell进程终止即撤销

环境变量
作用域:当前shell进程及子进程,export或declare -x声明
显示环境变量:env;export;declare -x;printenv

本地变量
作用域:可引用的范围,例:函数;需要local来声明
显示所有的变量和函数:set

三)只读变量

根据变量是否可修改:只读变量和可修改变量(新建的默认此变量)
1.只读的变量,需要加readonly关键字声明:readonly 变量名;
2.显示所有只读的变量:readonlu 或declare -r
3.不能修改和删除,程序执行完即结束

四)系统内置变量

特殊的变量:
1.PSI:命令提示符
2.PATH:执行文件的搜索路径,目录之间冒号隔开
3.$$:脚本运行的当前进程ID号,895
4.HOSTTYPE:主机类型,x86_64;OSTYPE:操作系统类型,linux-gnu;MACHTYPE:机器类型
5.LANG:系统使用的语言及编码字符集;local -a查看系统支持的所有语系编码,centos7(/etc/local.conf),可使用localctl命令进行管理
6.RANDOM:生成随机数字的变量,0~32767之间
7.USER/UID/HOME/SHELL/BASHPID/HISTSIZE/MAIL/PATH

五)变量引用特殊符号含义

$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误

六)执行状态结果变量

$?: 0为前一个命令执行成功;1为失败;0-255之间
exit N:指定脚本的返回状态码

5、单引号、双引号、反向单引号

1.单引号(''):强引用,命令变量无法识别,原样输出
2.双引号(""):弱引用,只能识别变量,命令无法识别
3、反单引号(``):等价于$(),命令变量都可以识别

6、多命令执行

1.分号连接多个命令:command1;command2;command3,
eg:ls;date

2.小括号包含多个命令:(command1;command2;command3)
1)会开启子进程;
2()内的变量赋值不会影响当前shell的变量值

3.花括号包含多个命令:{ command1;command2;command3; }
注意:
1)不会开启子进程;
2{}内的赋值会影响当前shell的变量值;
3{}和命令之间至少有一个空格;
4)最后一个命令必须分号;或换行符结尾

7、I/O重定向

一个文件打开时,会有文件描述符的软链接,指向正在打开的文件;
文件描述符fd(file directory):一个非负整数

数据流:
	输入流(标准输入STDIN)
	输出流(标准错误输出STDERR、标准正确输出STDOUT)
查看当前默认的对应的设备
[root@szb ~]# ll /proc/$BASHPID/fd
total 0
lrwx------ 1 root root 64 Jun 17 12:09 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 17 12:09 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 17 12:09 2 -> /dev/pts/0
lrwx------ 1 root root 64 Jun 17 12:10 255 -> /dev/pts/0
1.标准输入重定向:描述符代码0,0<<
2.标准输出重定向:描述符代码1,1>>
3.标准错误重定向:描述符代码2,2>2>>

设置禁用覆盖重定向:set -C 可以追加
也可以使用强制覆盖:>| file
允许覆盖:set +C

dd命令

dd if=/dev/zero of=/boot/bigfile bs=1M count=800
如果删除一个正在访问的文件,空间不会立刻释放
> filrname  # 快速删除文件并释放占用的磁盘空间,bash shell有效
cat /dev/null > filename  # 通用方法清理文件内容
/dev/null # 黑洞、垃圾桶

**标准错误输出和标准输出都重定向同一个文件:**
1.&> file
2.> file 2>&1    # 注意:2>&1必须放命令后面

标准输入重定向:
command < file
示例:cat > issue.bak < /etc/isuue      # issue文件的备份

tr 命令:
作用:接收标准输入按照指定规则进行转换,并输出窗口
示例:tr 'a-z' 'A-Z' < /etc/issue  #将文件所有小写字母转换为大写字母
tr -d '[:alpha:]' < /etc/fstab # 删除文件的所有字母
tr -d '\r' < win.txt > linux.txt    # 将window文本转换为Linux文本

多行标准输入重定向,就地文本(Here Documents)

格式:command << [-] 分隔符
line1
.....
分隔符
注意:
1.分隔符默认EOF,可以是任意普通字符串
2.分隔符必须独立一行,前后不能有其他字符
[root@szb ~]# cat > bc.txt <<EOF
> 2^3
> EOF
[root@szb ~]# bc < bc.txt
8

8、管道–进程间通讯,|

只能处理前一个命令的标准输出,而非标准错误;
要收到前一个命令的标准错误:command1 2>&1 | command2  或者 command1 |& command2 

tee 命令
作用:
1.可以接收标准输入,重定向多个目标,
2.可实现同时数据流分送给文件和终端屏幕,多管道处理
[root@szb ~]# hostname | tee -a tee.log | tr 'a-z' 'A-Z'
SZB
[root@szb ~]# cat tee.log
szb

9、示例
1、创建一个日志文件,文件格式为:test-昨天日期.log,日期格式:YYYY-MM-DD

[root@szb ~]# date
Fri Jun 17 17:10:01 CST 2022
[root@szb ~]# touch test-`date -d "-1 day" +"%F"`.log
[root@szb ~]# ls test*
test-2022-06-16.log  test.sh

2、如何保存Linux历史命令并显示命令操作时间
设置环境变量,临时生效:HISTTIMEFORMAT=“%F %T”
永久生效:写到/etc/profile文件中

3、特殊变量的$$含义:
当前进程的pid号