一、Linux中变量$#,[email protected],$0,$1,$2,$*,$$,$?的含义:
可以通过脚本测试来区分这几个变量的具体作用和用法.
脚本如下:
# vim variable #!/bin/sh echo "number:$#" echo "scname:$0" echo "first :$1" echo "second:$2" echo "argume:[email protected]" echo "show parm list:$*" echo "show process id:$$" echo "show precomm stat: $?" :wq
赋予脚本执行权限
# chmod +x variable
执行脚本
# ./variable aa bb number:2 scname:./variable first:aa second:bb argume:aa bb show parm list:aa bb show process id:24544 show precomm stat:0
通过显示结果可以看到:
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
[email protected] 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
############################################################################
二.linux shell 之read -p 用法
shell下的read命令的作用是从标准流中读取输入,并把读取的内容放到某个变量中。
#!/bin/bash echo -e "Please enter your test :" read TESTREAD echo $TESTREAD ########################################## 实例2 #!/bin/bash mum=$1 mum=${mum:-3} #变量替换##当$mum的值大于或等于3后,就执行else后面的. if [ $mum = "1" ];then echo "测试环境 ..." elif [ $mum = "2" ];then echo "生产环境" else echo "请输入1或2,或单击enter键…" fi echo -e "\033[35m --------- 你输入的是数字$mum!!!$in \033[39;49;0m" echo " press any key to continue " # 提示按任意键继续... read key
三、SHELL学习笔记之循环语句之for和while
循环语句:for while
1.)for循环语句是在知道循环次数时使用.
2.)while循环语句是在不知道循环次数时使用,使变量增加1的操作可以写成"let,i++"或expr变量1运算符变量
for循环结构:
for 变量名 in 取值列表 do 命令序列 done
while循环结构:
while 条件测试命令 do 命令序列 done
for 循环实例:
[[email protected] source]# more for.sh #!/bin/bash for((i=1;i<10;i++)) do echo $i done 或着(两种方式执行的结果是一样的)。 #!/bin/bash for i in `seq 10` do echo $i done 执行结果: [[email protected] source]# sh for.sh 1 2 3 4 5 6 7 8 9 例2:for循环之创建用户脚本: #!/bin/bash for i in {1...10} do useradd studet$i echo password | passwd --stdin studet$i done
for 循环实例
while循环实例:
while循环实例: #!/bin/sh echo "Please input the num:" read num sum=0 i=1 signal=0 while [[ $signal != 1 ]] do if [ $i -eq $num ] then let "signal=1" let "sum+=i" echo "1+2、、、+$num=$sum" else let "sum=sum+i" let "i++" fi done 实例2:while循环... #!/bin/bash checkdays=7 while [ $checkdays -ge 4 ] do rq=`date +%Y-%m-%d --date="$checkdays days ago"` [ -f /usr/local/tomcat7/logs/localhost.$rq.log ] && { tar zcf localhost.$rq.log.tar.gz localhost.$rq.log } let checkdays-=1 ####属于递减的循环... done 执行后结果如下: [[email protected] ~]# sh -x 000.sh + checkdays=7 + ‘[‘ 7 -ge 4 ‘]‘ ++ date +%Y-%m-%d ‘--date=7 days ago‘ + rq=2014-07-24 + ‘[‘ -f /usr/local/tomcat7/logs/localhost.2014-07-24.log ‘]‘ + let checkdays-=1 + ‘[‘ 6 -ge 4 ‘]‘ ++ date +%Y-%m-%d ‘--date=6 days ago‘ + rq=2014-07-25 + ‘[‘ -f /usr/local/tomcat7/logs/localhost.2014-07-25.log ‘]‘ + let checkdays-=1 + ‘[‘ 5 -ge 4 ‘]‘ ++ date +%Y-%m-%d ‘--date=5 days ago‘ + rq=2014-07-26 + ‘[‘ -f /usr/local/tomcat7/logs/localhost.2014-07-26.log ‘]‘ + let checkdays-=1 + ‘[‘ 4 -ge 4 ‘]‘ ++ date +%Y-%m-%d ‘--date=4 days ago‘ + rq=2014-07-27 + ‘[‘ -f /usr/local/tomcat7/logs/localhost.2014-07-27.log ‘]‘ + let checkdays-=1 + ‘[‘ 3 -ge 4 ‘]‘ [[email protected] ~]#
while循环实例
四、SHELL学习笔记之条件判断语句 if
条件判断语句:if
if 条件测试命令 then 命令序列1 else 命令序列2 fi
实例:
#!/bin/bash #install nginx-1.10.2 if [ ! -d /usr/local/src ];then echo "not dircetry!!" else echo "is this dirctroy" fi
2.多重条件判断语句:if/else
if [ 条件测试命令 ]; then 命令序列1 elif [ 条件测试命令 ]; then 命令序列2 elif [ 条件测试命令 ]; then 命令序列3 else 命令序列4 fi
实例:
#!/bin/bash system=`uname -s` if [ $system="linux" ];then echo "linux" elif [ $system="windows" ];then echo "windows" elif [ $system="solaris" ];then echo "solaris" else echo "what??" fi
语句判断系统是那种类型的操作系统
1.整数判断
-eq 等于,如:if [ "$a" -eq "$b" ] -ne 不等于,如:if [ "$a" -ne "$b" ] -gt 大于,如:if [ "$a" -gt "$b" ] -ge 大于等于,如:if [ "$a" -ge "$b" ] -lt 小于,如:if [ "$a" -lt "$b" ] -le 小于等于,如:if [ "$a" -le "$b" ] 大于(需要双括号),如:(("$a" > "$b")) >= 大于等于(需要双括号),如:(("$a" >= "$b")) 小数据比较可使用AWK
2. 文件的判断
-r file 用户可读为真 -w file 用户可写为真 -x file 用户可执行为真 -f file 文件为正规文件为真 -d file 文件为目录为真 -c file 文件为字符特殊文件为真 -b file 文件为块特殊文件为真 -s file 文件大小非0时为真 -t file 当文件描述符(默认为1)指定的设备为终端时为真 [ -f "somefile" ] :判断是否是一个文件 [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限 [ -n "$var" ] :判断$var变量是否有值 [ "$a" = "$b" ] :判断$a和$b是否相等
3.复杂逻辑判断
-a 与 -o 或 ! 非
4.字符串判断
str1 = str2 当两个串有相同内容、长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当串的长度为0时为真(空串) str1 当串str1为非空时为真
五、SHELL学习笔记之多分支语句-case
多分支语句:case 多分支if语句通常可以修改为case语句.
case $变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; *) 默认执行的命令序列 ;; esac
2. case语句结构特点如下:
case行尾必须为单词“in”,每一个模式必须以右括号“)”结束。
双分号“;;”表示命令序列结束。
匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。
最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后 的命令序列。
3.case语句实例:
1.)由用户从键盘输入一个字符,并判断该字符是否为字母、数字或者其他字符,并输出相应的提示信息。
#!/bin/bash read -p "press some key ,then press return :" KEY case $KEY in [a-z]|[A-Z]) echo "It‘s a letter." ;; [0-9]) echo "It‘s a digit." ;; *) echo "It‘s function keys、Spacebar or other ksys." esac
2.)许多的daemon都会附上一个管理用的Shell Script,Apache就附上apachectl。这些管理程式都是用shell script来写的,以下示一个管理inetd的shell script。
#!/bin/sh case $1 in start | begin | commence) /usr/sbin/inetd ;; stop | end | destroy) killall inetd ;; restart | again) killall -HUP inetd ;; *) echo "usage: inetpanel [start | begin | commence | stop | end | destory | restart | again]" ;; esac
例如利用case来写一个解压war包的脚本.
#more initjar.sh #!/bin/bash ############################# ############################# DDIR=~/sources PROJECT=$1 PWD=`pwd` DCONF=~/$PROJECT/WEB-INF/classes case $1 in fore) test ! -d ~/$PROJECT && mkdir ~/$PROJECT cd ~/$PROJECT && rm -rf ./* jar -xf $DDIR/$PROJECT.war cat $DCONF/server.properties.online >$DCONF/server.properties cat $DCONF/database.properties.online >$DCONF/database.properties cat $DCONF/merchantInfo.properties.online >$DCONF/merchantInfo.properties cat $DCONF/../web.xml.online >$DCONF/../web.xml ;; eten) test ! -d ~/$PROJECT && mkdir ~/$PROJECT cd ~/$PROJECT && rm -rf ./* jar -xf $DDIR/$PROJECT.war cat $DCONF/server.properties.online >$DCONF/server.properties cat $DCONF/database.properties.online >$DCONF/database.properties #cat $DCONF/merchantInfo.properties.online >$DCONF/merchantInfo.properties ;; pp-bms) test ! -d ~/$PROJECT && mkdir ~/$PROJECT cd ~/$PROJECT && rm -rf ./* jar -xf $DDIR/$PROJECT.war cat $DCONF/server.properties.online >$DCONF/server.properties cat $DCONF/database.properties.online >$DCONF/database.properties #cat $DCONF/merchantInfo.properties.online >$DCONF/merchantInfo.properties ;; *) echo $"Usage: $0 {fore|eten|pp-bms|passport|pp-web2|toloan|report|app}" RETVAL=2 ;; esac exit $RETVAL
利用case写的一个备份脚本.
#more backup.sh #!/bin/bash ############################## # discrition: backup project of tomcat by Manual # example: ~/bin/backup.sh fore # write by frank at 2014/03/11 ############################## BAK_DIR=/apps/product/backup ETEN_DIR=/apps/product/tomcat_eten/webapps/eten FORE_DIR=/apps/product/nginx/htdocs/p2ptomcat/fore BMS=/apps/product/tomcat_eten/webapps/pp-bms DAY_DIR=`date +%Y%m%d` TIME=`date +%Y%m%d%H%M` mkdir -p ${BAK_DIR}/${DAY_DIR} case $1 in eten) cd $BAK_DIR cp -a $ETEN_DIR $BAK_DIR tar -czf $1.$TIME.tgz $1 && rm -rf $1 mv $1.$TIME.tgz $DAY_DIR/ exit 0 ;; fore) cd $BAK_DIR cp -a $FORE_DIR $BAK_DIR tar -czf $1.$TIME.tgz $1 && rm -rf $1 mv $1.$TIME.tgz $DAY_DIR/ exit 0 ;; pp-bms) cd $BAK_DIR cp -a $BMS $BAK_DIR tar -czf $1.$TIME.tgz $1 && rm -rf $1 mv $1.$TIME.tgz $DAY_DIR/ exit 0 ;; *) echo "$0 {eten|fore|pp-bms}" exit 2 ;; esac
参考文档:http://blog.sina.com.cn/s/blog_af6bb6bc0102uwb9.html