可以通过脚本测试来区分这几个变量的具体作用和用法.
脚本如下:
# 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
通过显示结果可以看到:
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                           
循环语句: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
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 ~]#
条件判断语句: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为非空时为真
多分支语句: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
原文:http://www.cnblogs.com/saneri/p/6692884.html