保留字符及其含義
shell變量
條件測試命令
表達式
流程控制
參考資料
查看ubuntu支持的Shell:
查看當前shell:
以下是sh Shell腳本編程,,也適用于bash,差異之處已說明,。
保留字符及其含義
$ shell變量名的開始,,如$var
| 管道,將標準輸出轉到下一個命令的標準輸入
# 注釋開始
& 在后臺執(zhí)行一個進程
,? 匹配一個字符
* 匹配0到多個字符(與DOS不同,,可在文件名中間使用,并且含.)
$- 使用set及執(zhí)行時傳遞給shell的標志位
$! 最后一個子進程的進程號
$# 傳遞給shell script的參數個數
$* 傳遞給shell script的參數
$@ 所有參數,,個別的用雙引號括起來
$? 上一個命令的返回代碼
$0 當前shell的名字
$n (n:1-) 位置參數
$$ 進程標識號(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之參數
.預定義變量(特殊變量)
.環(huán)境變量
(1)用戶自定義變量(數據的存儲)
$ COUNT=1 $ NAME="He Binwu"
$ echo $NAME
$ echo ${NAME}
技巧:因為大部分UNIX命令使用小寫字符,,因此在shell編程中通常使用全大寫變量,,當然這并不是強制性的,但使用大寫字符可以在編程中方便地識別變量。
變量的調用:在變量前加$,。
使用unset命令刪除變量的賦值,。
$ Z=hello $ echo $Zhello $ unset Z $ echo $Z $
在變量未賦值之前其值為空。Bourne Shell允許對變量設置默認值(相當于C#中 ?? 表達式),,其格式如下:
${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
在變量已賦值時進行替換:
MYTEST=pxl echo ${MYTEST} echo ${MYTEST:+"changevalue"} echo $MYTEST
輸出: pxl changevalue pxl
帶有錯誤檢查的有條件變量替換:
echo ${UNAME:?"UNAME has not been set"} echo ${UNAME} #如果上一句判斷錯誤,這里不會執(zhí)行
輸出:
./test.sh: 17: UNAME: UNAME has not been set
(2)位置變量(Shell參數)
在shell script中位置參數可用$1..$9表示,,$0表示內容通常為當前執(zhí)行程序的文件名,。
可以使用shift [n] 來刪出指定前n個參數,n默認為1.
腳本test.sh:
shift shift 2 echo $1
echo $0
執(zhí)行: $ ./test.sh a b c d e
輸出: d
./test.sh
條件測試命令
(1)數值測試:
-eq :等于則為真,。 -ne :不等于則為真,。 -gt :大于則為真。 -ge :大于等于則為真,。 -lt :小于則為真,。 -le :小于等于則為真。
(2)字串測試: = :等于則為真,。 != :不相等則為真,。 -z字串 :字串長度偽則為真。 -n字串 :字串長度不偽則為真,。
(3)文件測試: -e文件名 :如果文件存在則為真,。 -r文件名 :如果文件存在且用戶有讀權限則為真。 -w文件名 :如果文件存在且用戶有寫權限則為真,。 -x文件名 :如果文件存在且用戶有可執(zhí)權限行則為真,。 -s文件名 :如果文件存在且至少有一個字符(大小不為零)則為真。 -d文件名 :如果文件存在且為目錄則為真,。 -f文件名 :如果文件存在且為普通文件則為真,。 -c文件名 :如果文件存在且為字符設備文件則為真。 -b文件名 :如果文件存在且為塊設備文件則為真,。
表達式
(1) 與,、或、非
&& :與
|| :或
! : 非(需要有空格)
(2) expr命令
expr命令一般用于整數值,,但也可用于字符串。一般格式為: expr argument operator argument
其中operator為+ - * / %, 但對*的使用要用轉義符\,。
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編程基礎
shell編程簡介
|