指令碼語言語法規則
阿新 • • 發佈:2019-01-09
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
uuufi
(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)檔案測試運算子