Shell的流控制循环和判断

条件测试

格式1:test  条件表达式  格式2:[  条件表达式  ] #注意空格

测试文件

测试文件 
#[ 操作符 文件或目录 ] ,注意中括号两边必须有空格
    -d:测试是否为目录,是则为真(Directory)
    -e:测试目录或文件是否存在,存在则为真(Exist)
    -f:测试是否为文件,是则为真(file)
    -r:测试当前用户是否有权限读取,是则为真(read)
    -w:测试当前用户是否有权限写入,是这为真(write)
    -x:测试当前用户是否可执行该文件,可执行则为真(Excute)
    -L:测试是否为符号链接文件,是则为真(Link)
    -nt:file1 -nt file2 如果 file1 比 file2 新(修改时间),则为真
    -ot:file1 -ot file2 如果 file1 比 file2 旧(修改时间),则为真

字符串比较

字符串比较
#[ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ] [ -z 字符串 ]
     =:字符串内容相同则为真,就是说包含的文本一摸一样。
    !=:字符串内容不同,则为真(!号表示相反的意思)
    -z:字符串内容为空(长度为零)则为真
    -n:字符串内容非空(长度非零)则为真
    <:string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真
    >:string2 如果string1在本地的字典序列中排在string2之后,则为真

#注意:
1、字符串的 “等于” 比较,为了与POSIX一致,在[]中使用=,(尽管==也可以可以用的)
2、注意在=前后各有一个空格,如果没有空格就是赋值的关系,不是比较的关系。
3、字符串的> <比较运算符,一般放在[[ ]]之中,而不是test ("[]")
4、字符串的> <比较的结果,与本地的locale有关,是按照其字典序列进行比较的

整数值比较

整数值比较
#[ 整数1 操作符 整数2 ]
    -eq:等于(equal)
    -ne:不等于(not equal)
    -gt:大于(Greater than)
    -lt:小于(lesser than)
    -le:小于等于(lesser or equal)
    -ge:大于等于(Greater or equal)

逻辑测试

逻辑测试
[ 表达式1 ] 操作符 [ 表达式2 ] ...

    -a 或 && :逻辑与,“而且”的意思,前后两个表达式都成立时整个测试结果才为真,否则为假
    -o 或 || : 逻辑或,“或者”的意思,操作符两边至少一个为真时,结果为真,否为为假
    ! :逻辑否,当制定条件不成立时,返回结果为真

if判断

下面三个个格式都可以
 

if condition1        #该条件表达式成立
then
    command1        #则执行此处代码
elif condition2     #该条件表达式成立
then 
    command2        #则执行此处代码
else                #上面表达式都没命中则
    commandN        #执行此处代码
fi

case 判断(支持正则)

case 值 in
模式1)        #是否成立此处条件,成立则执行该条件下面的代码(支持正则)
    command1
    command2
    ...
    commandN
    ;;
模式2)        #是否成立此处条件,成立则执行该条件下面的代码
    command1
    command2
    ...
    commandN
    ;;
*)            #若上面条件都不成立,则执行此处代码
    ;;
esac

for 循环

for var in item1 item2 ... itemN    #var会依次提取后面的值(默认为空格,如果内容包含空格加引号)
do
    command1
    command2
    ...
    commandN
done

---------------------------------------------------------------------------------------------
#目录循环
#!/bin/bash
for file in /var/log/*
do
   echo $(basename $file) in "/var/log"
done

#位置参数循环
#!/bin/bash
for seat in "$@"
do
    echo "$seat"
done

#使用seq产生循环
#!/bin/bash
for j in $(seq 1 5)
do
  echo $j
done

while循环

while condition    #条件成立,则循环,如果为true,则是死循环
do
    command
done
-------------------------------------------------------------
#!/bin/bash
#批量添加20个系统账户用户名依次为user1~10
i=1
while [ $i -le 10 ]
do
 useradd user$1
 echo "123456" | passwd --stdin user$i &> /dev/null
 i=`expr $i + 1`
done


until 循环(与while相反)

until condition    #条件表达式不成立则循环
do
    command
done

shift迁移 #用于位置变量迁移,$1~$9依次向左传递
 

依次相加
#!/bin/bash
res=0
while [ $# -gt 0 ]
do
 res=`expr $res + $1`
 shift
done
echo "the sum is:$res"
------------------------------
#这个应该好看懂点
#!/bin/bash 
for ((i=1;i<=${#};i=i))
do
 echo "剩余位置数量 $#  内容:$*"
 shift
done

shift.sh结果如下

continue #跳回当前循环

continue语句 #在for、while、until等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环。


while 条件  ←-←-←-←-←--
                      ↑
do                    |
                      ↑    #它会直接跳回当前循环,重新判断条件语句
command...            |
                      ↑
continue   →-→-→-→-→-→

command...

done
command...
command...

break #跳出当前循环

break语句 #在for、while、until等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句。


while 条件测试
do

command

break →-→-→-→-→-→---
                   |
command            ↓
                   |    #break直接跳出当前循环,往下执行
done               ↓
                   |
command  ←-←-←-←-←-←

command

#下面可以试试他们的区别

#可以试试continue和break的效果
#!/bin/bash
for((i=1;i<10;i++))
do
    for((j=1;j<=$i;j++))
        do
            echo -n " $i*$j=$((i*j)) "
            #echo -n " continue " 
            #continue
            #echo -n " break "
            #break
        done

#echo -n"continue"
#continue
#echo -n "break"
#break
    echo 
done

这三个赋值看起来都比较像”将换行符赋值给IFS“,但实际上只有最后一种写法才是我想要的结果。
IFS=‘\n’  //将字符n作为IFS的换行符。

IFS=$"\n" //这里\n确实通过$转化为了换行符,但仅当被解释时(或被执行时)才被转化为换行符。

IFS=$'\n' //这才是真正的换行符。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值