shell-11-12-13-14-15.for、case、while、util

bash shell编程的基本概念

  • 程序流程控制
  • 函数和过程
  • 深入文件重定向

1.程序流程控制

  • if 条件测试;then
  • 命令内容
  • elif 条件测试2;then
  • 语句
  • else
  • 命令内容
  • fi

条件测试的写法

  • 关键字[ [ ] ]表达式
    • 判断式放回0为真,非0为假
  • 内置命令test或[ ]
  • 内的逻辑表达式参数-a、-o
  • 命令间逻辑表达式符号&、||
    几个常用判断符号: -gt(大于)!(不等于,取反) -n(是否为空)

if条件测试

[root@master xiaosi]# if [ -n $a ];then echo ok; else echo fail;fi          
ok
[root@master xiaosi]# echo $a

[root@master xiaosi]# if [ ! 2 -gt 1 ];then echo ok; else echo fail;fi
fail

man test 出来的的用法说明

普通术语比较
              
       //!表示取反
       EXPRESSION1 **-a** EXPRESSION2
              both EXPRESSION1 and EXPRESSION2 are true
 //表达式1和表达式2为真
       EXPRESSION1 **-o** EXPRESSION2
              either EXPRESSION1 or EXPRESSION2 is true
//表达式1或达式2为真
       **-n** STRING
              the length of STRING is nonzero
//字符长度是否为0 
       STRING equivalent to -n STRING

       **-z** STRING
              the length of STRING is zero
//字符长度是否为0 
       STRING1 **=** STRING2
              the strings are equal
//字符长度是否相等
       STRING1 **!=** STRING2
              the strings are not equal
//字符长度是否不相等
       INTEGER1 **-eq** INTEGER2
              INTEGER1 is equal to INTEGER2
//字符长度是否相等
       INTEGER1 **-ge** INTEGER2
              INTEGER1 is greater than or equal to INTEGER2
//大于等于号
       INTEGER1 **-gt** INTEGER2
              INTEGER1 is greater than INTEGER2
//大于号
       INTEGER1 **-le** INTEGER2
              INTEGER1 is less than or equal to INTEGER2
//小于等于号
       INTEGER1 **-lt** INTEGER2
              INTEGER1 is less than INTEGER2
//小于号
       INTEGER1 **-ne** INTEGER2
              INTEGER1 is not equal to INTEGER2
//不等于号





两个文件比较判断:
       FILE1 **-ef** FILE2
              FILE1 and FILE2 have the same device and inode numbers
  //文件1比文件2有相同的设备和节点号
       FILE1 **-nt** FILE2
              FILE1 is newer (modification date) than FILE2
//两个文件比较新
       FILE1 **-ot** FILE2
              FILE1 is older than FILE2
//两个文件比较老
   单个文件判断:
       -b FILE
              FILE exists and is block special

       -c FILE
              FILE exists and is character special

       **-d** FILE
              FILE exists and is a directory
//  判断文件是否为目录
       **-e** FILE
              FILE exists
   //  判断文件是否为空
       -f FILE
              FILE exists and is a regular file
 //路径下是否有这个文件 如:[-f ./file]
       -g FILE
              FILE exists and is set-group-ID

       -G FILE
              FILE exists and is owned by the effective group ID

       -h FILE
              FILE exists and is a symbolic link (same as -L)

       -k FILE
              FILE exists and has its sticky bit set

       -L FILE
              FILE exists and is a symbolic link (same as -h)

       -O FILE
              FILE exists and is owned by the effective user ID

       -p FILE
              FILE exists and is a named pipe

       -r FILE
              FILE exists and read permission is granted
      //文件是否可读
       -s FILE
              FILE exists and has a size greater than zero
      
       -S FILE
              FILE exists and is a socket

       -t FD  file descriptor FD is opened on a terminal

       -u FILE
              FILE exists and its set-user-ID bit is set
  
       -w FILE
              FILE exists and write permission is granted
   //文件是否可写
       -x FILE
              FILE exists and execute (or search) permission is granted
           //文件是否可执行

例子:

[root@master xiaosi]# if [ ! 2 -gt 1 ] || [ 1 -eq 1 ];then echo ok; else echo fail;fi
ok
[root@master xiaosi]# if [ ! 2 -gt 1 ] &&  [ 1 -eq 1 ];then echo ok; else echo fail;fi    
fail
[root@master xiaosi]# if [ ! 2 -gt 1 -a 1 -eq 1 ];then echo ok; else echo fail;fi       
fail
[root@master xiaosi]# if [ ! 2 -gt 1 -o 1 -eq 1 ];then echo ok; else echo fail;fi 
ok
[root@master xiaosi]# ls
file  foo1.sh  foo2.sh  foo3.sh  foo4.sh  foo.out  foo.sh  if.sh  sh1.sh  xiaosi  xiaosi1
[root@master xiaosi]# if  [ -x ./foo3.sh ] ;then echo ok;else echo fail;fi
ok
[root@master xiaosi]# echo $?
0
[root@master xiaosi]# if [ 1 -eq $? ];then echo ok ;else echo fail;fi
fail
[root@master xiaosi]# if [ 0 -eq $? ];then echo ok ;else echo fail;fi 
ok

case语法

  • case 测试 in

  • 样式串行 命令区域1;;


  • -esac

  • 样式 = 字符串 + 通配符 (区分大小写)

  • 几行的话要隔开

  • 字符 | 有 " 或 ”的意思
    例子:

[root@master xiaosi]# vi case.sh
#!/bin/sh

read -p "Input A=" A
case $A in
        a | b )
                      echo "\$A = a | b ";;
        aa | bb | BB )
                     echo "\$A = aa | bb | BB"
                     echo "$A--end" ;;
            a* | b* | B* | A* )
                     echo "\$A = $A" ;;
          *)
                    echo 'imput *';;
esac
[root@master xiaosi]# bash case.sh 
Input A=a
$A = a | b 
[root@master xiaosi]# bash case.sh 
Input A=aa
$A = aa | bb | BB
aa--end
[root@master xiaosi]# bash case.sh 
Input A=a
$A = a | b 
[root@master xiaosi]# bash case.sh 
Input A=a8^H
$A = a8
[root@master xiaosi]# bash case.sh 
Input A=k
imput *

[root@master xiaosi]# vi case.sh   
#!/bin/sh

echo "\$A = $1"
A=$1
case $A in
        a | b )
                      echo "\$A = a | b ";;
        aa | bb | BB )
                     echo "\$A = aa | bb | BB"
                     echo "$A--end" ;;
            a* | b* | B* | A* )
                     echo "\$A = $A" ;;
          *)
                    echo 'imput *';;
esac
[root@master xiaosi]# bash case.sh
$A = 
imput *
[root@master xiaosi]# bash case.sh a
$A = a
$A = a | b 
[root@master xiaosi]# bash case.sh aa
$A = aa
$A = aa | bb | BB
aa--end
[root@master xiaosi]# bash case.sh b
$A = b
$A = a | b 

for循环:

步骤:

  • for 变量 in 内容
  • do
  • 命令
  • done
    例子:
    运用{1…10}遍历
[root@master xiaosi]# for a in {1..10};do echo $a;done  
1
2
3
4
5
6
7
8
9
10

运用seq 1 10

[root@master xiaosi]# for a in $(seq 1 10);do echo $a;done                          
1
2
3
4
5
6
7
8
9
10

类似c的循环方式((i= 0;i<$num ;i++))

[root@master xiaosi]# for (( i = 1 ;i < 10 ; i++ ));do echo $i;done  
1
2
3
4
5
6
7
8
9

用*删除文件问开头问a的文件:


[root@master xiaosi]# for i in a* ; do rm -rf $i;done

while控制流程:

  • whlie
  • do
  • 命令行
  • done
[root@master xiaosi]# while [ ! "$String" = "exit"  ] ; do echo $String ]; read -p "input String:" String ;done 
b ]
input String:a
a ]
input String:b
b ]
input String:c
c ]
input String:d
d ]
input String:exit
[root@master xiaosi]# while read line ; do echo $line ; done   
abc
abc
abf
abf
^C  #ctrl +c 退出
[root@master xiaosi]# 

从文件读取;

[root@master xiaosi]# while read line ; do echo "line=" $line;sleep 1 ; done < /etc/passwd 
line= root:x:0:0:root:/root:/bin/bash
line= bin:x:1:1:bin:/bin:/sbin/nologin
line= daemon:x:2:2:daemon:/sbin:/sbin/nologin
line= adm:x:3:4:adm:/var/adm:/sbin/nologin
line= lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
line= sync:x:5:0:sync:/sbin:/bin/sync
line= shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
^C
[root@master xiaosi]# 

util循环

与while条件不同的式,while测真值,until测假值。

  • until 条件
  • do
  • 命令内容
  • done

break 和continue(和C语言一眼用法)

[root@master xiaosi]# vi fooo.sh  
#!/bin/sh

for i in {0..10} ;do
     for j in {0..10};do
         for n in {0..10};do
                echo \$=$i \$=$j \$n=$n
                read -p "input a" a
                case $a in
                       1 ) break 1 ;;
                       2 ) break 2 ;;
                       * ) break : ;;
                  esac
             done
           echo $j............
         done
       echo $n .........
   done
~                                                                                                                  
~      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值