bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
Linux中可以使用分號“;”、雙and號“&&”和雙豎線“||”來連接多個命令。單"&"符號也算命令連接符號,只不過它是將其前面的命令放入后台執行,所以可以變相地實現命令並行執行。
1.分號";"
command1 ; command2
命令之間沒有邏輯關系。分號連接的命令會按照順序從前向后依次執行,但分號兩端的命令之間沒有任何邏輯關系,所有寫出來的命令最終都會被執行,即使分號前面的命令出錯也不影響后面的命令。
[root@xuexi ~]# ls das;echo "hdakl" ls: cannot access das: No such file or directory hdakl
2.&&
command1 && command2
邏輯與。&&連接的命令會按照順序從前向后執行,但只有當command1正確執行才執行command2,如果command1不正確執行,則不執行command2。在bash中,通過預定義變量“$?”來判斷命令是否正確執行,如果"$?"的值為0則表示前一條命令正確執行,其他任意值都表示不正確執行。\
[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
邏輯或。||連接的命令會按照順序從前向后執行,但只有當command1不正確執行才執行command2,command1正確執行則不會執行command2。||和&&都是短路符號,符號左右的命令之間具有邏輯關系。
[root@xuexi ~]# ls das || echo "hdakl" ls: cannot access das: No such file or directory hdakl
[root@xuexi ~]# echo "hdakl" || ls ds hdakl
一般要聯合使用&&和||的時候,基本上都會先邏輯與再邏輯或:command1 && command2 || command3。因為在實際中,command2和command3應該都是想要執行的命令。如果command1正確執行,$?就等於0,執行command2,再看情況執行command3,如果command1錯誤執行,$?就不等於0,所以不執行command2,根據$?為非0值,判斷了 || 右邊的命令應該被執行。
通俗點的理解方法是根據語義判斷。“如果...就...否則...就...”的語句使用“cmd1 && cmd2 || cmd3”,“如果不...就...否則...就...”使用“!cmd1 && cmd2 || cmd3”。
例如,如果用戶user1存在,就顯示用戶已經存在,否則,就添加此用戶。
[root@xuexi tmp]# id user1 && echo "user1 exists" || useradd user1
如果用戶user2不存在,則添加此用戶,否則顯示用戶已存在。
[root@xuexi tmp]# !id user2 && useradd user2 || echo "user2 exists"
如果用戶user3不存在,則添加此用戶,並設定其密碼為用戶名本身,否則顯示用戶已存在。
[root@xuexi tmp]# !id user3 && useradd user3 && echo "user3" | passwd --stdin user3 || echo "user3 exists"
4.&
command1 &
command1 & command2
&表示將其前面的命令放入后台執行,放入后台后會立即返回到bash環境讓用戶可以繼續和bash交互。如果&符號連接了兩個命令,則其前面的命令被放入后台,立即執行后面的命令,所以可以簡單地認為這兩個命令是並行執行的,兩端的命令之間也沒有任何邏輯關系。
需要注意的一點是,在終端的bash環境下,子shell中的后台的進程不受終端控制,在終端被關閉時它會掛靠在init/systemd進程下,因此退出終端或腳本shell環境,無法中斷這些后台進程。例如:
[root@xuexi ~]# (sleep 10 &) # 終端1上執行,立即關閉該終端 [root@xuexi ~]# ps aux | grep slee[p] # 終端2上捕捉sleep進程 root 5732 0.0 0.0 107892 624 ? S 00:28 0:00 sleep 10
注意ps結果中的"?",它表示非終端進程,即脫離了終端。