保留字符及其含義
shell變量
條件測試命令
表達(dá)式
流程控制
參考資料
查看ubuntu支持的Shell:
查看當(dāng)前shell:
以下是sh Shell腳本編程,也適用于bash,差異之處已說明。
保留字符及其含義
$ shell變量名的開始,如$var
| 管道,將標(biāo)準(zhǔn)輸出轉(zhuǎn)到下一個(gè)命令的標(biāo)準(zhǔn)輸入
# 注釋開始
& 在后臺(tái)執(zhí)行一個(gè)進(jìn)程
? 匹配一個(gè)字符
* 匹配0到多個(gè)字符(與DOS不同,可在文件名中間使用,并且含.)
$- 使用set及執(zhí)行時(shí)傳遞給shell的標(biāo)志位
$! 最后一個(gè)子進(jìn)程的進(jìn)程號
$# 傳遞給shell script的參數(shù)個(gè)數(shù)
$* 傳遞給shell script的參數(shù)
$@ 所有參數(shù),個(gè)別的用雙引號括起來
$? 上一個(gè)命令的返回代碼
$0 當(dāng)前shell的名字
$n (n:1-) 位置參數(shù)
$$ 進(jìn)程標(biāo)識號(Process Identifier Number, PID)
>file 輸出重定向
`command` 命令替換,如 filename=`basename /usr/local/bin/tcsh`
>>fiile 輸出重定向,append
其他:
$$dir
ls > filelist
ls >> filelist
wc -l < filelist
wc -l filelist
sleep 5; echo 5 seconds reaches; ls -l
ps ax |egrep inetd
find / -name core -exec rm {} \; &
filename=`date "+%Y%m%d"`.log
shell變量
Shell有如下四種變量:
.用戶自定義變量
.位置變量即 shell script之參數(shù)
.預(yù)定義變量(特殊變量)
.環(huán)境變量
(1)用戶自定義變量(數(shù)據(jù)的存儲(chǔ))
$ COUNT=1 $ NAME="He Binwu"
$ echo $NAME
$ echo ${NAME}
技巧:因?yàn)榇蟛糠諹NIX命令使用小寫字符,因此在shell編程中通常使用全大寫變量,當(dāng)然這并不是強(qiáng)制性的,但使用大寫字符可以在編程中方便地識別變量。
變量的調(diào)用:在變量前加$。
使用unset命令刪除變量的賦值。
$ Z=hello $ echo $Zhello $ unset Z $ echo $Z $
在變量未賦值之前其值為空。Bourne Shell允許對變量設(shè)置默認(rèn)值(相當(dāng)于C#中 ?? 表達(dá)式),其格式如下:
${variable:-defaultvalue}
例:
$ echo Hello $UNAME Hello $ echo Hello ${UNAME:-there} Hello there $ echo $UNAME #變量值并未發(fā)生變化 there $ UNAME=hbwork $ echo Hello ${UNAME:-there} Hello hbwork
另一種情況:改變變量的值,格式如下:
${variable:=value}
$ echo Hello $UNAME Hello $ echo Hello ${UNAME:=there} Hello there $ echo $UNAME #變量值并未發(fā)生變化 there
變量替換中使用命令替換:
echo ${MYDIR} #輸出空 echo ${MYDIR:-`pwd`}
輸出:
/home/pxl/shelltest
在變量已賦值時(shí)進(jìn)行替換:
MYTEST=pxl echo ${MYTEST} echo ${MYTEST:+"changevalue"} echo $MYTEST
輸出: pxl changevalue pxl
帶有錯(cuò)誤檢查的有條件變量替換:
echo ${UNAME:?"UNAME has not been set"} echo ${UNAME} #如果上一句判斷錯(cuò)誤,這里不會(huì)執(zhí)行
輸出:
./test.sh: 17: UNAME: UNAME has not been set
(2)位置變量(Shell參數(shù))
在shell script中位置參數(shù)可用$1..$9表示,$0表示內(nèi)容通常為當(dāng)前執(zhí)行程序的文件名。
可以使用shift [n] 來刪出指定前n個(gè)參數(shù),n默認(rèn)為1.
腳本test.sh:
shift shift 2 echo $1
echo $0
執(zhí)行: $ ./test.sh a b c d e
輸出: d
./test.sh
條件測試命令
(1)數(shù)值測試:
-eq :等于則為真。 -ne :不等于則為真。 -gt :大于則為真。 -ge :大于等于則為真。 -lt :小于則為真。 -le :小于等于則為真。
(2)字串測試: = :等于則為真。 != :不相等則為真。 -z字串 :字串長度偽則為真。 -n字串 :字串長度不偽則為真。
(3)文件測試: -e文件名 :如果文件存在則為真。 -r文件名 :如果文件存在且用戶有讀權(quán)限則為真。 -w文件名 :如果文件存在且用戶有寫權(quán)限則為真。 -x文件名 :如果文件存在且用戶有可執(zhí)權(quán)限行則為真。 -s文件名 :如果文件存在且至少有一個(gè)字符(大小不為零)則為真。 -d文件名 :如果文件存在且為目錄則為真。 -f文件名 :如果文件存在且為普通文件則為真。 -c文件名 :如果文件存在且為字符設(shè)備文件則為真。 -b文件名 :如果文件存在且為塊設(shè)備文件則為真。
表達(dá)式
(1) 與、或、非
&& :與
|| :或
! : 非(需要有空格)
(2) expr命令
expr命令一般用于整數(shù)值,但也可用于字符串。一般格式為: expr argument operator argument
其中operator為+ - * / %, 但對*的使用要用轉(zhuǎn)義符\。
v1=3 v2=2 v3=`expr $v1 \* $v2` echo $v3
輸出:
6
#適用于/bin/bash,不適用于/bin/sh v1=3 v2=2 v3=$[v1*v2] echo $v3
流程控制
(1) if 條件語句
if [ -f "$file" ] ; then newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"` if [ -f "$newfile" ]; then echo "ERROR: $newfile exists already" else echo "renaming $file to $newfile ..." mv "$file" "$newfile" fi fi
(2) for 循環(huán)
for file in $*; do if [ -f "$file" ] ; then newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"` if [ -f "$newfile" ]; then echo "ERROR: $newfile exists already" else echo "renaming $file to $newfile ..." mv "$file" "$newfile" fi fi done
for n in 9 8 7 6 5 4 3 2 1; do if [ -f "$filen.$n" ]; then p=`expr $n + 1` echo "mv $filen.$n $filen.$p" mv $filen.$n $filen.$p fi done
#適用于/bin/bash,不適用于sh for((i=1;i<=10;i++));do echo $i done
(3) while 循環(huán)
while [ -n "$1" ]; do echo $1 shift done
(4) case 條件
while [ -n "$1" ]; do case $1 in -h) help;shift 1;; # function help is called -f) opt_f=1;shift 1;; # variable opt_f is set -l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2 --) shift;break;; # end of options -*) echo "error: no such option $1. -h for help";exit 1;; *) break;; esac done
參考資料
Shell編程基礎(chǔ)
shell編程簡介
|