1. 程式人生 > >指令碼語言語法規則

指令碼語言語法規則

1、shell程式的第一行一般都是: #!/bin/sh

  • 以#!開始,後面加上一個pathname。
  • 指定shell程式執行時被哪個直譯器解釋執行。
  • 這裡的/bin/sh意思就是這個shell將來被當前機器中/bin目錄下的sh可執行程式執行。
  • 可以將第一行寫為:#!/bin/bash來指定使用bash執行該指令碼。
  • 在ubuntu中預設使用的直譯器sh其實不是bash,而是dash。dash是ubuntu中預設使用的指令碼直譯器。
  • 指令碼中的註釋使用#,#開頭的行是註釋行。如果有多行需要註釋,每行前面都要加#。(#就相當於是C語言中的//)

2、shell的本質

(1)shell就是把以前命令列中鍵入執行的命令寫成了程式。(批處理)

  • 為了避免反覆在命令列下手工輸入,把手工輸入步驟記錄在文字中,然後通過執行該指令碼,就能復現原來的手工輸入的效果。

(2)shell不需要編譯,編輯完可以直接執行。

3、shell中的變數定義和引用

  • 和C語言不同,shell是弱型別語言(語言中的變數如果有明確的型別則屬於強型別語言;變數沒有明確型別就是弱型別語言)。
  • 在shell程式設計中,沒有型別這個概念。

(1)變數定義時可以初始化,使用=進行初始化賦值

  • =兩邊不能有空格
  • shell對語法非常在意,非常嚴格。很多地方空格都是必須沒有或者必須有,而且不能隨意有沒有空格。
  • 變數名的命名須遵循如下規則:首個字元必須為字母(a-z,A-Z);中間不能有空格,可以使用下劃線(_);不能使用標點符號;不能使用bash裡的關鍵字。

(2)變數賦值。

  • 新的賦值會覆蓋老的賦值。

(3)變數引用。

  • shell中引用一個變數必須使用$符號,$符號就是變數解引用符號。即,$符號後面跟一個字串,這個字串就會被當作變數去解析。
  • 如果這個字串本身沒有定義,執行時把此變數解析為空。即在shell中沒有被定義的變數,相當於一個定義並賦值為空的變數。
  • 變數引用的時候可以$var,也可以${var}。某些情況下只能用${var}而不能簡單的$var。

(4)只讀變數、刪除變數


(5)變數型別


4、字串(單引號、雙引號、無引號)

(1)shell中使用字串可以直接使用。

(2)shell中可以使用單引號來表示字串;

(3)shell中可以使用雙引號

來表示字串;

  • 字串內部有空格時也可以;

  • $加變數名可以取變數的值;
  • 反引號仍表示命令替換;
  • \$表示$的字面值輸出$符號;
  • \`表示`的字面值(反引號);
  • \"表示"的字面值;\\表示\的字面值;
  • 除上情況之外,在其它字元前面的\無特殊含義,只表示字面值。

5、shell中呼叫linux命令

(1)直接執行;

(2)反引號括起來執行。

  • 為了得到命令的返回值(結果值),用一對反引號(和~在一個按鍵上)來呼叫執行命令。

6、shell中的if結構

(1)典型if語言格式

if [表示式]; then

   xxx

   yyy

else

  ddd

   uuu

fi

(2)if的典型應用

  • 判斷檔案是否存在。(-f ),注意[]裡面前後都有空格,不能省略。
  • 判斷目錄是否存在。(-d)
  • 判斷字串是否相等("str1" = "str2"),注意用一個等號而不是兩個。
  • 判斷數字是否相等(-eq)、大於(-gt)、小於(-lt)、大於等於(-ge)、小於等於(-le)
  • 判斷字串是否為空(-z),注意-z判斷時如果變數本身沒定義也是不成立(也就是說-z認為沒定義不等於為空)

(3)if判斷式中使用“-o”表示邏輯或

  • 相當於在if後面的條件式中用邏輯與、邏輯或來連線2個式子,最終的if中是否成立取決於2個式子的邏輯運算結果。

(4)邏輯與&&和邏輯或||與簡寫的if表示式相結合


(5)test命令用於檢查某個條件是否成立,類似於if中的方括號。細節如下



7、shell中的迴圈結構

(1)for迴圈

  • 能看懂、能改即可。不要求能夠完全不參考寫出來。
  • 嵌入式並不需要完全重新手寫shell,系統管理員(伺服器運維人員,應用層系統級管理開發的才需要完全掌握shell)



(2)while迴圈

  • 和C語言的迴圈在邏輯上無差別
  • 注意格式要求,譬如:while後面的[]兩邊都有空格,[]後面有分號分號(如果do放在一行的話),i++的寫法中有兩層括號。


8、echo的建立和追加輸入檔案

(1)使用echo指令新建一個檔案,並且將一些內容傳入這個檔案中。建立檔案並輸入內容的關鍵就是>。

(2)使用echo指令配合追加符號>> 向一個已經存在的檔案末尾追加輸入內容。(3)echo會自動換行;

上面為了輸出雙引號,使用了\“轉義字元。


9、case語句

(1)shell中的case語句和C語言中的switch case語句作用一樣,格式有差異;

(2)shell中的case語句沒有break。

  • shell中的case預設就是匹配上哪個執行哪個,不會執行完其中一個後繼續執行後面的其他case。


10、shell程式的傳參

(1)shell程式本身也可以在呼叫時傳參。

(2)使用一些特定符號來表示:

  • $#表示呼叫該shell時傳參的個數。($#計數時只考慮真正的引數個數);
  • $0、$1、$2……則依次表示傳參的各個引數。
  • C語言:./a.out    aa    bb    cc    ,則argc = 4, argv[0] = ./a.out, argv[1]是第一個有效引數……
  • shell:source a.sh   aa   bb   cc  ,則$# = 3,$0是執行這個shell程式的解析程式的名字,$1是第一個有效引數的值,$2是第2個有效引數的值……


11、while迴圈和case語言和傳參結合

(1)shell中的break關鍵字和C語言中意義相同(都是跳出)但是用法不同。

  • shell中case語句預設不用break,因此在shell中break只用於迴圈跳出。
  • 當while中內嵌case語句時,case中的break是跳出外層的while迴圈的,不是用來跳出case語句的。


(2)shell中的$#,$1等內建變數的值是可以被改變,被shift指令改變。

  • shift指令有點像左移運算子,把shell程式的傳參左移一個,原來的$2變成新的$1,原來的$#少了1個。

12、運算子

(1)算術運算子
#!/bin/sh

a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a is equal to b"
fi

if [ $a != $b ]
then
   echo "a is not equal to b"
fi

(2)關係運算符


(3)布林運算子


(4)字串運算子


(5)檔案測試運算子


13、檔案包含