shell介紹和命令實例

shell
shell是操作系統的終端命令行,
可以理解爲軟件系統提供給用戶操作的命令行界面,可以說它是人機交互的一種方式。
我們可以使用shell和操作系統、uboot等軟件系統進行交互,具體來說就是我們通過shell給軟件系統輸入命令然後回車執行。
shell是一類編程語言,編寫shell腳本時使用的語言就是shell語言,又叫腳本語言。shell腳本其實是一類語言而不是一個語言,常用shell語言:sh、bash、csh、ksh、perl、python等。在linux下常用的腳本語言其實就是bash、sh;而perl、python這樣的高級shell腳本語言,常用在網絡管理配置等領域,系統運維人員一般要學習這些。腳本語言一般在嵌入式中應用,主要是用來做配置,(一個複雜的嵌入式程序都是可配置的,配置過程就是用腳本語言來實現的)自然不會使用過於複雜的腳本語言特性。linux下最常用的腳本就是bash。

shell腳本的運行機制:解釋運行
(1)C語言(C++)這種編寫過程是:編寫出源代碼(源代碼是不能直接運行的)然後編譯鏈接形成可執行二進制程序,然後才能運行;而腳本程序不同,腳本程序編寫好後源代碼即可直接運行(沒有編譯鏈接過程
(2)shell程序是解釋運行的,所謂解釋運行就是說當我們執行一個shell程序時,shell解析器會逐行的解釋shell程序代碼,然後一行一行的去運行。(順序結構)
(3)CPU實際只認識二進制代碼,根本不認識源代碼。腳本程序源代碼其實也不是二進制代碼,CPU也不認識,也不能直接執行。只不過腳本程序的編譯鏈接過程不是以腳本程序源代碼爲單位進行的,而是在腳本運行過程中逐行的解釋執行時纔去完成腳本程序源代碼轉成二進制的過程(不一定是編譯鏈接,因爲這行腳本程序可能早就編譯連接好了,這裏我們只是調用它)。

shell中的變量定義和引用
(1)變量定義和初始化。shell是弱類型語言(語言中的變量如果有明確的類型則屬於強類型語言;變量沒有明確類型就是弱類型語言),和C語言不同。在shell編程中定義變量不需要制定類型,也沒有類型這個概念。
(2)變量定義時可以初始化,使用=進行初始化賦值。在shell中賦值的=兩邊是不能有空格的。
注意:shell對語法非常在意,非常嚴格。很多地方空格都是必須沒有或者必須有,而且不能隨意有沒有空格。
(3)變量賦值,變量定義後可以再次賦值,新的賦值會覆蓋老的賦值。shell中並不刻意區分變量的定義和賦值,反正每個變量就是一個符號,這個符號的值就是最後一個給他賦值時的值。
(4)變量引用。shell中引用一個變量必須使用$符號,$符號就是變量解引用符號。
注意:$符號後面跟一個字符串,這個字符串就會被當作變量去解析。如果這個字符串本身沒有定義,執行時並不會報錯,而是把這個變量解析爲空。也就是說在shell中沒有被定義的變量其實就相當於是一個定義並賦值爲空的變量。

說明:
(1)shell程序的第一行一般都是: #!/bin/sh 這行話以#!開始,後面加上一個pathname,這行話的意思就是指定shell程序執行時被哪個解釋器解釋執行。所以我們這裏寫上/bin/sh意思就是這個shell將來被當前機器中/bin目錄下的sh可執行程序執行。
可以將第一行寫爲:#!/bin/bash來指定使用bash執行該腳本。
注意:在ubuntu上面默認使用的解釋器sh其實不是bash,而是dash。dash是ubuntu中默認使用的腳本解釋器。
(2)腳本中的註釋使用#,#開頭的行是註釋行。如果有多行需要註釋,每行前面都要加#。(#就相當於是C語言中的//)
(3)shell程序的正文,由很多行shell語句構成。
(4)shell就是把以前命令行中鍵入執行的命令寫成了程序。shell其實就是爲了避免反覆的在命令行下手工輸入而發明的一種把手工輸入步驟記錄下來,然後通過執行shell腳本程序就能再次複述原來記錄的手工輸入過程的一種技術。


實例1、echo命令輸出
#!/bin/sh                                   //規定的解釋器目錄格式
# test1註釋
echo "hello world."                  //用echo命令輸出hello world
# test2註釋
string="hello world"
string="new string"
echo $string                             //只輸出最新的string內容,即"new string"     
#test3註釋
var="\$abbb\$"                       //雙引號,輸出反義字符,$abc$
var='\$abbb\$'                        //單引號,原樣輸出,即\$abbb\$
echo $var
#test4註釋
var=hello
echo "$var you"                      //輸出hello you
echo "$varyou"                       //沒輸出東西,$後接變量,這裏被認爲是varyou變量,沒定義則爲空
echo "${var} you"                   //大括號,可輸出hello you
test5註釋
MYPATH="`pwd`/include"   //反引號,輸出當前路徑/include
echo "MYPATH=$MYPATH"

實例2、創建文件和文件夾
#!/bin/sh       
#test1註釋
touch pp.txt                             //創建一個.txt文件
#test2註釋
mkdir pp                                 //創建一個目錄,裏面包含一個文件
cd pp
touch pp.c
cd ..

實例3、用echo命令和>符號創建文件,和用>>符號追加文件內容
#!/bin/sh
#test1註釋
echo "test" > a.txt                  //創建a.txt文件,並在裏面寫入“test”內容
#test2註釋
echo "include
int main ()
{
return 0;
}
" > a.c                                      //創建a.c文件,並在裏面寫入一段程序代碼
#test3註釋
echo "zengjianpai" >> a.c     //在上面程序代碼中追加寫入內容

實例4、if語句
#!/bin/sh
#test1註釋
if [ -f a.c ];then                       //檢查是否存在文件
echo "yes"
else 
echo "no"
touch a.c
fi                                              //語句結束標誌
#test2註釋
if [ 122 -gt 12 ];then               //比較大小:le小於或等於,lt小於;ge大於或等於,gt大於
echo "equal"
else
echo "not equal"
fi
#test3註釋
if [ "abc" = "abc" ];then         // 比較字符串是否相等
echo "equal"
else
echo "not equal"
fi
#test4註釋
str="pp"                 
if [ -z $str ];then                     //檢查str是否爲空,-z表示zero
echo "yes"
else 
echo "no"
fi
test5註釋
if [ 122 -eq 12 -o "abc" = "abcd" ];then      //-eq表示相等;-o表示或,連接兩個條件
echo "yes"
else 
echo "no"
fi

實例5、與&&、或||語句
str=""
[ -z $str ] || echo "fei kong"          //邏輯或,如果條件成立,則不執行echo指令
[ -z $str ] && echo "kong"           //邏輯與,如果條件成立,則執行echo指令

實例6、循環for、while語句
#!/bin/sh
test1註釋
for i in 1 2 3 4 5
for i in `ls`                         //反引號,可執行裏面的命令
do
echo $i                             //顯示1、2、3、4、5
done                                //循環語句結束符
test2註釋
i=1
j=10
while [ $i -lt $j ]              //判斷i是否小於j
do
echo $i                            //成立的話則輸出
i=$(($i+1))                     //格式規定這樣,相當於C語言的i++
done

實例7、case語句
#!/bin/sh
var=2
case $var in
1) echo "1" ;;                   //case語句,shell中默認有break功能,和while結合使用時表示退出while循環
2) echo "2" ;;
esac                                //case語句結束符

實例8、$#是傳參個數,$0,$1等是參數
#!/bin/sh
#test1註釋
echo $# $0 $1 $2 $3       //退出編輯後,在命令行輸入./pp.sh aa bb cc,顯示"3 ./case.sh aa bb cc"
                                        //$0存的是程序的文件執行名,$#是真實參數的個數

此項拓展:
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個有效參數的值
結論:$#計數時只考慮真正的參數個數

#test2註釋
echo $# $1
shift;
echo $# $1
執行命令./case.sh aa bb cc 後,輸出:
3 aa
2 bb
說明:shell中的$# $1等內置變量的值不是不可變的,而是可以被改變,被shift指令改變。shift指令有點像左移運算符,把我們給shell程序的傳參左移了一個移出去了,原來的$2變成了新的$1,原來的$#少了1個。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章