一,前言
摘抄自《Shell腳本學習指南中文PDF版》
Shell腳本最常用於系統管理工作,或者用於結合現有的程序以完成小型的、特定的工作。一旦你找出完成工作的方法,可以把用到的命令串在一起,放在一個獨立的程序或script中。腳本編程語言與編譯型語言區別在於腳本編程語言通常是解釋型的,這類程序的執行,是有解釋器讀入程序代碼,而編譯型語言則是編譯執行,將源代碼轉換成目標代碼,便可以直接執行,使用腳本語言的好處是,它們多半運行在比編譯型語言還高的層級,能夠輕易處理文件與目錄之類的對象,缺點是執行效率通常不如編譯型語言。
二,初識Shell編程
Shell的基本概念
2.1 shell命令
一個簡單的Shell命令,如“mkdir dir1 dir2 dir3 dir4” 由命令本身、參數和空格構成
複雜的Shell命令是由簡單的命令以多種方式組織在一起的,例如,管道把一個命令的輸出傳遞給另外一個命令作爲輸入、循環或條件結構,如:
cat book_to_read | grep "english" > mybook
該命令通過管道把cat命令的輸出送給grep作爲輸入。grep命令在輸入字符串中查找子字符串english,通過重定向把所有包含字符串english的行寫入到mybook文件中
下面附上一個簡單的Shell腳本,建立hello文件,文件內容如下:
#!/bin/bash
#the simple case -hello world
echo Hello World
爲了使當前文件有可執行的權限,輸入以下命令:
sh hello
chmod u+x hello
運行腳本文件,如下圖所示:
腳本內容解釋:#!說明這個文件類型的,Linux 系統根據#!及該字符串後面的信息確定該文件的類型,在#!之後是一個路徑名,這個路徑名指定了一個解釋腳本中命令的程序,“/bin/BASH”就表明該文件是一個BASH程序 ,需要由/bin下的BASH程序來解釋運行。#表示註釋,echo語句的功能就是把echo後面的字符串輸出到標準輸出中。
2.2 Shell語法
如果輸入沒有被註釋掉,那麼Shell將讀取該輸入並且把它分割成字(word)和操作符,然後引用規則來定義輸入的每個字符的意義。
2.3 Shell擴展
Shell擴展在每個命令行被分割成記號(tokens)後運行。
2.4 重定向
在一個命令運行之前,它的輸入和輸出可能會重定向爲使用一個由Shell解釋的特殊符號。
2.5 Shell函數
Shell函數是一種具有特定功能的一系列語句(命令)的集合,像普通命令一樣運行。事實上,BASH在運行腳本的時候,若發現一個函數的定義,則它將函數保留,並作爲一條命令,在後面遇見該函數名時,便直接運行該函數,所以函數需要先定義,再調用。
2.6 Shell變量
Shell變量是一個存儲值的實體,就是一個存儲了名字的參數,引用變量用
2.7 Shell腳本
Shell腳本與Windows下的批處理類似,就是一堆命令的集合,方便一次性運行的程序文件。
三,判斷和遞歸
3.1 判斷的用法
判斷的語法由if、elif、then、fi所構成,示例如下:
#!/bin/bash
if [ $1 -eq 1 ]; then
echo "yes 1"
elif [ $1 -eq 2 ]; then
echo "yes 2"
else
echo "no"
fi
這是簡單的判斷決定輸出,運行結果如下:
3.2 循環的用法
在Shell腳本中使用的循環有case、for、while和until,這裏介紹for和while這兩個循環
while語法
while [ 條件 ] ;
do
命令或動作
done
上面的中括號[]中的條件不能和括號連在一起,而必須加上空格。下面附上一個示例:
#!/bin/bash
echo "please input n to computer 1+2+....+n"
read -r n
x=1
sum=0
while [ $x -le $n ];
do
sum=`expr $sum + $x`
x=`expr $x + 1`
done
echo "sum=" $sum
在Shell腳本中,所有的變量都是文字形態,因此要作爲數值使用,必須要加上expr變量,而且表達式必須加上反引號。在本示例中用read -r 讀取輸入變量n,-le表示數值的小於或等於。
for語法
for item in list
do
命令或動作
done
示例,判斷當前目錄下的所有對象是一般文件還是文件夾:
#!/bin/bash
for ff in *;
do
if [ -f $ff ];then
echo "$ff is a file"
elif [ -d $ff ];then
echo "$ff is a directory"
else
echo "$ff is not a file , not a directory"
fi
done
資料來源《Linux指令與Shell編程編程範例速查手冊》