1. 程式人生 > 其它 >shell基礎語法備忘錄一

shell基礎語法備忘錄一

2021-06-11

關鍵字:


1、在 shell 指令碼原始碼中實現多行註釋

在原始碼中以冒號加兩個左尖括號開頭,後面加一個標籤即可實現多行註釋的功能。 :<<LABEL LABEL

#!/bin/bash

echo "begin to comment"
:<<COMMENT
This content is all comment
Won't be execute by shell
And comment end with next 'COMMENT' label
COMMENT
echo "document end"

2、shell命令中的source關鍵字是什麼?

我們在執行某個shell指令碼時,其本質是指令碼直譯器建立一個新的程序,並將指令碼中的內容在這個新程序中逐行執行的。

souce關鍵字是一個shell內部的命令,它的作用是讀取指定shell程式檔案,且逐行執行。但souce命令與傳統的執行所不同的一點是:souce不會啟動新程序,而是直接在本程序中執行讀取出來的程式。

正是這一點區別,才有了在sh檔案中配置的環境變數在本shell中無效,而必須使用 souce + sh程式 的方式來執行才行的現象。其本質也只不過是直接執行指令碼程式時所設定的環境變數屬於另一個程序,而通過souce執行的才是應用在當前程序而已。

同時這也引申出,假設在某指令碼檔案中呼叫了 exit 0 命令,若直接在bash命令列中執行此指令碼檔案,指令碼檔案將正常退出。而要是以 souce 命令來執行,此會直接結束外部的 bash 會話(直接登出)。

3、在shell中顯式宣告變數

shell是一種弱型別的動態語言,一般來講它無須宣告變數即可直接使用。若未事先宣告而直接使用,則其會在使用的同時自動定義此變數。

但顯式宣告變數可以對變數作某些限制,因此在某些情況下還是有必要的。

shell中顯式宣告變數的語法如下:

declare [attribute] [variable name]

attribute表示引數,可選的引數及釋義如下表所示:

attribute meaning
-p 列印當前系統中所有變數的值。
-i 將variable定義為整數型別。若對整數型別變數賦了非整數值,則其值為0。
-r 將variable定義為只讀型別。
-a 將variable宣告為陣列型別。事實上,shell中預設情況下變數就是陣列型別。
-f 列印所有自定義函式,包括名稱和函式體。
-x 將variable設定成環境變數。

值得一提的是:shell允許在中途使用declare改變某變數的型別。但臨時改變的型別其值仍是改變前的,需要重新賦值才可應用上新型別。

需要注意的是:declare命令僅在 bash 中有。若有些系統使用的是 dash 若其它shell工具,可能會報declare找不到的錯誤。

以下是一個示例:

#!/bin/bash

x=6/3
echo "x=$x"

declare -i x
echo "x2=$x"
x=6/3
echo "x3=$x"

4、shell中變數的作用域

與大多數程式語言一樣,shell程式中的變數的作用域也可分為兩種:

1、全域性變數;

2、區域性變數;

全域性變數直接宣告即可,區域性變數則需在函式中使用 local 關鍵字宣告。另外,shell中函式引數也為區域性變數。

注意:函式中未使用local關鍵字宣告的變數亦為全域性變數。

全域性變數的作用域範圍為從定義處開始直至shell指令碼結束或被顯式地刪除該全域性變數。

區域性變數的作用域則僅限於函式體內部。

區域性變數的優先順序高於全域性變數。若先定義了一個全域性變數,然後在函式內部定義了一個同名的區域性變數,則在函式內呼叫該變數名稱時,引用的是區域性變數的值。

5、shell中的單引號與雙引號

shell的語法可以使用單引號雙引號兩種方式來定義字串內容。

其中,單引號中的所有內容均被解析為普通字元原樣輸出。

而雙引號中的內容中 $ , \ , ' , " 幾個字元將會被解析成特殊功能字元,剩餘的字元才會被原樣輸出。

6、清除變數/刪除變數定義

使用關鍵字 unset 來清除一個變數的定義。如:

unset p1

unset v1

7、定義變數時的注意事項

由於shell中規定所有命令之間都以空格字元隔開,而變數賦值的三個段本質上屬於同一條命令,因此在shell中建立變數併為其賦值時等號兩邊不能加空格。

#!/bin/bash

#正確的建立變數與賦值方式
a=3

#錯誤的建立變數與賦值方式
b = 5

8、shell中的數字常量表示方式

在shell中可以使用兩種方式來表示數字常量:

1、使用0的字首;

2、使用#字首;

如:

二進位制可以表示為 2#1101,只能用#字首表示。

八進位制可以表示為 020 、 072 、 8#20 、 8#72

十進位制無須前後綴直接寫即可。

十六進位制可表示為 0x1f 、 0x66 、 16#1f 、 16#66

9、命令替換

命令替換是指將某個命令的執行結果賦給某個變數。在bash中有兩種命令替換的語法:

1、`shell command`

2、 $(shell command)

10、alias別名

在shell中可以通過alias命令來為某個已有的命令取一個別名。通常的用法是將一個較複雜的命令取一個較簡單的別名從而降低執行難度。其用法如下所示:

#取別名
alias nick_name="original command"

#登出別名
unalias nick_name


#示例
alias ll="ls -al --color=auto"

其實,alias與function是類似的,它們都是將已存在的命令做一個”封裝“。只不過alias只能封裝一條命令,而function可以封裝任意多條命令。