Linux运维学习历程-第十一天-bash逻辑运算、测试类型和脚本语句

概述:本篇重点介绍linux当中默认设立了类型,bash的逻辑运算、测试类型和脚本语句,本篇内容极其重要,望小伙伴们在日后的学习中用心学习

一、逻辑运算

变量:

  本地变量、环境变量、局部变量、位置参数变量、特殊变量

  变量赋值:name=value,export name=value,declare -x name=value

  变量引用:$name,${name}

  注意:有些时候{}不能省略,例如

       echo "$valuemagedu.com" 

       echo "${value}magedu.com"

   撤销:unset name

bash脚本编程,运行脚本

#!/bin/bash      #称为shebang是bash脚本的默认开头行固定格式

#             #   #号后面是注释信息,不显示也不影响脚本执行结果

空白行          忽略不显示行

bash的配置文件

porfile类:登录式shell

bashrc类:非登录式shell

登录式shell:/etc/profile–>/etc/profile.d/*.sh–>~/.bash_profile–>~/.bashrc–>/etc/bashrc

非登录式shell:~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh

    

算数运算

   +,-,*,/,**(乘次方),%(求模取余)

在bash中默认数据类型都是字符串形式,做算数运行需要经特殊方法才可以

示例:     

[root@localhost ~]# num1=2
[root@localhost ~]# num2=9
[root@localhost ~]# echo "${num1}+${num2}"
2+9
[root@localhost ~]# declare -i num3=5
[root@localhost ~]# declare -i num4=9
[root@localhost ~]# echo "${num3}+${num4}"
5+9

算术运算格式:

(1)let VAR=算数运算表达式

[root@localhost ~]# let ${num1}+${num2}

#默认不输出结果到屏幕,所以需要赋值给变量,再引用

[root@localhost ~]# let sum5=${num1}+${num2}
[root@localhost ~]# echo ${sum5}
11

let 参数 [参数 …]

   算术运算格式含义

    num++,num– (两个减号不是大横线)变量后递增,后递减

     ++num,–num(两个减号不是大横线)变量前递增,前递减

     +,-加法、 减法

     !,~ 逻辑和按位求反

     ** 求幂运算(乘次方)

     *,/,%  乘法,除法,求模(求余)           

     <<,>> 左和右移位

     <=,>=,<,> 比较

      ==、 != 平等,不平等

      & 按位与

     ^ 按位异或

     | 按位或

      && 逻辑与

      || 逻辑或

      expr ?expr: expr

条件运算符

       =, *=, /=, %=,+=, -=, <<=, >>=,&=,^=,|= 赋值

变量也可以作为let 命令的参数              

(2)VAR=$[算数运算表达式]   

但是不能直接运行,赋不赋值给变量都可以,需要命令直接引用,如echo

[root@localhost ~]# $[${num2}+${num3}]
bash: 14: 未找到命令...
[root@localhost ~]# echo "$[${num2}+${num3}]"
14

(3)VAR=$((算数运算表达式))  

但是不能直接运行,赋不赋值给变量都可以,需要命令直接引用,如echo

[root@localhost ~]# $((${num2}+${num3}))
bash: 14: 未找到命令...
[root@localhost ~]# echo $((${num2}+${num3}))
14

(4)expr EXPRESSION 或 VAR=$(expr EXPRESSION)

  expr OPTION

示例:

[root@localhost ~]# num1=2
[root@localhost ~]# num2=4
[root@localhost ~]# expr ${num1} + ${num2}
6
[root@localhost ~]# sum=$(expr ${num1} \* ${num2})
#注意乘法*符号需要转意(原因是*号在有些场景中为glob通配符)
[root@localhost ~]# echo "${sum}"
8

expr 参数的算术运算格式

                ARG1 | ARG2

                ARG1 是否为 null,也不是 0,否则为 ARG2

                ARG1 & ARG2

                ARG1 如果参数都不是 null 或 0,否则为 0

                ARG1 < ARG2

                ARG1 小于 ARG2

                ARG1 <= ARG2

                ARG1 小于或等于 ARG2

                ARG1 = ARG2

                ARG1 等于 ARG2

                ARG1 != ARG2

                ARG1 ARG2 不等于

                ARG1 >= ARG2

                ARG1 是大于或等于 ARG2

                ARG1 > ARG2

                ARG1 大于 ARG2

                ARG1 + ARG2

                ARG1 和 ARG2 的算术总和

                ARG1 -ARG2

                ARG1 减 ARG2 的算术差

                ARG1 * ARG2

                ARG1 和 ARG2 的算术积

                ARG1 / ARG2

                ARG1 除以 ARG2 的算术商

                ARG1 % ARG2

                ARG1 除以 ARG2 的算术余数

注意:算数运算格式内各参数彼此之间必须有空格,并且shell脚本不支持浮点型

增强型赋值:

       变量做某种算数运算后回存至此变量中;

            eg:  

               let i=$i+#

               let i+=#

            还有:+=,-=,*=,/=,%=

            自增:

                 VAR=$[$VAR+1]

                 let VAR+=1  

                 let VAR++

            自减:

                 VAR=$[$VAR-1]

                 let VAR-=1

                 let VAR–

         

二、条件测试:

     判断某需求是否满足,需要由测试机制来实现;

     如何编写测试表达式以实现所需的测试;

       (1)执行命令,并利用命令状态返回值来判断

          0:成功

          1-255:失败

       (2)测试表达式

           test EXPRESSION   eg:test 3 -gt 2

            [ EXPRESSION ]

            [[ EXPRESSION ]]

        注意:EXPRESSION两端必须有空白字符,否则有语法错误

bash的测试类型:

          数值测试:数值比较

                 -eq:是否等于;     eg:[ $num1 -eq $sum2 ]

                 -ne:是否不等于

                 -gt:是否大于

                 -ge:是否大于等于

                 -lt:是否小于

                 -le:是否小于等于

          字符串测试:

              ==:是否等于;(字符串)

一个=号也可以由于赋值变量用=号,但是赋值并不应用到[]中,所以能够使用,但是还是推荐使用双=号

              >:是否大于

              <:是否小于

             !=:是否不等于

             =~:左侧字符串时候能够被右侧的PATTERN所匹配;(模糊匹配而非精确匹配) 

示例:

[root@localhost ~]# [[ tom =~ tom ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ om ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ o ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ tom =~ x ]]
[root@localhost ~]# echo $?
1

-z "STRING":判断指定的字符串是否为空,空为真,不空为假

-n "STRING":判断指定的字符串是否为不空,不空为真,空为假  

注意:(1)字符串测试时:字符串要加引号,表示引用有变量命令"",没有变量命令使用''

    (2)作比较时,尽量使用[[]];

   (3) 但是在组合测试时,[[]]有时会有语法错误,所以可以使用[]

示例:

[root@localhost ~]# [ var1 == var1 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ var1 == Var1 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ var1 == ${Var2} ]
-bash: [: var1: 期待一元表达式
[root@localhost ~]# [ var1 == "${Var2}" ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ a > b]
-bash: [: 缺少 `]'
[root@localhost ~]# [ a > b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ a < b ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ "a" < "b" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ "a" > "b" ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ "a" > "b" ]]
[root@localhost ~]# echo $?
1

文件测试:

     存在性测试:

            -a FILE  少使用

            -e FILE 推荐使用

文件存在则为真,否则为假  

存在性及类型测试:

            -b FILE:是否存在并且为块设备文件;

            -c FILE:是否存在并且为字符设备文件;

            -d FILE:是否存在并且为目录文件;

            -f FILE:是否存在并且为普通文件;

            -h FILE 或 -L FILE:是否存在并且为符号链接文件;

            -p FILE:是否存在并且为管道文件;

            -S FILE:是否存在并且为套接字文件;

文件权限测试:

            -r FILE:是否存在并且对当前用户可读;

            -w FILE:是否存在并且对当前用户可写;

            -x FILE:是否存在并且对当前用户可执行;

特殊权限测试:

           -u FILE:是否存在并且拥有suid权限;

           -g FILE:是否存在并且拥有sgid权限;

           -k FILE:是否存在并且拥有sticky权限;

注意:对于脚本则是当前运行此脚本的用户

文件是否有内容:

          -s FILE:是否有内容;

时间戳测试:

       -N FILE:文件自从上一次读取操作后是否被修改过

从属关系测试:

       -O FILE:当前用户是否为文件的属主;

       -G FILE:当前用户是否属于文件的属组;

双目测试:

     FILE 1 -ef FILE2 :FILE1与FILE2是否指向同一个文件系统的相同inode的硬链接;

     FILE 1 -nt FILE2 :FILE1的最近一次更新时间是否新于FILE2的最近一次更新时间

     FILE 1 -ot FILE2 :FILE1的最近一次更新时间是否旧于FILE2的最近一次更新时间

组合测试条件:

       逻辑运算:

       第一种方式:

             COMMAND1 && COMMAND2

             COMMAND1 || COMMAND2

             ! COMMAND

            eg: [ -O FILE ] && [ -r FILE ]

       第二种方式:

            test EXPRESSION1 -a EXPRESSION2

            [ EXPRESSION1 -a EXPRESSION2 ]

            [[ EXPRESSION1 -a EXPRESSION2 ]]

类此还有

     EXPRESSION1 -o EXPRESSION2

     ! EXPRESSION

eg:[ -O FILE -a -r FILE ]

注意:模式匹配时,势必要激活正则表达式引擎,而使用正则表达式的测试判断,要比单一字符串测试判断要慢,所以尽量避免使用正则表达式进行查找比较和测试;

脚本的状态返回值:

           默认是脚本中执行的最后一条件命令的状态返回值

           自定义状态退出状态码:exit [n]:n为自己指定的状态码;

       注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束;

三、bash脚本语句

过程式编程语言的代码执行顺序:

           顺序执行:从左至右,从上至下,逐一运行

           选择执行:代码有一个分支:条件满足时才会执行

                 两个或以上的分支:只会执行其中一个满足条件的分支

           循环执行:

                 代码片段(循环体)要执行0、1或多次重复运行

选择执行:

     单分支的if语句

    if 测试条件;then 

      代码分支 

      条件为真则执行,为假则不执行

或者

    fi       

    if 测试条件      

     then      

        代码分支                                     

        条件为真则执行,为假则不执行                                        fi                            

双分支的if语句:

         if 测试条件;then

           条件为真时执行的分支

         else

           条件为假时执行的分支

         fi

多分支的if语句:

          if COMDITION1;then

            条件1为真分支

          elif COMDITION2;then

              条件2为真分支

          elif COMDITION3;then

             条件3为真分支

          …

          elif COMDITIONn;then

             条件n为真分支

          else

             所有条件均不满足时的分支

          fi

注意:即便多个条件可能同时都能满足,分支只会执行其中一个,首先测试为“真”;并且if语句可嵌套if等其他语句

case语句的语法格式:

    case $VARAIBLE in

    PATH1)

          分支

          ;;

    PATH2)

          分支

          ;;

    …

    *)

          分支

          ;;

    esac

    注意:双分号如果不加,则会前一个匹配执行后,下一个会接着匹配执行

          适用于一个变量,与多个可能取值比较

          支持glob风格的通配符:

                         *:任意长度的任意字符;

                         ?:任意单个字符

                         []:范围内任意个字符

                         a|b:a或b;

bash脚本编程之用户交互:

    脚本参数

       用户交互:通过键盘输入数据,从而完成变量赋值操作

           read [option]…[name…]

                  -p 'PROMPT'    提示注释信息

                  -t TIMEOUT     时间限制

       bash -n /path/to/some_script

               检测脚本中的语法错误

       bash -x /path/to/some_script

               调试执行

循环执行:将一段代码重复执行0、1或多次;

     进入条件:条件满足时才进入循环

     退出条件:每一个循环都应该有退出条件,以有机会退出循环

bash脚本:

     for循环

     while循环

     until循环

for循环:

       执行机制:依次将列表中的元素赋值给“变量名” ; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

   两种格式:

     (1)遍历列表

     (2)控制变量

    遍历列表

        for VARAIBLE in LIST;do

             循环体

        done

    进入条件:LIST列表有元素,即可进入循环

    退出条件:列表中的元素遍历完成

    LIST的生成方式:

         (1)直接给出;

         (2)整数列表

                  (a){start…end}

                  (b)seq [start [incremtal]] last

          (3)返回列表的命令:$(COMMAND),例如:ls  cat

         (4)glob通配符

         (5)变量引用;例如$@,$*

    格式示例:

    #!/bin/bash

    #

    for username in user1 user2 user3;do

        if id $username &>/dev/null;then

           echo "$username exists."

        else

           useradd $username && echo "Add user $username finished."

        fi

    done

    示例:求100以内的正整数之和

    #!/bin/bash

    #

    delcare -i sum=0

    for i in {1..100};do

        echo "\$sum is $sum,\$i is $i"

        sum=$[$sum+$i]

    done

    echo $sum

    示例:判断/var/logm目录下的每一个文件的内容类型

    #!/bin/bash

    #

    for filename in /var/log/*;do

    if [ -f $filename ];then

       echo "Common file."

    elif [ -L $filename ];then

       echo "Sysbolic link"

    elif [ -d $filename ];then

       echo "Directory."

    elif [ -b $filename ];then

       echo "block special file."

    elif [ -c $filename ];then

       echo "character special file."

    elif [ -S $filename ];then

       echo "Socket file."

    else

       echo "Unkown."

    fi

    done

while循环:

     while CONDITION;do

           循环体

           循环控制变量修正表达式

     done

     

     CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为“false”终止循环,因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地被修正

     进入条件:CONDITION测试为“真”

     退出条件:CONDITION测试为“假”

     示例:求100以内的正整数之和

     #!/bin/bash

     #

     declare -i sum=0

     declare -i i=1

     while [ $i -le 100 ];do

          sum=$[$sum+$i]

          let i++

     done

     echo $sum

1、编写脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之;显示添加的用户的id号等信息

#!/bin/bash
#写一个脚本/root/bin/createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存
在,就显示其存在,否则添加之;显示添加的用户的id 号等信息
[[ -z $1 ]] && echo "请输入一段字符串作为用户名"&& exit
if grep -E "^$1:" /etc/passwd &>/dev/null;then
     echo "s1:已经存在此用户"
     exit
else
     useradd $1
     id $1
     echo "用户已经帮您添加"
     exit
fi

2、编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息

#!/bin/bash
#提示用户输入yes或no, 并判断用户输入的是yes 还是no,或是其它信息
[[ -z $1 ]] && echo "请输入一段字符串" && exit
var=`echo "$1" | tr "[[:lower:]]" "[[:upper:]]"` 
if [[ ${var} =~ "YES" ]];then
     echo "用户输入的是$1"
elif [[ ${var} =~ "NO" ]];then
     echo "用户输入的是$1"
else
     echo "用户输入的是其它信息"
fi
unset var

3、编写脚本/root/bin/filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)

#!/bin/bash
if [[ $# -lt 1 ]]
then
    echo -e "Error: No argument.\n\tUsage: $0 FILENAME"
    exit 1
else
    if [[ ! -e $1 ]]
    then
        echo "$1: No such file or diretory"
    elif [[ -d $1 ]]
    then
        echo "$1 is a diretory"
    elif [[ -L $1 ]]
    then
        echo "$1 is a link file"
    elif [[ -f $1 ]]
    then
        echo "$1 is a common file"
    fi
fi

4、编写脚本/root/bin/checkint.sh,判断用户输入的参数是否为正整数

#!/bin/bash
read -p "请入一个数字:" num
[ -z "$num" ]&&echo "请输入一个数字"&&exit 1
NUM=$(echo $num |grep -Eo "\-?[[:digit:]]+")
if [ "$NUM" == "$num" ];then
         if [ "$NUM" -lt "0" ];then
                echo "您输入的是一个负整数!"
        elif [ "$NUM" -eq "0" ];then
                echo "您输入的是一个0!"
        else
                echo "恭喜,您输入的是一个正整数!"
        fi
else
        echo "您输入的不是一个整数,请重新运行脚本!"
fi

练习:用for实现
1、判断/var/目录下所有文件的类型

#!/bin/bash
cd $1 &> /dev/null
# diretory judge
if [[ $? = 0 ]]
then

    for i in `ls -A $1`
    do
        FileType=`ls -dl $DirName/$i | cut -c1`
        case $FileType in
            d)
                echo "$i is a diretory."
                ;;
            -)
                echo "$i is a common file."
                ;;
            l)
                echo "$i is a link file."
                ;;
            b)
                echo "$i is a block file."
                ;;
            c)
                echo "$i is a character file."
                ;;
            p)
                echo "$i is a pipe file."
                ;;
            s)
                echo "$i is a socket file."
                ;;
            *)
                echo "$i is other file"
                ;;
        esac
    done
else
    echo "$1 is not a diretory"
    exit 2
fi


unset DirName
unset FileType

2、 添加10个用户user1-user10,密码同用户名

#/bin/bash
if [[ $# -lt 1 ]]
then
    echo -e "Error: No option \n\t-d\tdelete user1-user10\n\t-a\tadd user1-user10 "
    exit 1
fi

for i in $(seq 10);do
    case $1 in 
        -d|--del)
            if id user$i &> /dev/null;then
                userdel -r user$i
                echo "user$i: Delete complete!"
            else
                echo "user$i: No such user!"
            fi
            ;;
        -a|--add)
            if id user$i &> /dev/null;then
                echo "user$i"| passwd --stdin "user$i" &> /dev/null
                echo -e  "user$i: Already existed!\nAnd authentication tokens updated successful!"
            else
                useradd user$i &> /dev/null
                echo "user$i"| passwd --stdin "user$i" &> /dev/null
                echo " user$i: Add complete!"
            fi
            ;;
        *)
            echo "Error:"
            echo -e "$0 : Unknow option!\nplease use '-a''--add' to add user or '-d''--dell'to delect user"
            exit 1
            ;;
    esac
done

3、 /etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的文件输出为文件加stop,以S开头的文件输出为文件名加start;
“ K34filename stop”
“S66filename start”

#!/bin/bash
for i in `ls /etc/rc.d/rc3.d`
do
    FileC1=`echo $i | cut -c1`
    case $FileC1 in
        K)
            echo -e "$i\tstop"
            ;;
        S)
            echo -e "$i\tstart"
            ;;
        *)
            echo "unkown file"
            ;;
    esac
done

4、编写脚本,提示输入正整数n的值,计算1+2+3+…n的总和

#!/bin/bash
#
    delcare -i sum=0
    for i in {1..$1};do
        echo "\$sum is $sum,\$i is $i"
        sum=$[$sum+$i]
    done
    echo $sum

5、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态

#!/bin/bash
# 写一个脚本,提示请输入网络地址,如 192.168.0.0 ,判断输入的网段中主机在线状态

# only for netmask 255.255.255.0
echo -n "Enter IP:"
read IP
#get IP segment
Segment=`echo $IP | cut -d. -f1-3 `.
#
if echo $IP | egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){2}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' &>/dev/null
then
    #test only  5 host
    for i in `seq 240 255`
    do
        if ping -c 1 -W 1 $Segment$i &> /dev/null
        then
            echo -e "$Segment$i\tonline"
        else
            echo -e "$Segment$i\toffline"
        fi
    done
else
    echo "$IP is invalid"
fi

6、 打印九九乘法表

#!/bin/bash
#
for i in {1..9};do
    for j in $(seq 1 $i);do
        echo -n -e "$j*$i=$[$j*$i]\t"
    done
        echo
done

用while实现
1、 编写脚本,求100以内所有正整数之和

#!/bin/bash
#
     declare -i sum=0
     declare -i i=1
     while [ $i -le 100 ];do
          sum=$[$sum+$i]
          let i++
     done
     echo $sum

2、 编写脚本,通过ping命令探测172.16.250.1-254范围内的所有主机的在线状态,统计在线主机和离线主机各多少。

#!/bin/bash
#
a="10.1.252."
i=0
j=0
k=0
while [ $i -le 255 ];do
	ping -c1 -W1 $a$i &> /dev/null
	if [ $? -eq 0 ];then
		echo "$a$i is active"
		
		let j++
	else
		echo "$a$i is inactive"
		let k++
	fi
	let i++
done
echo "the sum number of active users is $j"
echo "the sum number of inactive users is $k"

3、 编写脚本,打印九九乘法表

#!/bin/bash
#function: 9*9 tables
#author: xiaoshui
i=1
while [ $i -le 9 ];do
	j=1
	while [ $j -le $i ];do
		mul=$[$i*$j]
		echo -ne "$i*$j=$mul\t"
		j=$[$j+1]
	done
	echo 
	i=$[$i+1]
done

4、 编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大者和最小者

#!/bin/bash
#
i=10
a=$RANDOM
max=$a
min=$a
while [ $i -ge 1 ]
do
	[ $max -lt $a ] && max=$a
	[ $min -gt $a ] && min=$a
	echo "$a"
	a=$RANDOM
	let i--
done
echo "最大值$max"
echo "最小值$min"

5、编写脚本,实现打印国际象棋棋盘

#!/bin/bash
#
#
#
i=1

while [ $i -le 8 ];do
	j=1
	while [ $j -le 8 ];do
		sum=`expr $i + $j`
		z=`expr $sum % 2`
		[ $z -eq 0 ] && echo -ne "\033[41;1m  \033[0m"||echo -ne "\033[43;1m  \033[0m"
		let j++
	done
	echo
	let i++
done
#!/bin/bash
#
declare -i i=1
declare -i j=1
while [ $i -lt 9 ];do
	if [ $[$i%2] -eq 0 ] ;then
		 while [ $j -lt 9 ];do
                	if [ $[$j%2] -ne 0 ];then
                        	echo -en "\e[43;37m  \e[0m"
                	else
                        	echo -en "\e[45;37m  \e[0m"
                	fi
                	let j++
        	done
	else 
		while [ $j -lt 9 ];do
			if [ $[$j%2] -eq 0 ];then	
				echo -en "\e[43;37m  \e[0m"
			else 
				echo -en "\e[45;37m  \e[0m"
			fi
			let j++
		done
		fi
	declare -i j=1
	let i++
	echo ""
done	
unset i;unset j

1、每隔3秒钟到系统上获取已经登录的用户的信息;如果发现用户hacker登录,则将登录时间和主机记录于日志/var/log/login.log中,并提示该用户退出系统。

#!/bin/bash
#function: check hacker login and hint logout
until who |grep -q "^hacker\b" ;do
	sleep 3
done
who | grep "^hacker"|tr -s ' '|cut -d' ' -f3,5 >> /var/log/login.log
echo "you should logout system" | mail hacker
echo "reminded and login record in /var/log/login.log"	

2、随机生成10以内的数字,实现猜字游戏,提示比较大或小,相等则退出。

#!/bin/bash
suiji=$[$RANDOM%10+1]
read -p "请输入数字:" num
until [[ $suiji -eq $num ]]; do
	[ $shuru -lt $suiji ] && echo "小了,往大了猜" 
	[ $shuru -gt $suiji ] && echo "大了,往小了猜"
	read -p "请再次输入数字:" num
done
echo "恭喜你猜中了!!!"

1、写个脚本:

   *
  ****
 ********
************

1 4

1,3空格1个*

2,2空格2个*

3,1空格,3*

n行空格数=总行数-n

n行*数=2n-1

#!/bin/bash
#
#打印三角形
#获取终端宽度
termCols=`tput cols`

#根据终端宽度,判断出能够正常打印三角形的行数;
maxLineNum=`seq 1 2$termCols |wc -l`

echo -e "#当终端的宽度最多能够正常打印$maxLineNum行\n#请输入要打印的三角形行数"
read -p "#行数范围大于1小于等于$maxLineNum,请输入行数:" lineNeeds

[[ `tput cols` -ne $termCols ]] && echo "终端宽度已经被改变,请重新运行脚本" &&exit 1

[[ $lineNeeds =~ ^[[:digit:]]+$ && $lineNeeds -ge 2 && $lineNeeds -le $maxLineNum ]]

[[ $? -ne 0 ]] && echo "输入值不合法" && exit
for line in `seq 1 $lineNeeds`;do
    #打印当前行的空格
    for((kong=(lineNeeds-line);kong>0;kong--));do
             echo -n " "
    done
    #打印当前行的星号
    for((xing=1;xing<=(line*2-1);xing++));do
             echo -n "*"
    done
    echo
done

2、用until循环实现国际象棋棋盘

#!/bin/bash
#
#
#
i=1

until [ $i -gt 8 ];do
	j=1
	while [ $j -gt 8 ];do
		sum=`expr $i + $j`
		z=`expr $sum % 2`
		[ $z -eq 0 ] && echo -ne "\033[41;1m  \033[0m"||echo -ne "\033[43;1m  \033[0m"
		let j++
	done
	echo
	let i++
done

原创文章,作者:NameLess,如若转载,请注明出处:http://www.178linux.com/39029

(0)
NameLessNameLess
上一篇 2016-08-24 10:25
下一篇 2016-08-24 10:25

相关推荐

  • class 11 压缩软件(二)、shell编程(三)和软件包管理(一)

    一、压缩软件(二) tar tar [OPTION]… (1) 创建归档     tar -c -f / PATH/TO/SOMEFILE .tar FILE…     tar cf…

    Linux干货 2016-08-21
  • LINUX-echo命令

    echo命令:回显         语法:echo [-neE][字符串]     说明:echo会将输入的字符串送往标准输出。输出的字符串间         以空白字符隔开,并在最后加上换行号。   &nbs…

    Linux干货 2017-05-22
  • 文本编辑工具vim

                             vim +#: 打开文件直接处在#行 +/PATTERN:打开文件直接处在第一次匹配到行 vim + file :打开文件直接处在最后行 vim –b file :以二进制打开文件…

    Linux干货 2016-08-12
  • VIM使用总结

    VIM使用总结:     I,vim + [option] +filename 其中option为m时,文件以只读模式打开。                               &n…

    Linux干货 2017-06-05
  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-29
  • 在学习的过程中,我们应该如何获取帮助?

    正文 在学习的过程当中,我们总是遇到不会使用的问题,以各种姿势来获取帮助是一个运维人员的基本要求 在Linux系统中我们获取帮助主要有以下几种方式 1. 使用命令内建的选项来获取帮助 2. 使用man来查看命令使用手册 3. 使用info来查看命令的信息页 4. 查看软件自带的帮助文档 5. 查看软件官方的文档 6. 查看发行版本的文档 7. Google相…

    Linux干货 2016-03-04