shell指令碼編程講解2
自訂環境變數(全域變數)
設定環境變數
如果想設定環境變數,就要在給變數賦值之後或設定變數時使用export命令,帶-x選項的declare
內建命令也可可以同樣完成功能(注意:輸出變數時不要在變數名前面加$)
格式:
①export變數名=value
②變數名=value;export變數名
③ declare -x變數名=value
執行個體:
1.當前生效
exportOLDBOY="oldboy"
echo $OLDBOY
2.對目前使用者有效
vi .bash_profile
3.對所有使用者都生效
vi /etc/profile
source /etc/profile 或 . ./etc/profile
顯示與取消環境變數
通過echo 命令列印環境變數
$HOME使用者登陸時進入的目錄
$UID 目前使用者的UID(使用者標識)
$PWD 當前工作目錄的絕對路徑名
$SHELL 當前SHELL
$USER目前使用者
[oldboy@mode ~]$ echo $HOME
/home/oldboy
[oldboy@mode ~]$ echo $UID
501
[oldboy@mode ~]$ echo $PWD
/home/oldboy
[oldboy@mode ~]$ echo$SHELL
/bin/bash
[oldboy@mode ~]$ echo $USER
oldboy
用env{printenv}或set顯示預設的環境變數
[oldboy@mode ~]$
[oldboy@mode ~]$ env
HOSTNAME=mode
SHELL=/bin/bash
TERM=vt100
OLD=old
HISTSIZE=1000
LC_ALL=C
USER=oldboy
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=
01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*
.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.l
zh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31
:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35
:*.png=01;35:*.tif=01;35:
MAIL=/var/spool/mail/oldboy
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sersync/bin:/usr/local
/mysql/bin:/usr/local/mysql/scripts:/usr/local/mysql:/home/oldboy/bin:/home/oldboy/bi
n
INPUTRC=/etc/inputrc
PWD=/home/oldboy
LANG=en_US.UTF-8
OLDBOY=oldboy
SHLVL=1
HOME=/home/oldboy
LOGNAME=oldboy
CVS_RSH=ssh
LESSOPEN=|/usr/bin/lesspipe.sh%s
G_BROKEN_FILENAMES=1
_=/bin/env
或則set -a
[oldboy@mode ~]$ id -u
501
[oldboy@mode ~]$ echo $UID
501
用unset消除本地變數和環境變數
echo $USER
unset USER
局部變數
定義本地變數
一般字元串變數定義
變數名=value
變數名='value'
變數名=“value”
輸出 echo “a=$a”
或者 echo “a=${a}”
有關單引號.雙引號與不加引號的簡要說明如下:
單引號:
可以說是所見即所得 (WYSIWYG):即將單引號的內容原樣輸出,或者描述為單引號裡面看到底的
是什麼,就輸出什麼
雙引號:
把雙引號內的內容輸出出來;如果內容中有命令,變數等,會先把變數,命令解析出結果,然後
在輸出最終內容來
無引號:
把內容輸出出來,會將含有空格的字串視為一個整體輸出,如果內容中有命令。變數
等,會先把變數,命令解析出結果,然後在輸出最終內容來,如果字串中帶有空格等特殊字元
,則不能完整的輸出,需要改加雙引號,一般連續的字串,資料,路徑等可以用,不過最好用
雙引號替代之
範例1:經過反引號的‘date’命令測試
[root@mode ~]# echo'`date`'
`date`
[root@mode ~]# echo"`date`"
Sat Feb 14 19:25:29 CST2015
[root@mode ~]# echo `date`
Sat Feb 14 19:25:37 CST2015
對於變數的引用,一個 一個是$,另一個是``
範例2:awk調用s[root@mode ~]# ETT=123
[root@mode ~]# awk 'BEGIN{print "$ETT"}'
$ETT
[root@mode ~]# awk 'BEGIN{print '$ETT'}'
123
自訂變數的建議
(1).純數字(不帶空格),定義方式可以不加引號(單或雙),例如
a.oldboyage=33
b.NETWORKING=yes
2.沒有特殊情況,字串一般用雙引號()定義,特別是多個字元創空間有空格時,
a.NFSD_NODULE="no load"
b.MyName="Oldboy is handsome boy."
3.變數內容需要原樣輸出時,要用單引號('')
a.OLDBOY_NAME='OLDBOY'
變數的命名規範
1)變數命名要統一,使用全部大寫字母,多個單詞串連使用“_”,引用時,最好以${APACHE}
_ERR_NUM}加大括弧或“${APACHE_ERR_NUM}”外面加雙引號方式引用變數:
2)避免無含義字元或數字:例如下面的COUNT,並不知道其確切含義
3)全域變數定義,如OLDBOY_HOME或OLDBOYHOME,在變數使用時,使用{}將變括起來
或“${OLDBOY_HOME}”
指令碼中局部變數定義:存在於指令碼函數(function)中的變數稱為局部變數,要以local方式進行
聲明,使之之在本函數範圍內有效,防止變數在函數中的命名與變數外部程式中變數重名造成
程式異常,
function TestFunc()
{
local i
for((i=0;i<n;i++))
do
echo 'do something';
done
}
變數合并:當某些變數或配置項要組合起來才有意義時,如檔案的路徑,和檔案名稱,建議將要
組合的變數合并到一起賦值給一個新的變數,這樣既方便之後的調用,也為以後進行修改提供方
便;
例如:VERSION='2.2.22'
SOFTWARE_NAME="httpd"
SOFTWARE_FULLNAME="${SOFTWARE_NAME}-${VERSION}.tar.gz"
把一個命令作為變數
CMD= `ls`wd/
echo $CMD
[root@mode ~]# ls
anaconda-ks.cfg index.html install.log oldboy
grep.log index.html.1 install.log.syslog
[root@mode ~]# CMD=`ls`
[root@mode ~]# echo $CMD
anaconda-ks.cfg grep.logindex.html index.html.1 install.log install.log.syslog
oldboy
在變數名前面加$,可以取得此變數的值,使用echo命令 可以顯示變數的值,$A和${A}的寫法不
同,但是功能一樣,
3${WEEK}day 若變數和其他字元組成新的變數就必須加上大括弧{}
4養成將所有字元創變數用雙引號括起來的使用的習慣,將會減少很多編程是遇到的奇怪的錯誤
生產環境常見應用:
1.對網站按天打包產生不同的檔案名稱。
CMD=$(date +%F)
echo $CMD
echo $(date +%F).tar.gz
echo `date +%F`.tar.gz
tar zcvf etc_$(date +%F).tar.gz/etc