Shell腳本中多命令邏輯執(zhí)行順序的方法詳解
Linux中可以使用分號(hào)“;”、雙and號(hào)“&&”和雙豎線“||”來連接多個(gè)命令。單"&"符號(hào)也算命令連接符號(hào),只不過它是將其前面的命令放入后臺(tái)執(zhí)行,所以可以變相地實(shí)現(xiàn)命令并行執(zhí)行。
1.分號(hào)";"
command1 ; command2
命令之間沒有邏輯關(guān)系。分號(hào)連接的命令會(huì)按照順序從前向后依次執(zhí)行,但分號(hào)兩端的命令之間沒有任何邏輯關(guān)系,所有寫出來的命令最終都會(huì)被執(zhí)行,即使分號(hào)前面的命令出錯(cuò)也不影響后面的命令。
[root@xuexi ~]# ls das;echo "hdakl" ls: cannot access das: No such file or directory hdakl
2.&&
command1 && command2
邏輯與。&&連接的命令會(huì)按照順序從前向后執(zhí)行,但只有當(dāng)command1正確執(zhí)行才執(zhí)行command2,如果command1不正確執(zhí)行,則不執(zhí)行command2。在bash中,通過預(yù)定義變量“$?”來判斷命令是否正確執(zhí)行,如果"$?"的值為0則表示前一條命令正確執(zhí)行,其他任意值都表示不正確執(zhí)行。\
[root@xuexi ~]# echo "hdakl" && ls ds hdakl ls: cannot access ds: No such file or directory [root@xuexi ~]# ls das && echo "hdakl" ls: cannot access das: No such file or directory
3.||
command1 || command2
邏輯或。||連接的命令會(huì)按照順序從前向后執(zhí)行,但只有當(dāng)command1不正確執(zhí)行才執(zhí)行command2,command1正確執(zhí)行則不會(huì)執(zhí)行command2。||和&&都是短路符號(hào),符號(hào)左右的命令之間具有邏輯關(guān)系。
[root@xuexi ~]# ls das || echo "hdakl" ls: cannot access das: No such file or directory hdakl [root@xuexi ~]# echo "hdakl" || ls ds hdakl
一般要聯(lián)合使用&&和||的時(shí)候,基本上都會(huì)先邏輯與再邏輯或:command1 && command2 || command3。因?yàn)樵趯?shí)際中,command2和command3應(yīng)該都是想要執(zhí)行的命令。如果command1正確執(zhí)行,$?就等于0,執(zhí)行command2,再看情況執(zhí)行command3,如果command1錯(cuò)誤執(zhí)行,$?就不等于0,所以不執(zhí)行command2,根據(jù)$?為非0值,判斷了 || 右邊的命令應(yīng)該被執(zhí)行。
通俗點(diǎn)的理解方法是根據(jù)語義判斷?!叭绻?..就...否則...就...”的語句使用“cmd1 && cmd2 || cmd3”,“如果不...就...否則...就...”使用“!cmd1 && cmd2 || cmd3”。
例如,如果用戶user1存在,就顯示用戶已經(jīng)存在,否則,就添加此用戶。
[root@xuexi tmp]# id user1 && echo "user1 exists" || useradd user1
如果用戶user2不存在,則添加此用戶,否則顯示用戶已存在。
[root@xuexi tmp]# !id user2 && useradd user2 || echo "user2 exists"
如果用戶user3不存在,則添加此用戶,并設(shè)定其密碼為用戶名本身,否則顯示用戶已存在。
[root@xuexi tmp]# !id user3 && useradd user3 && echo "user3" | passwd --stdin user3 || echo "user3 exists"
4.&
command1 &
command1 & command2
&表示將其前面的命令放入后臺(tái)執(zhí)行,放入后臺(tái)后會(huì)立即返回到bash環(huán)境讓用戶可以繼續(xù)和bash交互。如果&符號(hào)連接了兩個(gè)命令,則其前面的命令被放入后臺(tái),立即執(zhí)行后面的命令,所以可以簡(jiǎn)單地認(rèn)為這兩個(gè)命令是并行執(zhí)行的,兩端的命令之間也沒有任何邏輯關(guān)系。
需要注意的一點(diǎn)是,在終端的bash環(huán)境下,子shell中的后臺(tái)的進(jìn)程不受終端控制,在終端被關(guān)閉時(shí)它會(huì)掛靠在init/systemd進(jìn)程下,因此退出終端或腳本shell環(huán)境,無法中斷這些后臺(tái)進(jìn)程。例如:
[root@xuexi ~]# (sleep 10 &) # 終端1上執(zhí)行,立即關(guān)閉該終端 [root@xuexi ~]# ps aux | grep slee[p] # 終端2上捕捉sleep進(jìn)程 root 5732 0.0 0.0 107892 624 ? S 00:28 0:00 sleep 10
注意ps結(jié)果中的"?",它表示非終端進(jìn)程,即脫離了終端。
知識(shí)點(diǎn)補(bǔ)充:Shell 命令執(zhí)行順序
在執(zhí)行某個(gè)命令的時(shí)候,有時(shí)需要依賴于前一個(gè)命令是否執(zhí)行成功。例如,假設(shè)你希望將一個(gè)目錄中的文件全部拷貝到另外一個(gè)目錄中后,然后刪除源目錄中的全部文件。在刪除之前,你希望能夠確信拷貝成功,否則就有可能丟失文件
在本文中,我們將討論:
命令執(zhí)行控制。
命令組合。
&&的使用:
&&就可以解決上面背景說的問題。前面指令執(zhí)行成功才執(zhí)行后面的指令。
使用語法:
命令1&&命令2
相當(dāng)于邏輯與操作:
condition1 && condition2
只有當(dāng)condition1為True,才會(huì)判斷得出condition2
示例:
要求:拷貝 /tmp/nginx.conf 到 /etc/nginx/nginx.conf 后把/tmp/nginx.conf刪除
cp /tmp/nginx.conf /etc/nginx/nginx.conf&&rm -rf /tmp/nginx.conf
||的使用:
||的意思是,當(dāng)||前面的命令執(zhí)行成功就不執(zhí)行||后面的命令
使用語法:
命令1||命令2
邏輯或的思維。
示例:
要求:拷貝 /tmp/nginx.conf 到 /etc/nginx/nginx.conf 否則把/tmp/nginx.conf 拷貝到 /usr/nginx/nginx.conf
cp /tmp/nginx.conf /etc/nginx/nginx.conf||cp /tmp/nginx.conf /usr/nginx/nginx.conf
為了在當(dāng)前s h e l l中執(zhí)行一組命令,可以用命令分隔符隔開每一個(gè)命令,并把所有的命令 用圓括號(hào)()括起來。
語法:
(命令1;命令2;. . .)
示例:當(dāng)失敗了,發(fā)郵件給自己然后退出
[root@localhost shell_protest]# cat co.sh #!/bin/bash false||echo "it is fail"|mail nick&&exit #特例:當(dāng)失敗了,發(fā)郵件也失敗了,就退出不了程序了 false||echo "it is fail"|mail nick||exit #特例:當(dāng)失敗了,發(fā)郵件也成功了,但退出不了程序了 false||(echo "it is fail"|mail nick;exit) #所以,使用()來組合命令,是一種不錯(cuò)的選擇
總結(jié):
在編寫shell腳本時(shí),使用&&和||對(duì)構(gòu)造判斷語句非常有用。如果希望在前一個(gè)命令執(zhí)行失敗的情況不執(zhí)行后面的命令,那么本文所講述的方法非常簡(jiǎn)單有效。使用這樣的方法,可以根據(jù)&&或||前面命令的返回值來控制其后面命令的執(zhí)行。
到此這篇關(guān)于Shell腳本中多命令邏輯執(zhí)行順序的方法詳解的文章就介紹到這了,更多相關(guān)shell腳本多命令執(zhí)行順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux基礎(chǔ)命令last 命令實(shí)例詳解
Linux last命令用于顯示系統(tǒng)開機(jī)以來獲是從每月初登入者的訊息。本文主要給大家介紹Linux基礎(chǔ)命令last 命令實(shí)例詳解,感興趣的朋友跟隨小編一起看看吧2018-10-10使用Shell 腳本實(shí)現(xiàn)每隔100行插入一條記錄且記錄第一列包含行號(hào)其他列不變
本文通過實(shí)例代碼給大家講解了使用Shell 腳本實(shí)現(xiàn)每隔100行插入一條記錄且記錄第一列包含行號(hào)其他列不變的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2016-12-12shell 字符串操作(長(zhǎng)度,查找,替換)詳解
在做shell批處理程序時(shí)候,經(jīng)常會(huì)涉及到字符串相關(guān)操作。有很多命令語句,如:awk,sed都可以做字符串各種操作。其實(shí)shell內(nèi)置一系列操作符號(hào),可以達(dá)到類似效果,大家知道,使用內(nèi)部操作符會(huì)省略啟動(dòng)外部程序等時(shí)間,因此速度會(huì)非常的快2012-09-09淺析使用?Auditbeat?模塊監(jiān)控?shell?命令的問題
Auditbeat Audited 模塊可以用來監(jiān)控所有用戶在系統(tǒng)上執(zhí)行的 shell 命令,在終端用戶偶爾才會(huì)登錄的服務(wù)器上,通常需要進(jìn)行監(jiān)控,本文給大家介紹使用?Auditbeat?模塊監(jiān)控?shell?命令的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-02-02利用shell腳本遍歷文件夾內(nèi)所有的文件并作整理統(tǒng)計(jì)的方法
今天小編就為大家分享一篇利用shell腳本遍歷文件夾內(nèi)所有的文件并作整理統(tǒng)計(jì)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06