shell程式設計(2)Shell的文法變數
在shell裡,使用變數之前通常並不需要實現為他們做出聲明。預設情況下,所以變數都被看做字串來儲存,即使它們被賦值為數值也是如此。shell和一些工具程式會在需要時把數值型字串轉換為對應的數值以對它們進行操作。Linux大小寫敏感。
在shell中,我們可以通過在變數名前加一個$符號來訪問它的內容。無論何時想擷取變數的內容,我們都需要在它前面加上一個$字元。當為變數賦值時,我們只需要使用變數名。
如果字串裡包含空格,就必須用引號把他們括起來。還要注意在等號兩邊不能有空格。
我們可以通過使用read命令將使用者的輸入賦值給一個變數。這個命令需要一個參數,即準備讀入使用者的資料的變數名,然後它會等待使用者輸入資料。通常情況下,使用者按下斷行符號鍵時,read命令結束。
1. 使用引號
如果在一個參數中包含一個或多個空白符(例如,空格,定位字元或者分行符號),就必須給參上加上引號。像$myvar這樣的變數在引號中的行為取決於你所使用的引號類型。如果你把一個帶有$字元的變數放在雙引號中,程式執行到這一行就會把變數替換為它的值;如果你把它放在單引號中,就不會發生替換現象。還可以通過在$字元前機上一個\字元取消它的特殊含義。
字串通常放在雙引號中,以防止他們被空白符分開。
#! /bin/bash
myvar="Hi there"
echo $myvar
echo "$myvar"
echo '$myvar'
echo \$myvar
echo Enter some text
read myvar
echo '$myvar' now equals $myvar
exit 0
輸出結果如下:
Hi there
Hi there
$myvar
$myvar
Enter some text
HelloWorld
$myvar now equals Hello World
2. 環境變數
當一個shell指令碼程式開始運行時,一些變數會根據環境設定中的值進行初始化。這些變數通常用大寫字母做名字,以便區分使用者在指令碼程式裡定義的變數,後者按慣例用小寫字母做名字。
#HOME 目前使用者的主目錄
#PATH 以冒號分隔的用來搜尋命令的目錄列表
#PS1 命令提示字元,通常是$字元,但在bash中,你可以使用一些更複雜的值。#PS2 二級提示符,用來提示後續的輸入,通常是>字元
#IFS 輸入欄位分隔字元
$0 SHELL指令碼的名字
$# 傳遞給指令碼的參數個數
$$ shell指令碼的進程號
3. 參數變數
$1,$2… 指令碼程式的參數
$* 在一個列表中列出所有的參數,各個參數之間用環境變數IFS的第一個字元分隔開
$@ 它是$*的一種精巧的變換,不使用IFS,使用當IFS為空白時,參數的值也不會結合在一起。
可以通過下面這個例子看出$*和$@的區別
chen123@ubuntu:~/C++$ IFS=''
chen123@ubuntu:~/C++$ set foo bar bam
chen123@ubuntu:~/C++$ echo "$@"
foo bar bam
chen123@ubuntu:~/C++$ echo "$*"
foobarbam
chen123@ubuntu:~/C++$ unset IFS
chen123@ubuntu:~/C++$ echo "$*"
foo bar bam
chen123@ubuntu:~/C++$
實驗:參數和環境變數
指令碼程式:
#! /bin/sh
salutation="Hello"
echo $salutation
echo "The program $0 is nowrunning"
echo "The second parameter was$2"
echo "The first parameter was $1"
echo "The parameter list was $*"
echo "The user's home directory is$HOME"
echo "Please enter a newgreeting"
read salutation
echo $salutation
echo "The script is now complete"
exit 0
輸出結果:
Hello
The program ./hird is now running
The second parameter was
The first parameter was
The parameter list was
The user's home directory is /home/chen123
Please enter a new greeting
SIre
SIre
The script is now complete
條件test或[命令
為增強可讀性,當使用[時,我們還是用符號]來結尾。
我們以一個最簡單的條件為例來介紹test命令的用法:檢查一個檔案是否存在。用於實現這一操作的命令是test –f <filename>,所以在指令碼程式裡我們寫出如下的代碼:
if test –f fred.c
then
…
fi
或用[可以寫成如下:
if [ -f fred.c ]
the
…
fi
注意必修在[符號和被檢查的條件之間留出空格。
test命令可以使用的條件類型可以歸為三類:字串比較、算術比較和與檔案有關的條件測試。
舉例如下:
#! /bin/sh
if [ -f /bin/bash ]
then
echo "file /bin/bash exits"
fi
if [ -d /bin/bash ]
then
echo "/bin/bash is a directory"
else
echo "/bin/bash is NOT a directory"
fi
輸出:
file /bin/bash exits
/bin/bash is NOT a directory
控制結構if語句:
if condition
then
statements
else
statements
fi
elif語句
if condition
then
statements
elif condition
statements
else
statements
fi
for語句
for variable in values
do
statements
done
實驗:使用固定字串的for迴圈
for variable in values
do
statements
done
輸出:
bar
fud
43
實驗:使用萬用字元擴充的for迴圈
#! /bin/sh
for file in $(ls f*.sh);
do
lpr$file
done
exit 0
這個例子示範了$(command)用法。for命令的參數表來自括在$()中的命令的輸出結果。
while語句
while condition do
statements
done
until語句
until condition
do
statement
done
case語句
case variable in
pattern[ | pattern]…) statements;;
pattern[ | pattern]…) statements;;
esac
命令列表
AND列表
statement && statement2 && statements && …
OR列表
statement || statement || statement || …
語句塊
如果你想在某些只允許使用單個語句的地方使用多條語句,可以把它們括在括弧{}中構造一個語句塊。