1、一、Shell变量 主要有本地变量和环境变量。 1、本地变量 -- 在用户现有运行的脚本中使用 1) 定义本地变量 格式: variable-name=value 例子:[root@jike1 /root]# LOCALTEST="test" [root@jike1 /root]# echo $LOCALTEST (注意:echo $LOCALTEST 和 echo ${LOCALTEST}的效果是一样的)
2、 (在变量名前加$, 可以取得此变量的值,使用echo命令可以显示变量的值) 2) 显示本地变量 格式: set 例子:[root@chinaitlab root]# set 3) 清除本地变量 格式:unset variable-name 例如:[root@jike1 /root]# unset LOCALTEST 此时再执行echo $LOCALTEST将看不到变
3、量LOCALTEST的输出。 2、环境变量 -- 在所有的子进程中使用 1) 定义环境变量 格式: export variable-name=value (与本地变量的定义相比,多了一个export关键字) 例子:[root@chinaitlab /root]# export DOMAIN="" [root@ chinaitlab shell]# vi testenv.sh
4、 #!/bin/bash #表示用bash来解析脚本 #testenv.sh echo $DOMAIN [root@chinaitlab shell]# chmod +x testenv.sh [root@chinaitlab shell
5、]# ./testenv.sh 2) 显示环境变量 格式: env (本地变量的显示使用set,环境变量的显示使用env) 例子: [root@chinaitlab test]# env 3) 清除环境变量 格式:unset variable-name (用法与本地变量相同,都使用unset) 例子: [root@chinaitlab she
6、ll]# unset DOMAIN 此时再执行./testenv.sh将看不到变量DOMAIN的输出。 3、其它变量 1) 位置变量 $0,$1,$2,$3……$9 2) 只读变量 readonly variable 注意:只读变量不能被清除和改变其值,所以要谨慎使用。 3) 特殊变量 $#,$?,$$(表示当前进程的PID)…… 二、运算符和表达式
7、 1、运算符是对计算机发的指令,运算符类型有: 算术运算符(+、-、*、/) 按位运算符(~、<<、>>、&、|、^) 逻辑运算符(&&、||、 > 、= = 、<、! =) 赋值运算符(=、+=、-=、*=、/=、%=、&=、^=、|=、<<=、>>=) 2、表达式是运算符和运算对象的组合体。 1) $[]:可以接受不同基数的数字的表达式
8、 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) 字符表达
9、式:直接书写,采用单引号,双引号引起来。 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.) 单引号和双引号的区别在于:单引号是原样显示,双引号则显示出变量的值。
10、 3) test表达式 三、控制结构 1、if语句 例: #!/bin/bash #if.sh if [ "10" -lt "12" ] #注意:if和[之间,[和"10"之间,"12"和]都有空格,如果不加空格,会出现语法错误 then echo "Yes,10 is less than 12"
11、 fi 2、case语句 例: #!/bin/bash #case.sh echo -n "Enter a start or stop:" read ANS case $ANS in start) echo "You sele
12、ct start" ;; stop) echo "You select stop" ;; *) echo "`basename $0`: You select is not between start and stop" >&2
13、 #注意:>和&2之间没有空格,>&2 表示将显示输出到标准输出(一般是屏幕)上 exit; ;; esac 3、for循环语句 格式: for 变量名 in 列表 do 命令1 命令
14、2 ... ... done 4、until循环语句 格式: until 条件 do 命令1 命令2 ... ... done
15、 5、while循环语句 格式: while 命令 do 命令1 break 命令2 continue 命令3 ... ...
16、 done 四、输入输出 1、几个重要的工具 1) echo 例:echo -n "Enter a number from 1 to 2:" (-n 表示不换行,此时光标停留在行尾) 2) read 例:read ANS (表示将用户的输入存放到变量ANS中) 3) cat (显示文件内容) 4) 管
17、道( | ) (一个程序的输出作为另一个程序的输入) 例:ls -l | grep "d" 5) 文件重定向( >和>> ) 例:ls -l > /tmp/a.txt (将输出的结果重写到a.txt这个文件中) ls -l >> /tmp/a.txt (将输出的结果追加到a.txt这个文件中,常用于记录日志) 6) 标准输入( $0 )、标准输出( $1 )和标准错误( $2 )
18、 采用文件描述符($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 "You
19、r 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
20、 echo "Your Last Name is :${lastname}\n " >lastname.txt echo "Your Subname is :${subname}\n " >&1 五、文本过滤 1、正则表达式 (就是模式匹配) 2、find (查找文件) 例:find ./ -name "*.txt" -print 3、grep (查找字符) 例:grep "[5-8][6-9][0-3]"
21、 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 (排序)
22、 例:sort ip.txt 7、uniq (显示这一列是唯一的还是不唯一的,可以唯一化) 例:uniq ip.txt 8、split (可以对文件进行分割) 例:split myfile.txt 9、实例:kill_process.sh #!/bin/bash #kill_process.sh current_PID=$$
23、 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 }
24、 done rm -f /tmp/${current_PID}.txt 六、Shell函数 1、定义函数有两种格式,分别为: 函数名() { 命令1 ... ... } function 函数名() { ..
25、 ... } 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"






