自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Bash中使用控制運算符連接命令

系統(tǒng) Linux
在命令行中,使用控制運算符為復(fù)合命令添加邏輯。經(jīng)常會使用一些簡單的復(fù)合指令,比如說在一個命令行中連接幾個命令。這些命令使用分號分隔,表示一個命令結(jié)束。

[[252440]]

在命令行中,使用控制運算符為復(fù)合命令添加邏輯。

經(jīng)常會使用一些簡單的復(fù)合指令,比如說在一個命令行中連接幾個命令。這些命令使用分號分隔,表示一個命令結(jié)束。為了在一個命令行中創(chuàng)建一系列簡單的 shell 命令,只需要使用分號把每一條命令分隔開,就像下面這樣:

  1. command1 ; command2 ; command3 ; command4 ;

***一個分號你可以不用添加,因為當(dāng)你按下回車鍵時就表示一個命令的結(jié)束,但是為了和其它的保持一致,還是建議加上比較好。

所有的命令執(zhí)行都沒有什么問題 —— 只要沒有什么意外發(fā)生。但是當(dāng)出問題時到底發(fā)生了什么呢?我們可以預(yù)測,并且通過 Bash 中內(nèi)置的 &&|| 運算符跟蹤這些錯誤。這兩個控制運算符提供了一些流控制,可以讓我們改變代碼執(zhí)行隊列的順序。分號和換行符也被認(rèn)為是 Bash 的控制運算符。

&& 運算符意義簡單來說就是“如果 command1 執(zhí)行成功,就接著執(zhí)行 command2。”如果 command1 因為任何原因執(zhí)行失敗,那么 command2 將不執(zhí)行。這個語法看下來像這樣:

  1. command1 && command2

這樣寫是允許的,因為每一個命令都會返回一個值(RC)給 shell 來表示這個命令在執(zhí)行的過程中是否執(zhí)行成功或者失敗。通常,返回值是 0 表示成功,而一個正數(shù)值表示不同種類的錯誤。有一些系統(tǒng)管理工具僅僅返回一個 1 來表示所有的錯誤,但是也有很多工具使用其它的正數(shù)的返回值來表示各種類型錯誤。

我們可以很容易的使用腳本來檢查 shell 變量 $?,可以通過命令列表中的下一個命令,或者可以直接使用系統(tǒng)管理工具檢查。我們一起來看這些返回值。運行一個簡單的命令然后立即檢查它的返回值,這個返回值始終是屬于***一個運行的命令。

  1. [student@studentvm1 ~]$ ll ; echo "RC = $?"
  2. total 284
  3. -rw-rw-r--  1 student student   130 Sep 15 16:21 ascii-program.sh
  4. drwxrwxr-x  2 student student  4096 Nov 10 11:09 bin
  5. <snip>
  6. drwxr-xr-x. 2 student student  4096 Aug 18 10:21 Videos
  7. RC = 0
  8. [student@studentvm1 ~]$

這個返回值是 0,表示這個命令執(zhí)行成功了。現(xiàn)在嘗試使用同樣的命令在一些我們沒有權(quán)限的目錄上。

  1. [student@studentvm1 ~]$ ll /root ; echo "RC = $?"
  2. ls: cannot open directory '/root': Permission denied
  3. RC = 2
  4. [student@studentvm1 ~]$

這個返回值的含義可以在 ls 命令的 man 頁面 中找到。

現(xiàn)在我們來試試 && 這個控制運算符,因為它也可能會被用在一個命令行程序中。我們將從一個簡單的示例開始:創(chuàng)建一個新目錄,如果創(chuàng)建成功就在這個目錄中創(chuàng)建一個文件。

我們需要一個目錄可以創(chuàng)建其它的目錄。首先,在你的家目錄中創(chuàng)建一個臨時的目錄用來做測試。

  1. [student@studentvm1 ~]$ cd ; mkdir testdir

~/testdir 中新建一個目錄,這也應(yīng)該是一個空目錄,因為是你剛剛創(chuàng)建的,然后創(chuàng)建一個新的空文件在這個新目錄中。下面的命令可以做這些事情。

  1. [student@studentvm1 ~]$ mkdir ~/testdir/testdir2 && touch ~/testdir/testdir2/testfile1
  2. [student@studentvm1 ~]$ ll ~/testdir/testdir2/
  3. total 0
  4. -rw-rw-r-- 1 student student 0 Nov 12 14:13 testfile1
  5. [student@studentvm1 ~]$

我們看到一切都運行得很好,因為 testdir 目錄是訪問且可寫的。然后我們改變 testdir 目錄的權(quán)限,讓用戶 student 不再具有訪問的權(quán)限。操作如下:

  1. [student@studentvm1 ~]$ chmod 076 testdir ; ll | grep testdir
  2. d---rwxrw-. 3 student student  4096 Nov 12 14:13 testdir
  3. [student@studentvm1 ~]$

在長列表(ll)命令后面使用 grep 命令來列出 testdir 目錄。你可以看到用戶 student 不再有 testdir 目錄的訪問權(quán)限?,F(xiàn)在我們像之前一樣運行同樣的命令,但是在 testdir 目錄中創(chuàng)建的是一個不同的目錄。

  1. [student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1
  2. mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
  3. [student@studentvm1 ~]$

盡管我們也同樣得到了一個錯誤的消息,但 && 控制運算符阻止了 touch 命令的運行,因為在創(chuàng)建 testdir3 目錄的時候發(fā)生了錯誤。通過這種復(fù)合的流控制可以阻止一些錯誤的發(fā)生使事情變亂。但是這樣看起來變得稍微復(fù)雜了一些。

|| 控制運算符允許添加另一個命令,這個命令在初始程序語句返回值大于 0 時執(zhí)行。

  1. [student@studentvm1 ~]$ mkdir ~/testdir/testdir3 && touch ~/testdir/testdir3/testfile1 || echo "An error occurred while creating the directory."
  2. mkdir: cannot create directory ‘/home/student/testdir/testdir3’: Permission denied
  3. An error occurred while creating the directory.
  4. [student@studentvm1 ~]$

當(dāng)我們使用 &&|| 控制運算符時,使用流控制的復(fù)合命令的語法格式通常是下面這樣的形式。

  1. preceding commands ; command1 && command2 || command3 ; following commands

使用控制運算符的復(fù)合命令可以在其它命令之前或者之后,這些和控制運算符流控制有關(guān)系,但是不受控制運算符流控制的影響。如果不考慮復(fù)合命令的流控制中發(fā)生的任何事情那么所有的命令都將執(zhí)行。

當(dāng)程序出問題時,這些流控制運算符使得在命令中處理出錯和通知我們變得更有效率。我直接在命令行中使用它們,也在腳本中使用。

你可以以 root 用戶的身份來刪除這個目錄和它里面的內(nèi)容。

  1. [root@studentvm1 ~]# rm -rf /home/student/testdir

你是怎樣使用 Bash 控制運算符的呢?在評論區(qū)中告訴我們。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2025-02-24 11:16:20

2009-08-11 15:51:08

C#運算符算術(shù)運算符

2020-06-18 10:26:43

JavaScript開發(fā)技術(shù)

2009-08-12 15:02:49

C#賦值運算符簡單賦值運算符

2009-08-12 15:20:18

C#賦值運算符復(fù)合賦值運算符

2023-04-10 08:58:13

C#關(guān)系運算符

2009-11-18 09:37:31

PHP邏輯運算符

2009-11-18 09:02:55

PHP運算符

2020-06-04 08:17:44

JavaScript延展操作運算符開發(fā)

2023-10-04 00:01:00

sizeofC 語言

2021-07-12 15:35:56

JavaScript代碼運算符

2009-08-12 09:30:10

C#??運算符

2016-10-14 14:04:34

JAVA語法main

2024-02-26 15:17:20

2021-12-15 10:25:57

C++運算符重載

2009-06-21 13:48:05

ShellLinux運算符

2022-12-07 07:43:21

2022-11-23 08:14:42

bash 腳本test 命令

2009-08-12 10:47:03

C#運算符重載

2010-01-19 15:30:44

VB.NET比較運算符
點贊
收藏

51CTO技術(shù)棧公眾號