脚本语言语法规则
以下內容源于朱友鵬《物聯網大講堂》課程的學習,以及網站資源http://c.biancheng.net/cpp/view/6994.html的學習(強烈推薦),如有侵權,請告知刪除。
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/sha=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 ] thenecho "a is equal to b" fiif [ $a != $b ] thenecho "a is not equal to b" fi(2)關系運算符
(3)布爾運算符
(4)字符串運算符
(5)文件測試運算符
13、文件包含
總結
- 上一篇: 毕业设计-基于Springboot实现仓
- 下一篇: s5pv210的中断源