二.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/bashfor((i=1;i<10;i++))doecho $i
done
或着(两种方式执行的结果是一样的)。
#!/bin/bashfor i in `seq 10`doecho $i
done
执行结果:
[[email protected] source]# shfor.sh1
2
3
4
5
6
7
8
9例2:for循环之创建用户脚本:
#!/bin/bashfor i in {1...10}douseradd studet$i
echo password| passwd --stdin studet$i
done
for 循环实例
while循环实例:
while循环实例:
#!/bin/sh
echo"Please input the num:"read num
sum=0i=1signal=0
while [[ $signal != 1]]do
if [ $i -eq $num ]
then
let"signal=1"let"sum+=i"echo"1+2、、、+$num=$sum"
elselet"sum=sum+i"let"i++"fi
done
实例2:while循环...
#!/bin/bash
checkdays=7
while [ $checkdays -ge 4]dorq=`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 ‘]‘
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"
elseecho"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