UNIX Shell 編程(6)
變數
UNIX Shell允許把值存在變數中。
要把值存入一個變數,只需寫出變數名,後面緊跟一個等號,再緊跟變數值。
variable=value
切忌中間含空格
Shell中沒有任何資料類型的概念,變數值通通認為是字串。
如:
[root@localhost programs]# count=1
[root@localhost programs]# echo $count
1
再如:
[root@localhost programs]# my_bin=/tools/jdk6/bin
[root@localhost programs]# echo $my_bin
/tools/jdk6/bin
[root@localhost programs]# ls $my_bin
appletviewer HtmlConverter java javap jcontrol jmap jstack keytool policytool schemagen unpack200
apt idlj javac java-rmi.cgi jdb jps jstat native2ascii rmic serialver wsgen
ControlPanel jar javadoc javaws jhat jrunscript jstatd orbd rmid servertool wsimport
extcheck jarsigner javah jconsole jinfo jsadebugd jvisualvm pack200 rmiregistry tnameserv xjc
例3:
[root@localhost programs]# command=wc
[root@localhost programs]# file=names
[root@localhost programs]# option=-l
[root@localhost programs]# $command $option $file
6 names
變數還能傳值,如下:
[root@localhost programs]# value1=10
[root@localhost programs]# value2=$value1
[root@localhost programs]# echo $value2
10
POSIX標準Shell為變數整數運算提供了一套機制,稱為算術擴充。
格式為:$((expression))
其中,expression是由變數和運算子構成的算是運算式。
如:
[root@localhost programs]# echo $a
[root@localhost programs]# echo $((a=a+1))
1
[root@localhost programs]# echo $a
1
再如:
[root@localhost programs]# result=$((i>=0&&i<100))
如果運算式結果為真,result賦值1;否則賦值0.
[root@localhost programs]# echo $result
1
例3:
[root@localhost programs]# i=$((100*200/10))
[root@localhost programs]# j=$((i<1000))
[root@localhost programs]# echo $i $j
2000 0
單引號和雙引號
單引號告訴Shell忽略所包含的所有特殊字元。
如:
[root@localhost programs]# file=/tools/jdk
[root@localhost programs]# echo $file
/tools/jdk
[root@localhost programs]# echo '$file'
$file
[root@localhost programs]# echo *
addresses collect data data2 intro lotsapaces mon names nu numbers phonebook sorted_name1 sorted_name2 stats tally temp wbb2 wbx writeback
[root@localhost programs]# echo '*'
*
而雙引號只要求忽略大多數。
在雙引號中,有三種特殊字元不會被忽略:
1)貨幣符號$
2)反引號`
3)反斜線/
如:
[root@localhost programs]# x=*
[root@localhost programs]# echo '$x'
$x
[root@localhost programs]# echo "$x"
*
可見,在雙引號內部也進行了變數名替換。
反斜線的例子:
[root@localhost programs]# echo />
>
[root@localhost programs]# x=*
[root@localhost programs]# echo /$x
$x
可見,反斜線進行了轉義。
反斜線還可用於換行:
[root@localhost programs]# lines=one/
> two
[root@localhost programs]# echo $lines
onetwo
命令替換:指Shell能夠將一個命令的標準輸出插入一個命令列中任何位置的功能。
Shell有兩種方法做命令替換:
1)用反引號
2)使用$(...)結構括起來
反引號:其目的不是防止Shell處理某些字元,二是要告訴Shell執行括起來的命令,並將該命令的標準輸出插在命令列中的這個位置。例如:
[root@localhost programs]# echo The date and time is: `date`
The date and time is: Thu Apr 16 16:11:40 CST 2009
[root@localhost programs]# echo Your current working directory is `pwd`
Your current working directory is /tools/test/programs
POSIX標準Shell支援新的$(...)命令替換結構,格式為:
$(command)
例如:
[root@localhost programs]# echo The date and time is: $(date)
The date and time is: Thu Apr 16 16:13:34 CST 2009
[root@localhost programs]# echo Your current working directory is $(pwd)
Your current working directory is /tools/test/programs
此結構比使用反引號要好,原因如下:
1)複雜的命令中組合使用正、反引號會很難看懂,而且在某些字型顯示下難以區分;
2)$(...)結構容易嵌套。
例如:
[root@localhost programs]# cat nu
echo There are $(who | wc -l) users logged in
[root@localhost programs]# ./nu
There are 1 users logged in
[root@localhost programs]# now=$(date)
[root@localhost programs]# echo $now
Thu Apr 16 16:32:10 CST 2009
[root@localhost programs]# filelist=$(ls)
[root@localhost programs]# echo $filelist
addresses collect data data2 intro lotsapaces mon names nu numbers phonebook sorted_name1 sorted_name2 stats tally temp wbb2 wbx writeback
命令替換可嵌套,如下:
[root@localhost programs]# filename=/tools/test/programs
[root@localhost programs]# ls $filename
addresses data intro mon nu phonebook sorted_name2 tally wbb2 writeback
collect data2 lotsapaces names numbers sorted_name1 stats temp wbx
[root@localhost programs]# firstchar=$(echo $filename | cut -c1)
[root@localhost programs]# echo $firstchar
/
[root@localhost programs]# echo $filename
/tools/test/programs
[root@localhost programs]# echo $filename | cut -c1
/
[root@localhost programs]# filename=$(echo $filename | tr "$firstchar" "^")
[root@localhost programs]# echo $filename
^tools^test^programs