shell編程初步
1.通配符與文件名變量
符號 | 說明 |
* | 匹配任何字符和任何數目的字符組合 |
? | 匹配任何單個字符 |
[] | 匹配任何包含在括號裏的單個字符 |
注意:正常的文件名中不應該出現這些字符。
2.輸入、輸出重定向
2.1、輸入重定向
符號:<
用法:命令 < 文件名
功能:輸入重定向是指把命令或可執行程序的標準輸入重定向到指定的文件。也就是說輸入可以不來自鍵盤,而來自一個指定的文件。
例子:
$ wc < man.conf
146 730 4709
2.2、輸出重定向
符號:>
用法:命令>文件名
功能:輸出重定向能把一個命令的輸出重定向到一個文件裏,而不在屏幕上顯示。
例子:
注意:如果">"符號後指定的文件已經存在,那麼這個文件將要被重寫。
另外:如果要將一條命令的輸出結果追加到指定的文件後面,可以使用追加重定向,操作符">>",格式:命令>>文件名
3、管道
符號:|
用法:命令|命令
功能:管道功能是將一個程序的輸出作爲另一個程序輸入
例子:cat man.conf | grep "wsh" | wc -l
4、Shell腳本的執行
方法1:
格式:bash shell 程序名
方法2:
格式:bash < Shell程序名
相當於用重定向的方法執行程序
方法3:
格式:. *.sh
當用系統編輯器生成一個文件時,系統賦予的許可權都是644,可用chmod把*.sh程序權限更改爲755。
5.Shell變量
5.1、用戶自定義變量
5.1.1、用戶自定義變量
符號:
用法:變量名=變量值
功能:自定義一個變量,並將其賦值爲“變量值”
例子:$ MYNAME=ABC
$ echo $MYNAME
ABC
注意:在給變量賦值時"="兩邊一定不能使用空格。
另外:可以使用unset命令刪除一個已經定義的變量。
5.1.2、參數置換的語法和功能
(1)語法:變量={參數:-word}
功能:這種變量的值等於某一個參數的值,如果該參數沒有設置,怎變量的值就是word的值。
(2)變量={參數:=word}
功能:如果設置了參數,就用參數的值賦給變量,否則吧參數的值設置爲word,然後再用word賦值。
(3)變量={參數:?word}
功能:如果設置了參數,則用參數的值賦給變量,否則就顯示word並從Shell中退出;如果省略了word,則顯示標準信息。此種變量要求一定等於某一個參數的值,如果沒有該參數沒有設置,就顯示一個信息,然後退出,因此這種方式常用於出錯指示。
(4)變量={參數:+word}
功能:如果設置了參數,就用word置換變量,否則不進行置換。
5.2、環境變量
Shell在開始執行時就已經定義了一些和系統工作環境有關的變量,用戶還可以重定義這些變量,常用的Shell環境變量如下:
(1)PWD:當前工作目錄的絕對路徑。
(2)PATH:用戶保存用冒號分隔的目錄路徑名,Shell將按照PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執行文件將被執行。
(3)UID:當前用戶的是別字,取值是由數位構成的字串。
5.3、預定義變量
預定義變量和環境變量類似,唯一變的不同是預定義變量不能有用戶重定義。常用的預定義變量如下:
(1)$0:當前進程的進程名。
(2)$!:後臺運行的最後一個進程號。
(3)$?:命令執行後返回的狀態,即指:上一條命令的返回代碼,用於檢查上一個命令執行是否正確,命令退出狀態爲0表示該命令正確執行,任何非0值均表示命令出錯。
(4)$*:所有位置參數的內容。
(5)$#:位置參數的數量。
(6)$$:當前進程的進程號。
(7)$-:使用set及執行時傳遞給Shell的標誌位。
(8)$@:
5.4、位置變量
位置變量是指在調用Shell程序的命令行中按照各自的位置決定的變量,值在程序名之後輸入的參數。Shell取第一個位置變量替換程序文件中的$1,第二個替換$2,依次……。$0指的是Shell程序的文件名。
6.測試命令
符號:test
用法:test 需要測試的表達式
功能:如果成功會返回0,失敗返回1;常用在兩個整數值的比較、字符比較、文件操作(如文件是否存在以及讀寫權限的狀態等),邏輯操作。
例子:如測試兩個變量是否相等:
num1=2
num2=4
test $num1 -eq $num2
echo $?
0
常用的測試符及其相應的功能參數如下:
(1)數值測試:-eq 等於,-ge 大於等於, -gt 大於爲真,-le 小於等於爲真, -lt 小於爲真,-ne 不等於爲真。
(2)字符測試:= 等於爲真, != 不等於爲真, -z 字串 字符長度爲0則爲真,-n 字符 字符長度不爲0則爲真
(3)文件測試:-b 文件名 文件存在且爲塊特殊文件則爲真, -c 文件名 文件存在且爲字符型文件, -d 文件名 文件存在且爲目錄, -e 文件名 文件存在則爲真,-f 文件名 文件存在且爲普通文件則爲真,-s 文件名 文件存在且至少有一個字符,-r 文件名 文件存在且可讀, -w 文件名 可寫, -x 文件名 文件存在且可執行。
注意:bash在使用test測試時提供了另一種標準的方法:用方括號將要測試的語句括起來,格式爲[ 測試語句 ],並且左方括號‘[’的後面和右方括號 ]的前面一定要有空格。
例子:如:
$ [ $num1 -eq $num2 ]
$ echo $?
1
7.內部命令
符號:readonly
用法:readonly 變量名
功能:定義值讀變量,應用於說明一個變量併爲它賦一個特定的值後就不再改變該值的情況。
符號:export
用法:export 變量名
功能:定義全局變量。即export命令可以將一個局部變量供給Shell執行的其他命令使用。
符號:read
用法:read 變量名錶
功能:從標準輸入設備讀入一行,分解爲若干個字,然後賦給該命令中定義的變量。
8.Shell程序設計流程控制
8.1 符合結構
bash中可以使用一對花括號{}或圓括號()將多條命令符合在一起,是他們在邏輯上成爲一條名命令。
(1)使用“{}”括起來的多條命令在邏輯上成爲一條命令,一般出現在管道附“|”的左邊。bash將從左到右依次執行各條命令,並將各自的輸出結果彙集到一起,形成輸入流,作爲“|”後面的輸入。注意:{}和[]的格式一樣,必須有空格。
(2)bash執行“()”中的命令時,會再創建一個新的子進程,然後由這個子進程去執行“()”中的命令。如果不想讓命令運行時對狀態集合(如位置參數等)的改變影響到下面語句的執行,就應該把這些命令放在()中。注意:()前後都沒有空格。
8.2 條件判斷
(1)if條件語句
i 格式:
if 條件命令串
then
條件爲真時執行
fi
ii 格式:
if 條件命令串
then
條件爲真時執行
elif 條件命令串
then
命令串
else
then
命令串
fi
(2)case 條件選擇
case string in
pattern1)
命令串;;
pattern2)
命令串;;
*)
其它命令串
8.3 循環控制
(1)for循環
for 變量名 in 參數1 參數2 參數3 ... 參數n
do
n個命令行
done
(2)while和until
while 條件命令串
do
n個命令行
done
until 條件命令串
do
n個命令行
done
8.4 shift命令
bash的位置參數變量爲$1~$9,因此通過位置變量只能訪問前9個參數,如果要想方位前9個參數之後的參數,就必須使用shift命令。如果shift命令後加整數,則可以一次進行多個移位。
例如:
#! /bin/bash
#this is a example for shift_add
if [ $# -eq 0 ]
then
echo no number!
exit 1
fi
export TOTAL=0
until [ $3 -eq 0 ]
do
TOTAL=$[TOTAL+$1]
shift
done
echo $TOTAL
9.Shell腳本中的函數