一、Shell變數 主要有本地變數和環境變數。
1、本地變數 -- 在使用者現有啟動並執行指令碼中使用
1) 定義本地變數 格式: variable-name=value
例子:[root@jike1 /root]# LOCALTEST="test"
[root@jike1 /root]# echo $LOCALTEST (注意:echo $LOCALTEST 和 echo ${LOCALTEST}的效果是一樣的)
(在變數名前加$, 可以取得此變數的值,使用echo命令可以顯示變數的值)
2) 顯示本地變數 格式: set
例子:[root@chinaitlab root]# set
3) 清除本地變數 格式:unset variable-name
例如:[root@jike1 /root]# unset LOCALTEST
此時再執行echo $LOCALTEST將看不到變數LOCALTEST的輸出。
2、環境變數 -- 在所有的子進程中使用
1) 定義環境變數 格式: export variable-name=value (與本地變數的定義相比,多了一個export關鍵字)
例子:[root@chinaitlab /root]# export DOMAIN="chinaitlab.com"
[root@ chinaitlab shell]# vi testenv.sh
#!/bin/bash #表示用bash來解析指令碼
#testenv.sh
echo $DOMAIN
[root@chinaitlab shell]# chmod +x testenv.sh
[root@chinaitlab shell]# ./testenv.sh
chinaitlab.com
2) 顯示環境變數 格式: env (本地變數的顯示使用set,環境變數的顯示使用env)
例子: [root@chinaitlab test]# env
3) 清除環境變數 格式:unset variable-name (用法與本地變數相同,都使用unset)
例子: [root@chinaitlab shell]# unset DOMAIN
此時再執行./testenv.sh將看不到變數DOMAIN的輸出。
3、其它變數
1) 位置變數 $0,$1,$2,$3……$9
2) 唯讀變數 readonly variable
注意:唯讀變數不能被清除和改變其值,所以要謹慎使用。
3) 特殊變數 $#,$?,$$(表示當前進程的PID)……
二、運算子和運算式
1、運算子是對電腦發的指令,運算子類型有:
算術運算子(+、-、*、/)
按位元運算符(~、<<、>>、&、|、^)
邏輯運算子(&&、||、 > 、= = 、<、! =)
賦值運算子(=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=)
2、運算式是運算子和運算對象的組合體。
1) $[]:可以接受不同基數的數位運算式
echo $[10+1] (輸出:11)
echo "$[2+3],$HOME" (輸出:5,/root)
echo $[2<<3],$[8>>1] (輸出:16,4)
echo $[2>3],$[3>2] (輸出:0,1 運算式為false時輸出0,為true時輸出1)
2) 字元運算式:直接書寫,採用單引號,雙引號引起來。
echo " $HOME,That is your root directory." (輸出:/root,That is your root directory.)
echo ' $HOME,That is your root directory. ' (輸出:$HOME,That is your root directory.)
單引號和雙引號的區別在於:單引號是原樣顯示,雙引號則顯示出變數的值。
3) test運算式
三、控制結構
1、if語句
例: #!/bin/bash
#if.sh
if [ "10" -lt "12" ] #注意:if和[之間,[和"10"之間,"12"和]都有空格,如果不加空格,會出現語法錯誤
then
echo "Yes,10 is less than 12"
fi
2、case語句
例: #!/bin/bash
#case.sh
echo -n "Enter a start or stop:"
read ANS
case $ANS in
start)
echo "You select start"
;;
stop)
echo "You select stop"
;;
*)
echo "`basename $0`: You select is not between start and stop" >&2
#注意:>和&2之間沒有空格,>&2 表示將顯示輸出到標準輸出(一般是螢幕)上
exit;
;;
esac
3、for迴圈語句
格式: for 變數名 in 列表
do
命令1
命令2
... ...
done
4、until迴圈語句
格式: until 條件
do
命令1
命令2
... ...
done
5、while迴圈語句
格式: while 命令
do
命令1
break
命令2
continue
命令3
... ...
done
四、輸入輸出
1、幾個重要的工具
1) echo
例:echo -n "Enter a number from 1 to 2:" (-n 表示不換行,此時游標停留在行尾)
2) read
例:read ANS (表示將使用者的輸入存放到變數ANS中)
3) cat (顯示檔案內容)
4) 管道( | ) (一個程式的輸出作為另一個程式的輸入)
例:ls -l | grep "d"
5) 檔案重新導向( >和>> )
例:ls -l > /tmp/a.txt (將輸出的結果重寫到a.txt這個檔案中)
ls -l >> /tmp/a.txt (將輸出的結果追加到a.txt這個檔案中,常用於記錄日誌)
6) 標準輸入( $0 )、標準輸出( $1 )和標準錯誤( $2 )
採用檔案描述符($0、$1、$2)來定義。
2、執行個體:readme.sh
#!/bin/bash
#readname.sh
echo -n "First Name: "
read firstname
echo -n "Last Name: "
read lastname subname
echo -e "Your First Name is :${firstname}/n " #加了-e表示將/n解析為逸出字元
echo -e "Your Last Name is :${lastname}/n "
echo -e "Your Subname is :${subname}/n "
echo "Your First Name is :${firstname}/n " >>firstname.txt #這行沒加-e,因此在輸出中會原樣顯示/n
echo "Your Last Name is :${lastname}/n " >lastname.txt
echo "Your Subname is :${subname}/n " >&1
五、文本過濾
1、Regex (就是模式比對)
2、find (尋找檔案)
例:find ./ -name "*.txt" -print
3、grep (尋找字元)
例:grep "[5-8][6-9][0-3]" access_log
4、awk (把一系列資料分域,即分成列)
例:awk '{print $1"/t"$4}' access_log
5、sed (對資料進行尋找和替換)
例:sed -n 's/chinaitlab/hello/p' myfile.txt (將myfile.txt檔案中的chinaitlab替換成hello,並列印到螢幕上來,s表示替換,p表示列印。如果加上重新導向符就可以將替換後的內容輸出到一個檔案中去。)
6、sort (排序)
例:sort ip.txt
7、uniq (顯示這一列是唯一的還是不唯一的,可以唯一化)
例:uniq ip.txt
8、split (可以對檔案進行分割)
例:split myfile.txt
9、執行個體:kill_process.sh
#!/bin/bash
#kill_process.sh
current_PID=$$
ps -aux|grep "/usr/sbin/sshd"|grep -v "grep"|awk '{print $2}'>/tmp/${current_PID}.txt
for pid in `cat /tmp/${current_PID}.txt`
do
{
echo "kill -9 $pid"
kill -9 $pid
}
done
rm -f /tmp/${current_PID}.txt
六、Shell函數
1、定義函數有兩種格式,分別為:
函數名()
{
命令1
... ...
}
function 函數名()
{
... ...
}
2、執行個體:func.sh
#!/bin/bash
#func.sh
# Source function library. # /etc/rc.d/init.d/functions中存放了大量已經寫好的函數
. /etc/rc.d/init.d/functions # 引入/etc/rc.d/init.d/functions中的函數,相當於其它語言中的include
function hello ()
{
echo "Hello,$1 today is `date`"
}
echo "now going to the function hello"
hello chinaitlab
echo "back from the function"