第 三 十 一 天:shell 脚本 (三)

小Q :你可以从别人那里得到思想,你的思想方法,即熔铸思想的模子必须是

你自己的。                                   ----拉姆

就像我以前说的,因为有c等编程语言作基础,学起shell来感觉会很轻松,我都不知道要

怎么记笔记了,感觉还是那些知识,记得太详细的话,知识点太多,不过太零散,就大致

记了一下;

就像我们老师说的:关于编程,我不要求你什么语句都懂,我给你要求,你只要给我画出他

的流程图就行。是啊,其实编程为什么注重多看多写,就是要你遇到问题可以在你脑中搜

索你以前的模板,别的格式什么的都好说。

一:逻辑判断if/case

二:循环语句while/for

三:控制循环语句的指令

四:函数

五:数组

=========================================================================

一:逻辑判断if/case

if的三种结构:
1.if  【表达式】         2.if   【表达式】     3.if  【表达式】
  then                     then                  then 
       command                   command              command
  fi                       else                  elif【表达式】
                                 command         then
                           fi                         command
                                                 elif
                                                    ····
                                                 else  
                                                       command
                                                 fi

表达式:

【 -s file  】    如果文件存在且非空

【 -f/d  名字 】    如果文件/目录存在

【 -r/w/x  file  】    如果文件存在且可读/可写/可执行

【 $string1 !=  $string2 】   如果string1不等于string2

【 -n $string  】             如果string 非空(非0),返回0(true)

【 -z $string  】             如果string 为空

【 int1 -eq int2 】    如果int1等于int2     (不允许用=<>号)

-gt 大于  -lt 小于  -ne 不等于  -le 小于等于  -ge 大于等于

组合:

如果存在/tmp/目录并且(或者)当前目录下存在1.txt文件,则为真,输出0

【-d /tmp/】&&【-f 1.txt】  ==  【-d /tmp/-d /tmp/ -a  -f 1.txt】

【-d /tmp/】||【-f 1.txt】  ==  【-d /tmp/-d /tmp/ -o  -f 1.txt】


举例:

#!/bin/bash
##成绩脚本,90-100为优秀,70-80为一般,其他不及格
##name and  time
read -p "请输入你的成绩" chengji
if [ $chengji -ge 90 ] && [ $chengji -le 100 ]
then
  echo "你的成绩很优秀"
elif [ $chengji -ge 70 ] && [ $chengji -lt 90 ]
then
   echo "你的成绩一般"
else
   echo"你的成绩不级合格"
fi

当有多个判断条件时,使用if显得太繁琐了,而使用和他功能类似的case,就显得简单清晰多了;

#格式:
变量=赋值
case $变量名  in               in:在那个模式下
     条件1)                   判断条件
            command1 
      ;;                        ;; :结束符               
     条件2)
            command2
      ;; 
         *)                    * :除了模式12的其他所有模式 
           默认执行的命令序列    
      ;; 
 esac                           case结束标志

#举例:

 #!/bin/sh 
 ## 判断使用的那种系统
 ## name and  time
 SYSTEM=`uname -s` 
 case $SYSTEM in 
     Linux) 
         echo "My system is Linux" 
         echo "Do Linux stuff here..." 
     ;; 
     FreeBSD) 
         echo "My system is FreeBSD" 
         echo "Do FreeBSD stuff here..." 
     ;; 
     *) 
         echo "Unknown system : $SYSTEM" 
         echo "I don‘t what to do..." 
     ;; 
 esac

===========================================================================================

二:循环语句while/for

while一般用得比较少,常用死循环写监控脚本,格式如下:
#!/bin/bash                   #!/bin/bash
##备注说明                     ##count sum from 0-100 
                               i=0 ;sum=0
while  [表达式]                while  [ i -le 100 ]
do                             do
   command                         sum=$[$sum+$i]    
   .......                         echo  $sum
done                               i=$[$i+1]
                               done

应用举例:http://lovelace.blog.51cto.com/1028430/1211927

$ seq 1000       起始默认是 1,间隔默认也是1

$ seq 2 1000     间隔默认是1

$ seq 1 3 10     从1到10,间隔为3,结果是:1 4 7 10

#格式
#!/bin/bash                #命令行下的for语句
##remarks                  #工作中分发的脚本,IP为对象单位
                             
for .. in 条件           
do                               
   command                     
   .......                                 
done

举例应用:

#法一                               #法二
#!/bin/bash                         #!/bin/bash
for i in `seq 1 1000000`            for((i=1;i<10000000;i++));do
do                                  
   echo $i                              echo $i
done                                done                            
     
#法三                               #法四命令行下
#!/bin/bash                        
i=1                                 for i in ‘seq 1 10000‘;do
while(($i<10000000))                echo $i ;done
do
   echo $i
   i=`expr $i + 1`                 ##注:for输出以空格为分隔符
done

扩展:http://www.linuxdiyf.com/viewarticle.php?id=206569

==========================================================================================

三:控制循环语句的指令

continue:结束本次循环

break : 结束整个shell模块循环

exit:  结束整个脚本,退出不再执行

#举例说明:
#!/bin/bash
for i in ‘seq 1 4‘          当为break时   continue    exit
do                      输出:1             1          1 
  echo $i                     1             1          1
  if [ $i -eq 2 ]             2             2          2
  then                        here          3
     break                                  3
  fi                                        4
  echo $i                                   4
done                                        here                   
echo “here”

扩展:http://lovelace.blog.51cto.com/1028430/1211373

===========================================================================================

四:函数

#格式:                       #!/bin/bash
#!/bin/bash                   ##make add funcation,sum two number
                              funcation add () {
函数名()                         local  sum=$[$1+$2]
{                                       echo $sum
    函数体                     }
}                              a=1;b=3 ; add $a $b      
                               echo $add 
                                                  输出  >>   4   去掉local:4
funcation可不加     local表示不允许模块外使用函数                           4

七种用法:http://www.jb51.net/article/57951.htm

扩展一下:http://blog.chinaunix.net/uid-1924596-id-3048863.htm  l

==========================================================================================

五:数组

数组赋值:

(1) array=(var1 var2 var3 ... varN)

(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)

(3) array[0]=var1

...

array[n]=varN

赋值 a=(0 1 2 3 4)

输出 echo ${a[*]}    >>>   0 1 2 3 4   把*换成@也可以

echo ${a[1]}    >>>   1           指定输出

echo ${#a[@]}   >>>   5           输出元素个数

更改 a[3]=8;echo ${a[*]}  >>>   0 1 2 8 4

增加 a[5]=3;echo ${a[@]}  >>>   0 1 2 8 4 3

删除数组 unset a;echo ${a[*]}       >>>   无输出

除元素 unset a[2];echo ${a[@]}    >>>   0 1 8 4 3

当然我们也可以以字符串做数组;

例题:
#!/bin/bash
#读入n次字符串,每次输入的字符串保存在数组array里
i=0
n=5
while [ "$i" -lt $n ] ; do
  echo "Please input strings ... `expr $i + 1`"
  read array[$i]
  b=${array[$i]}
  echo "$b"
  i=`expr $i + 1`
done

#!/bin/bash
#将字符串里的字母逐个放入数组,并输出到“标准输出”
chars=‘abcdefghijklmnopqrstuvwxyz‘
for (( i=0; i<26; i++ )) ; do
    array[$i]=${chars:$i:1}
    echo ${array[$i]}
done

其中用到截取字符串的知识,见下:

http://beibing.blog.51cto.com/10693373/1703222

http://bbs.chinaunix.net/thread-1779167-1-1.html

时间: 2024-10-19 23:29:36

第 三 十 一 天:shell 脚本 (三)的相关文章

第十二章 Shell脚本编写及常见面试题(三)

本章目录: 12.21 FTP下载文件 #!/bin/bash if [ $# -ne 1 ]; then     echo "Usage: $0 filename" fi dir=$(dirname $1) file=$(basename $1) ftp -n -v << EOF   # -n 自动登录 open 192.168.1.10 user admin adminpass binary   # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式

第十二章 Shell脚本编写及常见面试题(一)

注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规则:变量名大写.局部变量小写,函数名小写,名字体现出实际作用. 4)默认变量是全局的,在函数中变量local指定为局部变量,避免污染其他作用域. 5)有两个命令能帮助我调试脚本:set -e 遇到执行非0时退出脚本,set-x 打印执行过程. 6)写脚本一定先测试再到生产上. 12.1 获取随机字符串或数字 获取随机8位字符串: 方法1: # echo $RANDOM |md5sum |

Linux 笔记 - 第十二章 Shell 脚本

博客地址:http://www.moonxy.com 一.前言 常见的编程语言分为两类:一类是编译型语言,如:C.C++ 和 Java等,它们远行前要经过编译器的编译.另一类是解释型语言,不需要编译,执行时,需要使用解释器一行一行地解释执行,如:awk.perl.python 和 shell 等. Shell 是一种脚本语言,属于上面提到的第二类语言,就必须有对应的解释器来执行这些脚本,最常见的脚本解释器是:bash. 在编写 Shell 脚本时,我们不仅会用到很多的 Linux 命令.正则表达

六十八、shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断

一.shell脚本中的逻辑判断 格式1:if 条件 ; then 语句; fi 格式2:if 条件; then 语句; else 语句; fi 格式3:if -; then - ;elif -; then -; else -; fi if:如果. then:然后. -gt:大于. -lt:小于. -eq:等于. -ne:不等于.noeq. -ge:大于等于. -le:小于等于. 格式1:如果满足条件a大于3,则输出ok.最常用. # if [ $a -gt 3 ]; then echo ok;

第十二章 Shell脚本编写及常见面试题(二)

本章目录: 12.11 屏蔽网站访问频繁的IP 1)屏蔽每分钟访问超过200的IP 方法1:以Nginx日志作为测试 DATE=$(date +%d/%b/%Y:%H:%M) ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)print i}') #先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量.awk不能直接过滤日志,因为包含特殊字符. for IP

Shell脚本(三)重定向

先上一张图: 代码如下: #!/bin/bash echo "hello world" echo `ls +` 直接运行,终端输出两行文字:

Linux学习总结(五十八)shell脚本2-逻辑判断if

1 三种基本if语句 格式1:if 条件 ; then 语句; fi #!/bin/bash a=5 if [ $a -gt 2 ]; then echo $a fi 执行结果为 5格式2:if 条件; then 语句; else 语句; fi #!/bin/bash a=5 if [ $a -gt 10 ];then echo $a else echo 0 fi 执行结果为 0格式3:if -; then - ;elif -; then -; else -; fi #!/bin/bash a=

linux学习笔记-第十二课-Shell脚本之正则表达式(一)

一.grep,egrep,fgrep 1)grep 格式:grep [选项] [模式] [文件名] 常用选项:-n:显示行号和匹配的行 -v:反向匹配 -c:不显示匹配的行,只显示匹配的行数 -i:忽略大小写 -r:递归搜索 -E:支持扩展正则表达式 -P:支持Perl正则表达式 -F:不支持正则表达式,将模式按字面意义匹配 示例: grep示例 说明 grep '\<Tom>\' file 显示包含单词Tom的行 grep 'Tom Jerry' file 显示包含'Tom Jerry'的行

Linux学习总结(五十九)shell 脚本3-for while 循环

1 for 循环 语法: for 变量名 in 条件:do ...: done举例1 #!/bin/bash sum=0 for i in `seq 1 100`;do sum=$[$sum+$i] done echo $sum 举例2找到/123 目录下所有后缀名为.txt的文件批量修改.txt 为.txt.bak分析:可以有两种办法,一种是find结合xarge命令,另一种为循环.方法一: #!/bin/bash find /123/ -type f -name "*.txt" |

Python学习日记(三十五) Mysql数据库篇 三

使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名完成创建,再添加数据: 使用外键将两表产生联系 再创建一个department表 添加数据: 创建外键,右键userinfo设计表创建外键: 写入SQL语句 点击查询->新建查询 转储SQL文件 将SQL文件进行备份 保存数据和结构 保存结构 使用终端进行转储 保存数据和结构(备份) 保存结构(备份