linux shell 编程

一、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

时间: 2024-10-13 12:36:56

linux shell 编程的相关文章

Linux Shell编程之二选择结构

Shell编程学习之二 一.bash的条件测试 测试方法或者说测试书写: test EXPR [ EXPR ] [[ EXPR ]] 例如:测试变量 User_Name 的之是否为root test $User_Name="root" [ $User_Name == "root" ] [[ $User_Name == "root" ] 根据比较时操作数的类型,测试类型分为: 测试类型 运算符 运算符所代表的意义 示例 整形测试 -gt -lt -

Linux Shell 编程实战技巧

目前,越来越多的企业应用会部署在 Linux 系统上的,而 Linux Shell 脚本可以极大地帮助我们完成这些应用的运维任务.这使得 Linux Shell 开发技能成为开发人员的一项重要的.有竞争力的技能.本文就笔者的实际开发经验,以 Korn Shell 为例分享了脚本开发中的常见问题及相关技巧. 避免定时任务脚本的常见问题 很多脚本在实际使用的时候往往是以定时任务的方式运行,而非手工运行.但是实现同样功能的脚本在这两种运行方式下可能遇到的问题不尽相同. 以定时任务方式运行的脚本往往会遇

Linux Shell编程之五字符串的处理

shell编程之字符串处理 在 shell 中,由于是一种弱类型的语言,在没有事先申明变量类型的情况下,所有的变量都是字符串.所以对字符串的处理就显得相当重要了. 下面介绍常见的对字符串处理的操作. 一.字符串切片 ${string_var:offest:length},类似于数组元素的提取. # 这里的string_var是一个变量,offest 是字符串的开始偏移量,length是切去字符串的长度 var=dhcpd:x:177:177:DHCP server:/:/sbin/nologin

关于linux shell编程,alias rm=&#39;cp [email&#160;protected] ~/backup; rm [email&#160;protected]&#39;

书上的这个例子需要在ubuntu的低版本的系统才支持,现在基本上都不支持了,想实现也很简单自己写一个脚本先备份再删除. alias也只是做了一次替换alias rm='cp [email protected] ~/backup; rm [email protected]' rm text.txt被转换成了cp  [email protected] ~/backup; rm [email protected] text.txt即cp  ~/backup; rm  text.txt可以看到text.

京峰Linux Shell编程从入门到精通

课程介绍:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行. -------------------课程目录------------------- <Shell编程从入门到精通> ├1.linux下shell编程基础入门_(new).mp4├2.Shell编程之变量及LAMP导航菜单编写_(new).mp4├3.Shell编程之IF条件语句各种案例演练_(new).mp4├4.使用if条件语句编写MySQL备份脚本_(new).mp4

linux shell编程

1.什么是shell 2. 还是hello world程序 3. shell中的变量 3.1 系统变量 3.2 用户定义变量 3.2.1 用户定义变量规则 3.2.3 shell如何使用变量 3.2.3 全局变量 vs 局部变量 4. shell编程中的控制结构 4.1 条件判定 4.1.1 简单条件判定 4.1.2 组合判定 4.2  if - else 4.3 for 4.4 while 4.5 case 5. shell中的函数 5.1 函数声明和定义 5.2 函数调用 6. shell脚

Linux Shell编程入门

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne

“Linux Shell编程”视频学习笔记

一.Linux Shell基础编程 视频1 1.1.查看你系统shell信息 $ cat /etc/shell 命令可以获取Linux系统里面有多少种shell程序 $ echo $SHELL 命令可以查看当前你所使用的shell是哪一个 1.2.查看文件信息,ls $ ls -l 查看文件信息:文件类型.文件权限.文件硬链接数.文件所属用户.文件所属组.文件大小.文件最近修改时间.文件名 1.3.改变文件权限,chmod 只有root用户或者文件的所有者能改变文件的权限 例子:$ chmod

Linux Shell编程基础

在学习Linux BASH Shell编程的过程中,发现由于不经常用,所以很多东西很容易忘记,所以写篇文章来记录一下 ls   显示当前路径下的文件,常用的有 -l 显示长格式  -a 显示所有包括隐藏  -R 显示文件夹内的内容  -c 按照最后一次修改时间排序  -t 按照修改时间排序输出 echo 显示  -n 不换行 touch  创建一个文件,或者修改文件的访问时间和修改时间 touch -a file 只更改访问时间 -m之更改修改实际那 -t指定特定时间 cp  复制文件 -a 保

转:Linux Shell编程入门

http://www.cnblogs.com/suyang/archive/2008/05/18/1201990.html 从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一.