首先說下我我的對於shell的理解,我以爲shell是一種經過各類控制語句將linux命令進行集合實現批處理的一種腳本語言.linux
shell編程入門其實很簡單,語法知識並很少,可是高級shell編程就很難,由於shell是用戶和linux之間的橋樑,要編寫高質量的shell腳本,就須要用戶對linux有很全面的認識.shell
這裏咱們只分析shell腳本的語法知識,如想透徹的學習linux還需多努力.編程
shell結構數組
1.#!指定執行腳本的shellless
2.#註釋行函數
3.命令和控制結構學習
建立shell程序的步驟:測試
1.建立一個包含命令和控制結構的文件調試
2.修改這個文件的權限使它能夠執行,使用chmod u+xip
3.執行 ./example 或者sh exmaple
以下爲一個簡單的shell腳本,顯示當前目錄路徑,和子文件
demo.sh
#!/bin/sh
#we use pwd to print the directory path
/bin/pwd
#we use ls to print the children directories
/bin/ls
變量
shell變量有兩種
1.臨時變量
只在當前文件中起做用。包括用戶自定義變量和位置變量
2.永久變量
永久變量又叫環境變量,其值不隨腳本的結束而消失
設置變量的時候直接使用變量名加賦值便可如date=`date`;而在使用該變量的時候加上$,如echo $date
/~example.sh
date=`date`
echo $date
輸出:Tue May 20 07:48:45 EDT 2014
使用set命令能夠列出全部的環境變量
#set | less
使用unset能夠清除已經定義的變量
如:#unset date
位置變量
相似於c語言的agrc和argv
例如:
ls file1 file2 file3
$0 這個程序的文件名 ls
$n 這個程序的第n個參數 n >=1
特殊變量
$*這個程序全部的參數
$#這個程序的參數個數
$$這個程序的PID
$!執行上一個後臺命令的PID
$?執行上一個命令的返回值
輸入輸出操做
read myname // 從鍵盤獲取姓名
echo $myname //輸出姓名
固然也能夠一次讀入多個數據,和輸出多個數據
read p1 p2 p3
echo $p1 $2 $p3
運算操做
expr命令: 對整數型變量進行算術運算
例如:expr 3 + 5 //數字和運算符之間加上空格,否則會輸出 3+5 而不是想要的8
expr 5 – 2
expr 5 \* 2 //須要對*進行轉義
expr 5 / 2
在shell運算中沒有小括號的定義,若是在多項式中想指定運算步驟應該用expr代替括號
如 expr `expr 5 – 2 ` \* 2 //其中`爲鍵盤坐上角的符號不是單引號!!!!
變量測試語句
用於測試變量是否相等,是否爲空,文件類型等
格式 :test 測試條件 //測試範圍:整數,字符串,文件
字符串測試:
test str1=str2 //測試兩字符串是否相等
test str1=str2
test str1 //測試字符串是否不爲空
test –n str1 //同上
test –z str1 //測試字符串是否爲空
整數測試:
test intl –eq int2 //測試相等
test int1 –ge int2 //測試int1是否大於等於
test int1 –gt int 2 //大於
test int1 –le int //小於等於
test int1 –lt int2 //小於
test int1 –ne int2 //測試是否不相等
文件測試:
test –d file //是否爲目錄
test –f file //是否爲常規文件
test –x file //是否爲可執行文件
test -r file //可讀
test –w file //可寫
test –a file //文件是否存在
test –s file //文件的大小是否爲0
變量測試語句能夠[]進行簡化
test –d $1 等價於 [ –d $1 ] //之間有空格
條件控制語句
1.if
結構:
if test –d $1 then
//TODO
elif 條件2 then //else if
//TODO
fi
2.exit語句
退出程序執行,並返回一個返回碼,返回碼爲0表示正常退出,非0表示非正常退出
3.多個條件的聯合
-a : 邏輯與,僅當兩個條件都成立時,結果爲真
-o:邏輯或,兩個條件只要有一個成立,結果爲真
如 [ –w $file –a –r $file ] //判斷文件是否可讀可寫
4.for …done 語句
for 變量 in 名字表 //名字表相似於數組,只是shell中沒有數組,因此須要所有羅列 之間用空格隔開
do
命令列表
done
5.select
select 變量 in 關鍵字
do
命令列表
done
select 把關鍵字中的每一項作成相似表單,以交互的方式執行do和done之間的命令
6.case…esac語句
case 變量 in
字符串1) 命令列表1 ;;
字符串2) 命令列表2 ;;
esac
7.while
while 條件
do
命令
done
8.shift指令
每執行一次,參數序列順序左移一個位置,$#的值減1
用於分別處理每一個參數,移出去的參數不在可用
函數的應用
函數的定義
函數名()
{
命令序列
}
函數的調用:
函數名 參數1 參數2 。。。
腳本的調試
sh –x script
執行腳本並顯示全部變量的值
sh –n script
執行腳本只檢查語法錯誤,將返回全部的語法錯誤