一、bash內部變數:
常見的內部命令:echo,eval,exec,export,readonly,read,shift ,wait,exit和點(.)也就是source命令。
命令 |
作用 |
echo 變數名 |
將變數名表指定的變數顯示到標準輸出 |
eval |
讀取一連串的參數,然後再依參數本身的特性來執行 |
exec命令參數 |
當Shell執行到exec語句時,不會去建立新的子進程,而是轉去執行新的命令,當指定的命令執行完時,該進程(也就是當初的Shell)就終止了,所以Shell程式中的exec後面的語句將不再被執行 |
export 變數名=value |
Shell 可以用export把它的變數向下打入子Shell,從而讓子進程繼承父進程中的環境變數,但子Shell不能用export把他的變數向上帶入父Shell |
readonly 變數名 |
從標準輸入讀字串,傳給指定變數 |
shift |
使變數位置發生位移,即 $2成為$1,$3成為$2,每執行一次$#-1 |
1、eval:
一個eval只能使shell對參數多一次處理,因此有幾個eval就可以多加幾次。
2、shift
3、readonly
4、exec
執行完後直接退出系統。
二、變數主串:
export name="i am yangni"echo ${#name}echo ${name:2}echo ${name:2:3}echo ${name#i am}echo ${name%ni}echo ${name/yang/chun}
應用執行個體:
批量修改檔案名稱
for f in ` ls *.c` //設定f的值do mv $f `echo ${f/yangni/qicheng}`done
當然還有更簡單的方法,那就是rename
rename xxx yyy *.c :把所有含字串xxx的.c檔案,xxx改為yyy
三、變數替換: 1、${value:-word} 判斷變數是否定義
result=${test : -UNSET} :如果變數test定義了,顯示test內容。如果test未定義,列印UNSET(一個字串)
//test未定義:[yangni@centos6 abc]$ result=${test:=UNSET}[yangni@centos6 abc]$ echo $resultUNSET//test定義:[yangni@centos6 abc]$ test=3[yangni@centos6 abc]$ result=${test:=UNSET}[yangni@centos6 abc]$ echo $result3
2、${value:word} 若變數value未定義,將word賦值給value,確保變數始終有值。
result=${test :=UNSET} :變數未定義,將字串UNSET賦值給test
[yangni@centos6 abc]$ unset test[yangni@centos6 abc]$ result=${test:=UNSET}[yangni@centos6 abc]$ echo $test //test未定義,將UNSET賦值給它 UNSET
${value-word}類似於2,變數value不存在用word替代。
1./etc/init.d/httpd
2./etc/init.d/crond
3.對變數的路徑操作最好先判斷是否為空白,特別是刪除操作:
path =/server/backup
find ${path:= /tmp} -name “*.tat.gz” -type f |xargs rm -f
rm -fr ${path:= /tmp} //刪除路徑 每日編程練習:
#!/bin/sh result=1while [ $# -gt 0 ]do result=`expr $result \* $1` shiftdone echo $result
用shift實現所有參數的乘積。注意,乘號要用逸出字元轉義,不然會報錯。