linux bash 逻辑,linux基础--Bash逻辑控制语句

在逻辑控制语句中会使用各种运算符和测试判断,可参见

http://iyull.blog.51cto.com/4664834/1884528

declare声明变量

declare -i sum=0:声明sum为×××

declare -x sum=0:声明为环境变量,相当于export

linux随机生成随机数

/dev/random

/dev/urandom

使用方法:echo -n $RANDOM

生成10个随机数,并求出最大值和最小值

#/bin/bash

min=0

max=0

for i in {1..10};do

myran=$RANDOM

[ $i -eq 1 ] && min=$myran

if [ $i -le 9 ];then

echo -n "$myran,"

else

echo "$myran"

fi

if  [ $myran -gt $max ];then

max=$myran

fi

if [ $myran -lt $min ];then

min=$myran

fi

done

echo "max is $max"

echo "min is $min"

条件判断if

单分支if语句

if 判断条件;then

stat3ment1

stat3ment2

...

fi

双分支if语句

if 判断条件;then

stat3ment1

stat3ment2

...

else

stat3ment3

stat3ment4

...

fi

多分支/嵌套if语句

if 判断条件;then

stat3ment1

...

elif 判断条件;then

stat3ment2

...

elif 判断条件;then

stat3ment3

...

else

statement4

...

fi

注:if中判断命令结果和状态的说明

#不加反引号表明获取命令执行状态即$?

if ping 192.168.0.1 ;then

echo "192.168.0.1 is up"

fi

#加反引号表示获取命令执行结果,在下面if中没有实际意义。

if `ping 192.168.0.1`;then

...

fi

迭代循环for

用于已知循环次数迭代使用

语法:

for 变量 in 列表

do

循环体

done

列表生成方法:

1、{1..100}:1-100

2、seq 100:1-100

3、seq 2 2 100:起始数为2,步进为2,结束数为100

4、`ls /var`:通过命令替换生成列表

例:计算100以内所有能被3整除的数的和

#!/bin/bash

#

sum=0

for i in {1..100}

do

if [ $[$i%3] -eq 0 ];then

let sum=$[$sum+$i]

fi

done

echo "$sum"

多重分支case

case结构用于多种情况的条件判断。类似于其他编程语言中的switch/case语句,但从语法形式上讲,有很大的不同。

语法:

case 字符串 in

模式)

语句

;;

模式2|模式二  )

语句

;;

模式3)

语句

;;

esac

提示:esac就是case反过来写。

示例:

根据用户输入,归档压缩文件

6c1555302777729326ca3efa0910d9ec.png

while循环

语法:

while CONDITION

do

statement

...

done

注:满足CONDITTON开始循环,不满足退出循环

示例:计算100以内的正整数的和

#!/bin/bash

#

sum=0

i=1

while [ $i -le 100 ]

do

let sum+=$i

let i++

done

echo $sum

示例:每5秒钟检查一下user01是否登录,如果登录则退出

#!/bin/bash

#

user=`who |grep user01`

while [ -z "$user" ];do

echo "user01 not login"

user=`who |grep user01`

sleep 5

done

echo "user01 login"

示例:

显示下面菜单给用户

d|D) show disk usages

m|M) show memory usages

s|S) show swap usages

quit) quit script

当用户选择完成,显示相应信息后,不退出,让用户再选择一次,再次显示相应内容,除非用户使用quit

#!/bin/bash

#

echo "========d|D) show disk usages========"

echo "========m|M) show memory usages========"

echo "========s|S) show swap usages========"

echo "========quit) quit script========"

read -p "please input list:" list

while [ "$list" != 'quit' ];do

case $list in

d|D)

df -Ph

;;

m|M)

memuse=`free -m |grep "buffers/cache" |awk '{print $3}'`

echo "memory usage $memuse"

;;

s|S)

swapuse=`free -m |grep Swap |awk '{print $2}'`

echo "swap usages $swapuse"

;;

*)

echo "Usage:please input d|D,m|M,s|S,quit please input "quit""

;;

quit)

exit 0

;;

esac

read -p "please input list:" list

done

特殊用法一:

#死循环一

while :

do

statement

done

#死循环二

while true

do

statement

done

特殊用法二:

#从文件中读取内容并赋值给变量

while read LINE

do

statement

done 

#从/etc/passwd中逐行取出内容并赋值给LINE变量。

逻辑判断中特殊判断

break:提前退出循环

continue:提前结束本轮循环,进入下一轮循环,一般是循环内设置条件,根据条件判断是否continue

示例:计算100以内偶数的和,当和大于5000时不在计算。

while循环实现

#!/bin/bash

i=0

sum=0

while [ $i -lt 1000 ]; do

let i++

if [ $[$i%2] -eq 0 ]; then

let sum+=$i

echo $i

fi

if [ $sum -gt 5000 ]; then

break

fi

done

echo $sum

for循环实现

#!/bin/bash

#

sum=0

for ((i=0;i+=2;i<5000));do

let sum+=$i

if [ $sum -gt 5000 ];then

break

fi

echo $i

done

echo $sum

until循环

语法:

until CONDITION

do

statement

...

done

注:不满足CONDITION开始循环,满足结束循环

练习:通过ping测试10.82.10.0-10.82.10.10之间所有主机是否在线,在线则显示“ip up”,不在线则显示“ip down”。分别使用while、until、for(两种形式)实现。

#while循环

#!/bin/bash

#

i=0

up=0

down=0

while [ $i -le 10 ];do

ping -c 1 -W 1 10.82.10.$i >/dev/null

if [ $? -eq 0 ];then

echo -e "\033[32m10.82.10.$i is up\033[0m"

let up++

else

echo -e "\033[31m10.82.10.$i is down\033[0m"

let down++

fi

let i++

done

echo -e "\033[32m10.82.10.XXX up ip count $up\033[0m"

echo -e "\033[31m10.82.10.XXX down ip count $down\033[0m"

#until循环

#!/bin/bash

#

i=0

up=0

down=0

until [ $i -ge 10 ];do

ping -c 1 -W 1 10.82.10.$i >/dev/null

if [ $? -eq 0 ];then

echo -e "\033[32m10.82.10.$i is up\033[0m"

let up++

else

echo -e "\033[31m10.82.10.$i is down\033[0m"

let down++

fi

let i++

done

echo -e "\033[32m10.82.10.XXX up ip count $up\033[0m"

echo -e "\033[31m10.82.10.XXX down ip count $down\033[0m"

#for循环1

#!/bin/bash

#

up=0

down=0

for ((i=0;i<10;i++));do

ping -c 1 -W 1 10.82.10.$i >/dev/null

if [ $? -eq 0 ];then

echo -e "\033[32m10.82.10.$i is up\033[0m"

let up++

else

echo -e "\033[31m10.82.10.$i is down\033[0m"

let down++

fi

done

echo -e "\033[32m10.82.10.XXX up ip count $up\033[0m"

echo -e "\033[31m10.82.10.XXX down ip count $down\033[0m"

#for循环2

#!/bin/bash

#

up=0

down=0

for i in {1..10};do

ping -c 1 -W 1 10.82.10.$i >/dev/null

if [ $? -eq 0 ];then

echo -e "\033[32m10.82.10.$i is up\033[0m"

let up++

else

echo -e "\033[31m10.82.10.$i is down\033[0m"

let down++

fi

done

echo -e "\033[32m10.82.10.XXX up ip count $up\033[0m"

echo -e "\033[31m10.82.10.XXX down ip count $down\033[0m"

函数

结构化编程,不能独立运行,需要调用时执行,可被多次调用

定义函数的两种方式

#方式一

function FUNCNAME {

command

}

#方式二

FUNCNAME() {

command

}

1、引用函数执行结果并赋值

NAME=`FUNCNAME`

2、引用函数执行状态,此方式只能获取函数中最后一条命令的返回状态。因此不可作为信任条件。

FUNCNAME

echo $?

3、自定义函数执行状态

return #   定义函数返回状态值,需注意,函数中执行到retrun就会结束函数。

#示例,自定义函数返回状态值

#!/bin/bash

#

ADDUSER() {

USERNAME=liangstudy

if ! id =u $USERNAME &> /dev/null;then

useradd $USERNAME &> /dev/null

echo $USERNAME |passwd --stdin $USERNAME &> /dev/null

return 0

else

return 1

fi

}

ADDUSER

if [ $? -eq 0 ];then

echo "add user finished"

else

echo "add user failed"

fi

4、函数参数

#计算1-10之间相邻两个数字的和

#!/bin/bash

#

twosum() {

echo $[$1+$2]       #引用参数$1,$2

}

for i in {1..10};do

let j=$[$i+1]

echo "$i plus $j is `twosum $i $j`"       #将函数结果引用并处理

done

示例:使用函数ping 192.168.1.1-30之间所有ip。

#!/bin/bash

#

Fping() {

ping -c 1 -W 1 192.168.1.$1 &>/dev/null

if [ $? -eq 0 ];then

echo -e "\033[32m192.168.210.$1 is up\033[0m"

else

echo -e "\033[33m192.168.210.$1 is down\033[0m"

fi

}

for i in {1..30};do

Fping $i

done

示例:在主程序中,接收用户输入并传递给函数,判断用户是否存在,如果存在就返回UID和Shell,如果不存在,就提示并返回错误状态值,判断后不退出脚本,继续提示输入,输入q或者Q退出

#!/bin/bash

#

Fuser() {

id $1 &> /dev/null

if [ $? -eq 0 ];then

UserUid=`grep "$1" /etc/passwd |cut -d: -f3`

UserShell=`grep "$1" /etc/passwd |cut -d: -f7`

echo -e "\033[32muser $1 UID is $UserUid and Shell is $UserShell \033[0m"

return 0

else

echo -e "\033[31muser $1 is not exist \033[0m"

return 1

fi

}

read -p "please input user name:" UserName

until [ $UserName == q -o $UserName == Q ];do

case $UserName in

q|Q)

echo "quit..."

exit 5

;;

*)

Fuser $UserName

;;

esac

read -p "please input user name:" UserName

done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值