这一篇博客会介绍“!”符号在不同情境下的使用
1、重复执行先前命令
2、逻辑非
3、作为shell内部变量
4、变量的间接引用
一、重复执行先前命令: !
在bash中,为了重复执行先前命令,可以利用感叹号“!”引用机制实现。
“!”表示引用命令历史缓冲区的或文件中的命令。
常用的“!”命令使用及说明:
⑴ ! 表示引用命令历史缓冲区或文件中的命令
⑵ !! 重复执行刚才执行过的命令
⑶ !N 重复执行命令历史缓冲区或文件中序号为N的命令
⑷ !-N 重复执行从当前命令位置开始倒计数的第N个命令
⑸ !string 重复执行最近一个执行,以给定字符string为起始字符串的命令
解释:以string为起始的命令,基本就是命令行的一部分,注意“起始”。
⑹ !?string[?] 重复执行最近一个执行,包含给定字符串string的命令
⑺ !!string 引用前一个命令,附加给定字符串string,然后执行。
⑻ !N string 引用第N个命令,附加给定的字符串string,然后执行。
⑼ !# 引用迄今为止已经输入的所有字符
⑽ !$ 引用前一个命令的最后一个参数
⑾ !!:[g]s/old/new/ 以指定字符串new替换命令中出现的第一个或全部字符串old。是替换第一个还是全部,要看带不带[g]选项。然后执行。
⑿ ^old^new^ 以给定字符串new替换命令中第一个出现的字符串old。并执行。
上面这些对历史命令的查找操作,与之前的在管道那一节中对后台作业的查找操作和格式很像,可以进行一下对比:点击打开链接。
第二种:作为逻辑非“!”
1、用于test命令查找时的取逻辑非操作,test命令支持的其它逻辑操作:点击打开链接,查看里面的第四大点。
2、通配符中的给定范围取反操作。通配符的使用具体可以看:点击打开链接
第三种:作为shell内部变量
$! 表示最近运行的一个后台进程的PID信息。shell内部变量看链接:
第四种:变量的间接引用
⑴ 脚本举例test.sh:
var1=a
var2=var1
现在,如何通过变量var2,引用字符var1对应的变量var1,的值a字符呢?
⑵ 一般情况下:
var1=a
var2=$var1 #对变量var1的引用
这种情况是非常普遍的,直接用变量替换的形式,让两变量var1和var2直接相等。
相比于例子2,例子1中,是想通过一个字符,来引入其对应的一个变量的值,可以通过两种方式。
① 可以用到eval命令:
格式:eval var3=\$$var2,
这样就可以对变量var2的值var1字符串,对应的变量进行引用。
不过有简单的方式:
② echo ${!var2}
这样就直接对变量var2中的值var1,对应变量进行了引用。
注意:!var2之间不能有空格