如果把shell命令比成蓋房子的磚瓦,那shell指令碼就是用一塊塊磚瓦建起來的房子。
指令碼的第一行必須寫成類似下面這樣的形式:
#!/bin/bash #指定直譯器,其他還有dash,Python 等
變數
1.變數定義,賦值,引用
變數由字母和數字組成,值由雙引號包含,賦值號的兩邊不能有空格,例:
A=“I like apple”
echo $A #和makefile一樣,用$引用,且不能加括號
2.變數種類
-
自定義變數,如上的A
-
系統預定義變數,如PATH
單獨記錄下PATH:
PATH
是一個環境變數,它指定了系統查詢可執行檔案的目錄列表。當你在終端中輸入命令時,系統會在PATH
變數中定義的目錄中搜尋該命令對應的可執行檔案,環境變數PATH
中的不同路徑是用冒號 (:
) 分隔。# 將 /opt/myapp/bin 目錄新增到 PATH 開頭 export PATH=/opt/myapp/bin:$PATH # 或者,將 /opt/myapp/bin 目錄新增到 PATH 末尾 export PATH=$PATH:/opt/myapp/bin # 僅在 /usr/local/bin 和 /usr/bin 中查詢命令 PATH=/usr/local/bin:/usr/bin # 在指令碼中設定 PATH 為你所需要的值 #!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/custom/path
-
命令列的變數,$#,$*等。
在 Shell 指令碼中,有一些特殊變數用於處理指令碼的引數和其他相關資訊。以下是一些常見的特殊變數及其含義(所用不多,暫不舉例):
-
$#
:傳遞給指令碼或函式的引數個數。 -
$*
:以一個單詞顯示所有引數(引數被視為一個整體)。 -
$@
:以各自獨立的形式顯示所有引數(每個引數仍然是獨立的)。 -
$0
:指令碼或命令本身的名稱。 -
$1
、$2
、...、$N
:傳遞給指令碼或函式的各個引數(第一個引數是$1
,第二個引數是$2
,依此類推)。 -
$?
:上一個命令的退出狀態(返回值)。 -
$$
:當前 Shell 程序的程序 ID (PID)。 -
$!
:後臺執行的最後一個程序的程序 ID (PID)。 -
$_
:上一個命令的最後一個引數。在互動式 Shell 中,還可以是上一條命令的結果。
特殊符號
雙引號,單引號,反引號
-
雙引號 (
"
)在雙引號內,除了
$
、``` 和\
以外,其他字元都保持字面值。這意味著變數替換和命令替換仍然有效。name="World" echo "Hello, $name!" # 輸出: Hello, World!
-
單引號 (
'
)單引號內的所有字元都保持字面值,不進行任何特殊處理(例如變數替換或命令替換)。
name="World" echo 'Hello, $name!' # 輸出: Hello, $name!
-
**反引號 (`` `)
反引號的作用就是在雙引號中標識出命令,即將命令的輸出賦值給變數或插入到字串中。使用
$(...)
是更推薦的寫法。echo "Current date and time: `date`" # 示例:date作為一個命令,輸出當前日期,並輸出 echo "Current date and time: $(date)" # 使用 $()能達到同樣的效果
管道 |(豎槓)
管道符號用於將一個命令的輸出作為另一個命令的輸入。
ls -al | grep "myfile"
# 列出當前目錄下全部資訊,並篩選出包含 "myfile" 的行
重定向>(大於號)和<(小於號)
-
輸出重定向 (
>
和>>
)>
將標準輸出重定向到檔案,會覆蓋檔案內容。>>
將標準輸出追加到檔案末尾。echo "Hello, World!" > output.txt # 將 "Hello, World!" 寫入 output.txt,覆蓋原內容 echo "Hello again!" >> output.txt # 將 "Hello again!" 追加到 output.txt 末尾
-
輸入重定向 (
<
)<
從檔案讀取標準輸入。echo 0<a.txt # 讀取 a.txt 並列印
-
錯誤重定向 (
2>
和2>>
)2>
將標準錯誤重定向到檔案,會覆蓋檔案內容。2>>
將標準錯誤追加到檔案末尾。ls non_existent_file 2> error.log # 將錯誤資訊寫入 error.log,覆蓋原內容 ls another_non_existent_file 2>> error.log # 將錯誤資訊追加到 error.log 末尾