標籤:c a int strong 檔案 2014
首先說下我個人對於shell的理解,我覺得shell是一種通過各種控制語句將linux命令進行集合實現批處理的一種指令碼語言.
shell編程入門其實很簡單,文法知識並不多,但是進階shell編程就很難,因為shell是使用者和linux之間的橋樑,要編寫高品質的shell指令碼,就需要使用者對linux有很全面的認識.
這裡我們只分析shell指令碼的文法知識,如想透徹的學習linux還需多努力.
shell結構
1.#!指定執行指令碼的shell
2.#注釋行
3.命令和控制結構
建立shell程式的步驟:
1.建立一個包含命令和控制結構的檔案
2.修改這個檔案的許可權使它可以執行,使用chmod u+x
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
執行指令碼只檢查語法錯誤,將返回所有的語法錯誤