Shell 程式設計:Bash空格的那點事
先了解下bash中什麼時候該用空格,什麼時候不該用。
1. 等號賦值兩邊不能有空格
2. 指令與選項之間需要空格
3. 管道兩邊空格可有可無
我們來看看常見的問題
1. 賦值時等號兩邊或只有左邊多了空格
test@pythontab.com ~ $ var1 = test
bash: var1: command not found
test@pythontab.com ~ $ echo ${var1:?error}
bash: var1: testerror
: test @pythontab.com ~ $ echo ${var1?error}
bash: var1: error
test@pythontab.com ~ $ var2 =test
bash: var2: command not found
test@pythontab.com ~ $ echo ${var2 :?error}
bash: var2: error
test@pythontab.com ~ $ echo ${var2?error}
bash: var2: error
這裡我用了bash的變數擴展,${var1:?error}當var1為unset或null(未定義或空)時, 報指定錯誤; ${var1?error}當var1為unset時,報指定錯誤。從執行結果來看,如果等號左邊有空格,則變數名當成指令執行,結果報command not found,變數沒有被賦值
2. 賦值時等號左邊沒有空格,右邊有空格(這種情況有點特別,你會發現兩種情況)
test@pythontab.com ~ $ var= test
test@pythontab.com ~ $ var= nocmd
bash: nocmd: command not found
同樣是等號右邊有空格,第一條命令沒報錯,而第二條報錯了。
這是因為shell中有這麼一種執行命令的方式: var=string command
命令command將得到變數var的值(至於在命令執行後,變數var的值是否保留下來,bash4中沒有保留,但我在dash中發現時保留下來的,不同的shell對這個的處理不同), 由於test是個命令,而nocmd不是,所以報了command not found.
test@pythontab.com ~ $ var=newtest eval echo $var
newtest
test@pythontab.com ~ $ echo $var
注意: 這裡我使用了eval, 是想避免在第一次解析時$var被替換成空字符串, 不然就會出現下面的情況(下面是錯誤的測試方法,在echo還沒執行時,$var已經被替換成空字串)
程式碼如下:
test@pythontab.com ~ $ var=newtest echo $var
test@pythontab.com ~ $ echo $var
到這裡,相信大家都明白了吧, 對於等號賦值,左右兩邊不可以有空格,雖然右邊有空格不一定報錯,但那絕對不是你想要的結果。
3. 指令和選項之間必須有空格
這個似乎大家都明白,為何我還這麼囉嗦呢?說到這裡,我不得不提一下一個非常特別的指令: [ 指令(你沒看錯,是[ ), 也就是test指令(當然bash中,這是個內建指令,但在這裡不影響
我們的理解)。或許你會覺得[命令眼熟,沒錯,我保證你見過它,來看看下面的例子
test@pythontab.com ~ $ if [ "abc" = "abc" ]; then echo 'they are the same '; fi
they are the same
test@pythontab.com ~ $ type -a [
[ is a shell builtin
[ is /usr/bin/[
想起來了吧? [指令常用到if判斷中,當然也有人喜歡這麼寫
test@pythontab.com ~ $ [ "abc" = "cba" ] || echo 'they are not the same'
they are not the same
test @pythontab.com ~ $ type -a [
[ is a shell builtin
[ is /usr/bin/[
[ 命令正名叫test命令,它們兩者幾乎一樣,為什麼不是完全一樣?來看看這個
test@pythontab.com ~ $ [ "abc" = "cba"
bash: [: missing `]'
test@pythontab.com ~ $ [ "abc" = "cba" ]
test@pythontab .com ~ $ test "abc" = "cba" ]
bash: test: too many arguments
test@pythontab.com ~ $ test "abc" = "cba"
清晰了吧,用[命令時,你必須給它一個尾巴], 用test指令時,就不能加個尾巴。尾巴]是[最後一個參數,不可缺少的參數, 代表[命令的結束
扯了這麼多,那到底這個和空格有毛關係?說這些,是先讓大家明白: [在shell中是個指令,它左右必須有空格! ]是[的最後不可缺少的參數,它兩邊也需要空格(雖然有些指令的參數能連一起,例如ps, 但[指令不行,它的參數之間必須有空格)。讓我們來看看關於[常見的錯誤
a. if 與[ 之間缺少空格
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi"];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: syntax. then'
test@pythontab.com ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
test@pythontab.com ~ $ if["$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
語法分析錯誤,很明顯,if[ 對於bash來說,不知道是什麼鬼東西
b. [與後面的參數之間缺少空格
test@pythontab.com ~ $ if ["$HOME" = "/ home/igi" ];then echo 'equal'; fi
bash: [/home/igi: No such file or directory
test@pythontab.com ~ $ if ["$HOME" = "/home/igi"]; then echo 'equal'; fi
bash: [/home/igi: No such file or directory
["$HOME" 對bash來說,也不知道是什麼鬼東西
c. [ ] 之間的參數之間缺少空格
test@pythontab.com ~ $ if [ "abc"="abc" ]; then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "abc"="cba" ] ; then echo 'equal'; fi
equal
第一條命令似乎是對的(實際上是正巧而已),看看第二條命令"abc" 和"cba"明顯不同,但卻判斷為相同。這是因為參數之間缺少了空格,被[指令認為內部是個值而已。看看下面的指令,你就會釋然
test@pythontab.com ~ $ if [ 0 ]; then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "1" ]; then echo ' equal'; fi
equal
test@pythontab.com ~ $ if [ "" ]; then echo 'equal'; fi
test@pythontab.com ~ $ if [ ]; then echo 'equal'; fi
在[ ] 內部,如果只有一個值(那些因為缺少了空格而連一起的也算),不是空字串就為真。所以在[ ] 之間的參數,也要兩邊有空格,而不能堆一起
d. 參數和尾巴]之間缺少空格
這個就不羅嗦了,尾巴]也是[命令的參數,如同上面所講,參數之間必須有空格
扯了這麼多[命令與空格的事,但有些時候,缺了空格卻能正確運行, 當然這只是你好運, 一起來看看
test@pythontab. com ~ $ var=' abc'
test@pythontab.com ~ $ if [$var = "abc" ];then echo 'equal'; fi
equal
test@pythontab.com ~ $ if ["$var" = "abc" ];then echo 'equal'; fi
bash: [ abc: command not found
雙引號包圍起來的是一個整體,而沒雙引號的時候,字串前後的空格或製表符都被切開。如果恰巧你遇到了或你故意要丟棄字串前後的空格或製表符,那也不是不可能, 但非常不建議你這麼寫,你的程式碼將是非常脆弱的。
或是你該加的空格都加了,但還是報錯,這也可能和缺少雙引號有關。這樣的情況很普遍,最後再看
test@pythontab.com ~ $ var=''
test@pythontab.com ~ $ if [ "$var" = "abc" ];then echo 'equal'; fi
test@pythontab.com ~ $ if [ $var = "abc" ];then echo 'equal'; fi
bash: [: =: unary operator expected
test@pythontab.com ~ $ dvar='a b c'
test
test@pythontab.com ~ $ dvar='a b c'
test
test@pythontab.com ~ $ dvar='a b c'
test
test@pythontab.com ~ $ dvar='a b c'
test
test@pythontab.com ~ $ dvar='a b c'

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

<p>自訂您的作業系統是讓您的日常生活更加愉快的絕佳方式。您可以變更使用者介面、套用自訂主題、新增小工具等等。因此,我們今天將向您展示如何在Windows11上安裝ClassicShell。 </p><p>程式已經存在了很長時間,並允許您修改作業系統。志工現在已經開始運作該組織,該組織於2017年解散。新專案名為OpenShell,目前在Github上可供有興趣的人使用。 </p>&a

您在執行腳本時是否看到此錯誤訊息「Add-AppxPackage:部署失敗,HRESULT:0x80073D02,無法安裝該包,因為它修改的資源目前正在使用中。PowerShell中出現錯誤0x80073D02…」?如錯誤訊息所述,當使用者在前一個進程執行時嘗試重新註冊一個或所有WindowsShellExperienceHost應用程式時,確實會發生這種情況。我們已經獲得了一些簡單的解決方案來快速解決這個問題。修復1–終止體驗主機程序您必須在執行powershell指令之前結束

無法在Windows 11上運行的 Open shell 並不是一個新問題,而且自從這個新作業系統問世以來一直困擾著使用者。 Open-Shell Windows 11 不工作問題的原因並不具體。它可能是由程式中的意外錯誤、病毒或惡意軟體的存在或損壞的系統檔案引起的。對於不知道的人,Open-Shell 是 2017 年停產的 Classic Shell 的替代品。您可以查看我們的教學課程,以了解如何在 Windows 11 上安裝 Classic Shell。如何替換 Windows 11 的開始菜
![探險家.exe 在系統啟動時不啟動 [修復]](https://img.php.cn/upload/article/000/887/227/168575230155539.png?x-oss-process=image/resize,m_fill,h_207,w_330)
如今,許多Windows用戶開始遇到嚴重的Windows系統問題。問題是系統載入後Explorer.exe無法啟動,使用者無法開啟檔案或資料夾。雖然,Windows使用者在某些情況下可以使用命令提示字元手動開啟Windows資源管理器,並且每次系統重新啟動或系統啟動後都必須這樣做。這可能是有問題的,並且是由於下面提到的以下因素造成的。損壞的系統檔案。啟用快速啟動設定。過時或有問題的顯示驅動程式。對系統中的某些服務進行了更改。修改後的註冊表文件。請記住以上所有因素,我們提出了一些肯定會對用戶有所幫助

Linux系統下在處理檔案時,有時候需要刪除檔案末端的行。這種操作在實際應用中很常見,可以透過一些簡單的命令來實現。本文將介紹在Linux系統中快速刪除檔案結尾行的操作步驟,同時提供具體的程式碼範例。步驟一:檢視文件末尾行在進行刪除操作之前,首先需要確認文件的末尾行是哪一行。可以使用tail指令來查看文件的結尾行,具體指令如下:tail-n1filena

適用於 Linux 的 Windows 子系統第一種選擇是使用適用於 Linux 或 WSL 的 Windows 子系統,這是一個相容層,用於在 Windows 系統上本機執行 Linux 二進位執行檔。它適用於大多數場景,允許您在 Windows 11/10 中執行 shell 腳本。 WSL 不會自動可用,因此您必須透過 Windows 裝置的開發人員設定來啟用它。您可以透過前往設定 > 更新和安全性 > 對於開發人員來完成。切換到開發人員模式並透過選擇是確認提示。接下來,找 W

Python 腳本部分範例:企業微信警告、FTP 用戶端、SSH 用戶端、Saltstack 用戶端、vCenter 用戶端、取得網域名稱ssl 憑證過期時間、傳送今天的天氣預報以及未來的天氣趨勢圖;Shell 腳本部分實例:SVN完整備份、Zabbix 監控使用者密碼過期、建置本地YUM 以及上篇文章中有讀者的需求(負載高時,查出佔用比較高的進程腳本並儲存或推播通知);篇幅有些長,也請大家耐心翻到文末,畢竟有彩蛋。 Python 腳本部分企業微信警告此腳本透過企業微信應用,進行微信告警,可用於

OpenShell是一個免費的軟體實用程序,可用於自訂Windows11開始選單,使其類似於經典風格的選單或Windows7樣式的選單。先前版本的Windows上的開始功能表為使用者提供了一種瀏覽其係統內容的簡單方法。基本上,OpenShell是ClassicShell的替代品,它提供了不同的使用者介面元素,有助於從先前的Windows版本取得後一個版本的功能。一旦ClassicShell的開發在2017年停止,它就由GitHub志工以OpenShell的名義維護和開發。它與Win
