shell指令碼程式不是複雜的程式,它是按行解釋的。指令碼程式總是以
#!/bin/sh
開始,它通知shell使用系統上的bourne shell直譯器。其中#符號是注釋。
指令碼程式是從上到下執行的,執行指令碼前需要改變該指令碼程式的執行許可權。確保正確建立指令碼例徑,只有
這樣,指令碼程式才能正確執行。
下面通過乙個指令碼程式示例來看shell是如何工作的。
linux系統中有好多種不同的shell,但通常使用bash(bourne again shell)進行shell程式設計,因為bash是
免費的並且很容易使用。所以在本文中提供的指令碼都是使用bash進行shell程式設計。和其他程式語言一
樣,可使用任意一中編輯器來編寫shell程式,比如nedit,kedit,emacs,vi等。
但編輯好指令碼程式後,要使指令碼程式可執行,只需要改變指令碼程式的許可權,命令如下:
[root@barrymore /]chmod +x filename
然後,通過輸入:
[root@barrymore /]./filename:
來執行程式。
下面是個簡單的例子:
$vim firstscript
#!/bin/sh
echo "you are welcome to use bash."
echo "current work directory is $pwd."
echo "you are $logname."
增加執行許可權
$chmod +x firstscript
開始執行指令碼程式:
$./firstscript
執行結果:
you are welcome to use bash.
current work directory is /home/yangailin.
you are yangailin
環境變數與shell變數
為使shell變成更加有效,系統提供了一些shell變數。shell變數可以儲存諸如路徑名,檔名或者乙個
數字這樣的變數。從這點上可以得出乙個結論:在shell程式設計中,變數至關重要。
下面有一些小的指令碼程式來說明各種變數的使用。
1.顯示變數
使用echo命令輸出單個變數的值
$ hello="hello,world"
$ echo $
hello,world
$ another=100
$ echo $
1002.清除變數
使用unset命令清除變數
$ tmp_var=foo
$ echo $
foo$ unset tmp_var
$ echo $
$ 3.顯示所有本地shell變數
使用set命令顯示所有本地定義的shell變數
$ set
....
term=vt100
shell=bin/bash
set輸出可能很長。檢視輸出時可以看出shell已經設定了一些使用者變數以使工作環境更加容易使用
4.結合變數值
將變數結合在一起
echo $$
$ tmp_var1="hello,"
$ tmp_var2="world"
$ echo $$
hello,world
5.測試變數是否已經設定
有時要測試是否已設定或初始化變數。此命令格式為:
$ 如果設定了變數值,則使用它;如果未設定,則取新值。例如
$ colour=blue
$ echo 'this colour is $'
this colour is blue
變數colour取值blue,echo列印變數colour時,首先檢視該變數是否已經賦值,如果查到,則使用該值。
現在清除該值,再來看看結果
$ unset colour
$ echo 'this colour is $'
this colour is green
$ echo $
$上面的例子並沒有實際值傳給變數,需要使用下面的命令來完成此功能:
$例如:
$ unset colour
$ echo 'this colour is $'
this colour is green
$ echo $
green
$6.使用變數來儲存系統命令引數
可以使用變數來儲存系統命令引數的替換資訊。
在下面的例子中使用變數儲存檔案複製件的檔名資訊。變數source儲存passwd檔案的路徑,dest儲存
cp命令中的檔案目標。示例如下:
$ src_file='/var/log/messages'
$ dst_file='/var/log/messages_1'
$ cp $ $
7.設定唯讀變數
如果想設定變數後不再改變其值,可以將該變數設定成唯讀方式。格式如下:
variable-name=value
readonly variable-name
下面的例子中,把變數設定成乙個常量並將它設為唯讀,任何改變該變數值的操作都將返回錯誤資訊。
$ maxval=65535
$ echo $
65535
$ readonly maxval
$ maxval=32767
bash:maxval:readonly variable
要檢視所有唯讀變數,可使用唯讀命令:
$ readonly
declare -ir euid="0"
declare -r maxval="65535"
declare -ir ppid="24109"
8.設定環境變數
variable-name=value
export varoable-name
9.顯示環境變數
$ myshell='bash'
$ export myshell
$ echo $
bash
$使用env命令可以檢視所有的環境變數
$ env
10.清除環境變數
使用unset命令可以清除環境變數
$ unset myshell
$ echo $
$11.set命令
在$ home.profile檔案中設定環境變數時,還有另外一種方法匯出這些變數。使用set命令-a選項,即
set -a指明所有變數直接被匯出。不要在/etc/profile中使用這種方法,最好只在自己的$ home.profile
檔案中使用。
$ cat yangailin.profile
set -a
mail='/var/spool/mail/yangailin'
path=$home:$path
12.將變數匯出到子程序
shell新使用者碰到的問題之一是任何把定義過的變數匯出到子程序。其實根據前面討論過的環境變數的工
作方式,只要使用export命令就可以。可以用指令碼程式來實現,並在指令碼中呼叫另一指令碼。只要使用
export命令匯出變數,就可以在任意的指令碼中使用該變數,他們均將繼承匯出變數的所有許可權。當然,不
可以將變數從子程序匯出到父程序中,但可以通過重定向做到。
13.向系統命令傳遞引數
可以在指令碼中向系統命令傳遞引數,下面的例子是,在find命令裡使用$l 引數指定查詢的檔名。
$ cat findfile
#!/bin/sh
find / -name $l -depth
$ ./findfile passwd
/etc/passwd
/etc/pam.d/passwd
/etc/uucp/passwd
/usr/bin/passwd
14.特定變數引數
既然已經知道了任何訪問和使用shell指令碼中的引數,就要必須知道指令碼執行時的一些相關控制資訊,共
有7個特定變數
$# 傳遞到指令碼的引數個數
$* 以乙個單字串顯示所有向指令碼傳遞的引數,與位置變數不同,次選項引數可超過九個
$$ 指令碼執行的當前程序id號
$! 後台執行的最後乙個程序的程序id號
$@ 與$#相同,但是使用時加引號,並在引號中返回每個引數
$- 顯示shell使用的當前選項,與set命令功能相同
$? 顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤
Shell 程式設計入門
首先建立乙個檔案 在終端中輸入如下命令 vi helloworld.sh 然後按i進行命令編寫 下面這句話是必須寫的 bin sh這句話是必須寫的 bin sh a hello world echo a 下面執行的時候先得輸入 將這個許可權改為可執行檔案 chmod x helloworld.sh ...
Shell程式設計入門
目錄 shell概述 shell解析器 shell指令碼 什麼是shell指令碼 編寫shell指令碼 1 指令碼格式 2 第乙個shell指令碼 helloworld 3.指令碼的常用執行方式 第一種 採用bash或sh 指令碼的相對路徑或絕對路徑 不用賦予指令碼 x許可權 第二種 採用輸入指令碼...
Shell 程式設計入門
首先建立乙個檔案 在終端中輸入如下命令 vi helloworld.sh 然後按i進行命令編寫 下面這句話是必須寫的 bin sh這句話是必須寫的 bin sh a hello world echo a 下面執行的時候先得輸入 將這個許可權改為可執行檔案 chmod x helloworld.sh ...