編寫可靠Linux shell指令碼的建議

2021-09-29 14:25:48 字數 1205 閱讀 4273

編寫可靠linux shell指令碼的八個建議

shell 指令碼的第一行,#!之後應該是什麼?

如果拿這個問題去問別人,不同的人的回答可能各不相同。我見過/usr/bin/env bash,也見過/bin/bash,還有/usr/bin/bash,還有/bin/sh,還有/usr/bin/env sh。這算是程式設計界的「』茴』字四種寫法」了。

在多數情況下,以上五種寫法都是等價的。但是,寫過程式的人都知道:「少數情況」裡往往隱藏著意想不到的坑。

如果系統的預設 shell 不是 bash 怎麼辦?比如某 linux 發行版的某個版本,預設的 sh 就不是 bash。

如果系統的 bash 不是在 /usr/bin/bash 怎麼辦?

我**推薦使用 /usr/bin/env bash 和 /bin/bash。**前者通過env新增乙個中間層,讓env在$path中搜尋bash;後者則是官方背書的,約定俗成的 bash 位置,/usr/bin/bash不過是指向它的乙個符號鏈結。

ok,經過一番討論,現在第一行定下來了。接下來該開始寫第二行了吧?

且慢!在你開始構思並寫下具體的**邏輯之前,先插入一行set -e和一行set -x。

set -x會在執行每一行 shell 指令碼時,把執行的內容輸出來。它可以讓你看到當前執行的情況,裡面涉及的變數也會被替換成實際的值。

set -e會在執行出錯時結束程式,就像其他語言中的「丟擲異常」一樣。(準確說,不是所有出錯的時候都會結束程式,見下面的注)

注:set -e結束程式的條件比較複雜,在man bash裡面,足足用了一段話描述各種情景。大多數執行都會在出錯時退出,除非 shell 命令位於以下情況:

乙個 pipeline 的非結尾部分,比如 error | ok

乙個組合語句的非結尾部分,比如 ok && error || other

一連串語句的非結尾部分,比如 error; ok

位於判斷語句內,包括 test、if、 while 等等。

這兩個組合在一起用,可以在 debug 的時候替你節省許多時間。出於防禦性程式設計的考慮,有必要在寫第一行具體的**之前就插入它們。捫心自問,寫**的時候能夠一次寫對的次數有多少?大多數**,在提交之前,通常都經歷過反覆除錯修改的過程。與其在焦頭爛額之際才引入這兩個配置,不如一開始就給 debug 留下餘地。在**終於可以提交之後,再考慮是否保留它們也不遲。

python 中執行linux shell指令碼

subprocess.popen command,shell true 如果command不是乙個可執行檔案,shell true不可省。最簡單的方法是使用class subprocess.popen command,shell true popen類有popen.stdin,popen.stdou...

linux shell環境以及shell指令碼

1.的區別,中的變數會被解析 中所有的都被當成字串 執行系統命令 2.自定義的變數預設是區域性變數,環境變數是全域性變數。3.export可以把乙個或者多個變數設定為全域性變數 4.父shell中要使用子shell中的變數,必須用export將變數設定為全域性變數 5.常用的環境變數 6.使用者工作...

Linux shell 指令碼 編寫

let 整數運算 let x x 1 或let x 邏輯卷標 表示意思 1 關於檔案與目錄的偵測邏輯卷標!f常用!偵測 檔案 是否存在 eg if f filename d常用!偵測 目錄 是否存在 b偵測是否為乙個 block 檔案 c偵測是否為乙個 character 檔案 s偵測是否為乙個 s...