首页 > 代码库 > linux shell 编程

linux shell 编程

一、Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义:

可以通过脚本测试来区分这几个变量的具体作用和用法.

脚本如下:

# vim variable
#!/bin/sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
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脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过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 循环实例:

技术分享
[root@localhost 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
执行结果:
[root@localhost 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
执行后结果如下:
 [root@localhost ~]# 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 ]
[root@localhost ~]#
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

 

linux shell 编程