首頁 > 運維 > Nginx > Linux 指令中「!」操作符的八個神秘用途

Linux 指令中「!」操作符的八個神秘用途

PHPz
發布: 2023-06-27 12:51:02
轉載
1287 人瀏覽過

在不同的shell中,使用’!’符號的大多數Linux指令用法可能會有所不同。雖然我提供的範例通常在bash shell中使用,但其他一些Linux shell可能具有不同的實現,或者可能根本不支援某些對’!’符號的使用。

讓我們深入了解Linux指令中’!’符號的令人驚奇和神秘的用法。

Linux 命令中“!”操作符的八个神秘用途

1、使用指令編號從歷史記錄中執行指令

一個有用的提示是,你可以從之前執行過的命令中找到歷史命令並再次運行。首先,透過執行’history’指令找到指令的編號。

linuxmi@linuxmi:~/www.linuxmi.com$ history
登入後複製

Linux 命令中“!”操作符的八个神秘用途

在Linux中尋找最近執行的指令

要透過指令編號從歷史記錄中執行指令,可以使用'!'符號後接指令編號,如下圖所示。

$ !58
登入後複製

Linux 命令中“!”操作符的八个神秘用途

按指令編號執行指令

當你執行上述指令時,它將執行歷史記錄中第58行的指令。

請注意,實際的指令編號可能會因你的指令歷史而有所不同。你可以使用history指令查看指令清單及其行號。

2、在Linux中執行先前執行的命令

你可以透過命令的運行順序來執行先前執行過的命令,最後運行的命令將表示為-1,倒數第二個為-2,倒數第七個為-7,依此類推。你可以使用!-n,其中n是你要引用的命令的倒數編號。如下圖

$ history$ !-3$ !-6$ !-10
登入後複製

Linux 命令中“!”操作符的八个神秘用途

在Linux中重新執行指令

3、將先前指令的參數傳遞給新指令

我需要列出目錄'/home/linuxmi/snap'的內容,所以我執行了以下命令:

$ ls /home/linuxmi/snap
登入後複製

接著我意識到,應該運行"ls -l"命令以查看哪些文件可執行。不必重新輸入整個命令,只需將上個命令的參數傳遞給這個新命令即可,如下所示:

$ ls -l !$
登入後複製

Linux 命令中“!”操作符的八个神秘用途

在這裡,'!$'將上個命令中傳遞的參數傳遞給這個新命令。

4、如何處理命令中的兩個或多個參數

假設我在桌面上建立了一個名為1.txt的文字檔案。

linuxmi@linuxmi ~/www.linuxmi.com% touch /home/linuxmi/linuxmi.go
登入後複製

然後使用完整路徑將其複製到’/home/avi/Downloads’目錄中,使用cp指令。

linuxmi@linuxmi ~/www.linuxmi.com% cp /home/linuxmi/linuxmi.go /home/linuxmi/go
登入後複製

現在我們在cp指令中傳遞了兩個參數。第一個是’/home/avi/Desktop/1.txt’,第二個是’/home/avi/Downloads’。我們可以透過執行echo指令,並使用不同的參數,以不同的方式列印兩個參數。

linuxmi@linuxmi ~/www.linuxmi.com% echo "第一个参数是:!^"echo "第一个参数是:/home/linuxmi/linuxmi.go"第一个参数是:/home/linuxmi/linuxmi.golinuxmi@linuxmi ~/www.linuxmi.com% echo "第二个参数是:!cp:2"echo "第二个参数是:/home/linuxmi/go"第二个参数是:/home/linuxmi/go
登入後複製

請注意,第一個參數可顯示為“!^”,而其它參數可透過執行“![指令名稱]:[參數編號]”進行列印。

在上面的範例中,第一個指令是’cp’,需要列印第二個參數。因此是”!cp:2″。對於具有5個參數的xyz指令,如果需要取得第4個參數,可以使用“!xyz:4”,並根據需要使用該參數。可以透過”!*”存取所有的參數。

Linux 命令中“!”操作符的八个神秘用途

處理兩個或多個參數

5、根據特定關鍵字執行最近的命令

我們可以根據關鍵字執行最近執行的命令。具體如下所示:

$ ls /home > /dev/null				[Command 1]$ ls -l /home/linuxmi/linuxmi > /dev/null		[Command 2]	$ ls -la /home/linuxmi/linuxmi.com > /dev/null	[Command 3]$ ls -lA /usr/bin > /dev/null			[Command 4]
登入後複製

這裡我們使用了ls指令,但使用了不同的選項和不同的資料夾。另外,為了保持控制台的清潔,我們會將每個指令的輸出傳送到「/dev/null」。

現在根據關鍵字執行最後執行的命令:

$ ! ls			[Command 1]$ ! ls -l		[Command 2]	$ ! ls -la		[Command 3]$ ! ls -lA		[Command 4]
登入後複製

Linux 命令中“!”操作符的八个神秘用途

检查输出,你会惊讶地发现你正在运行已经执行过的命令,只是使用了ls关键词。

6、在Linux中重复上次执行的命令

你可以使用(!!)操作符来运行/修改你上次执行的命令,这是一个简写符号,允许你引用在命令行中执行的上一个命令。

例如,我运行了一个单行脚本来查找Linux机器的IP地址:

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/
登入後複製

然后突然我发现我需要将上述脚本的输出重定向到一个名为ip.txt的文件中,那么我该怎么办呢?我需要重新输入整个命令并将输出重定向到文件吗?好吧,一个简单的解决方案是使用上箭头键来调出上一条命令,并在末尾添加’> ip.txt’来将输出重定向到文件。

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt
登入後複製

感谢上箭头键的救命作用。现在考虑以下情况,下次我运行下面的单行脚本。

ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:
登入後複製

当我运行脚本时,bash提示返回了一个错误,信息为“bash: ifconfig: command not found”,我很容易猜到我以一个普通用户的身份运行了这个命令,而它应该以root身份运行。

那么解决办法是什么呢?登录为root然后重新输入整个命令是很困难的!在上一个示例中的(上箭头键)在这里也无法帮助。所以,要调用用户的最后一个命令,需要输入“!!”(不需要引号)

su -c “!!” root
登入後複製

这里的su是切换用户的命令,root是要切换到的用户,-c是以指定的用户身份运行命令的选项,最重要的部分是!!将被替换为上次运行的命令。是的!你需要提供root密码。

7、使用’!’操作符删除除一个文件之外的所有文件

在Linux中,’!’操作符(也称为”bang”操作符)用于历史扩展,它允许你引用先前的命令并对其执行各种操作。要从目录中删除除了特定文件(important_file.txt)之外的所有文件,可以使用带有’!’操作符的rm命令,如下所示。

$ rm !(important_file.txt)
登入後複製

要从文件夹中删除除了扩展名为’.pdf’之外的所有文件类型。

$ $ rm !(*.pdf)
登入後複製

8、检查Linux中的目录是否存在

在这里,我们将使用’! -d’来验证目录是否存在,如果目录不存在,则紧随其后的是逻辑与操作符(&&),打印出目录不存在,如果目录存在,则紧随其后的是逻辑或操作符(||),打印出目录存在。

逻辑是,当[ ! -d /home/linuxmi/linuxmi.com ]的输出为0时,它将执行逻辑与之后的内容,否则它将转到逻辑或(||)并执行逻辑或之后的内容。

$ [ ! -d /home/linuxmi/linuxmi.com ] && printf '\nno such /home/linuxmi/linuxmi.com directory exist\n' || printf '\n/home/linuxmi/linuxmi.com directory exist\n'
登入後複製

类似于上面的条件,但是如果所需目录不存在,它将退出命令。

$ [ ! -d /home/linuxmi/linuxmi.com] && exit
登入後複製

在脚本语言中的一般实现,如果所需目录不存在,它将创建一个目录。

[ ! -d /home/linuxmi/linuxmi.com] && mkdir /home/linuxmi/linuxmi.com
登入後複製

以上是Linux 指令中「!」操作符的八個神秘用途的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板