SHELL指令碼 多命令邏輯執行順序

2022-02-20 11:28:47 字數 2780 閱讀 2910

bash&shell系列文章:

linux中可以使用分號「;」、雙and號「&&」和雙豎線「||」來連線多個命令。單"&"符號也算命令連線符號,只不過它是將其前面的命令放入後台執行,所以可以變相地實現命令並行執行。

command1 ; command2

命令之間沒有邏輯關係。分號連線的命令會按照順序從前向後依次執行,但分號兩端的命令之間沒有任何邏輯關係,所有寫出來的命令最終都會被執行,即使分號前面的命令出錯也不影響後面的命令。

[root@xuexi ~]# ls das;echo

"hdakl

"ls: cannot access das: no such file

or directory

hdakl

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

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

"

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.00.0

107892

624 ? s 00:28

0:00

sleep

10

注意ps結果中的"?",它表示非終端程序,即脫離了終端。

執行Shell指令碼(多種方法)

在新程序中執行 shell 指令碼有多種方法。1 將 shell 指令碼作為程式執行 shell 指令碼也是一種解釋執行的程式,可以在終端直接呼叫 需要使用 chmod 命令給 shell 指令碼加上執行許可權 如下所示 mozhiyan localhost cd demo 切換到 test.sh ...

shell指令碼多程序

shell指令碼再執行過程中就乙個程序,從頭到尾 下面配置shell指令碼執行過程中啟動多個程序同時執行 bin bash for i 1 i 10 i do echo i sleep 10 done wait echo e seconds 注 seconds 是執行完指令碼所用的時間 wait 是...

shell指令碼 eval執行shell命令

和其他語言的eval功能差不多,都是將乙個儲存執行語句的變數作為引數,eval會讓變數所儲存的語句執行。下面是乙個執行表單提交的命令 注意,這裡只是示例,應用中不要這麼使用,很危險 bin bash index.cgi echo content type text html charset utf ...