Linux初学(四)

  本随笔为Linux实验四,主要内容为Shell脚本编程的基本内容。

一:Shell变量基本用法及常用符号使用

①:将主提示符改为用户的主目录名

②:将字符串 DOS file c:>\$student\*赋值给变量 x,并显示出来

③:在 shell 命令终端输入 likes=(cosmos galaxy moon); likes=mars,然后使用 echo 分别显示以下表达式的值,并结合结果,写出表达式的作用。

 

显示数组中全部的非空元素,其结果为一个词;显示数组中全部的非空元素,其结果按空格分为多个数组元素;显示数组元素的个数;显示数组元素个数;显示下标为0的字符的长度;显示下标为0的字符的长度  

④在shell命令终端输入name=Phoenix,然后使用echo显示表达式①,观察结果;然后输入命令unset name,再输入表达式①观察结果。结合两次结果,写出表达式的作用。① ${name:-hello}

给name一个默认值hello

⑤:

 

%%.*:删除第一个.及之后的内容

%.*:删除最后一个.及之后的内容

⑥:

#*/:删除第一个/及之前的内容

##*/:删除最后一个/及之前的内容

⑦:

 

二:shell脚本分析

①:

 

作用:将参数逆序输出

cmd="$cmd \$$count"    :   拼接出echo $? ,其中?为现有的参数数量

count=`expr $count - 1`  :   参数数量-1

eval $cmd  :   执行cmd,包含其历史值

每次运行时循环执行count次

运行. ex1.sh god bless u 时,while 循环体第 1 次被执行时,第 8 行执行后变量 cmd 的值为 'echo $3'

②:

 

who | grep "^$1"

显示用户名,用第一个参数匹配其开头

 line8—10行:向第一个参数所对应用户发送信息hello

③:

作用:将该目录下所有以.sh结尾的文件复制到添加了时间后缀的新文件中

④:

NL功能:读取,显示,行号自增

line14功能:等待从键盘上的输入,接收,然后显示,行号自增

line17-21功能:按照参数从前至后顺序,拼接显示其中的内容,行号也一直增长

三:shell脚本编写

①:

②:

③:

④:

⑤:

四:一段小代码

  上面最后那个例子从小学玩到大学,来给个稍微复杂一点的猜数字。(用shell写这个有点蠢,纯属娱乐,毫无价值)

  游戏分为4种难度,我用shell只能写出前两种,所以先谈前两种。游戏中,玩家选择猜测的范围和猜测数字的总个数,由一方(电脑)给出正确答案,而另一方(玩家)进行猜测,每次猜测后给出相应的提示,直到玩家完全猜对。下面给出前两种的代码。

#!/bin/bash

#简单模式,输入数字的总数,和要猜的个数,每次会给出详尽的提示

echo "欢迎来到简单模式"
echo "相信你已经了解了游戏规则,让我们开始吧"

read -p "请输入你要猜测的数字范围,为了让游戏合理有趣,请输入8——20之间的一个数: " totalnum

if [ $totalnum -lt 8 ]
then echo "数字太少过于简单,玩起来没意思"
elif [ $totalnum -gt 20 ]
then echo "20个数已经很难了,不信你去试试"
fi

read -p "请输入要猜测的个数,为了让游戏合理有趣,请输入"$(($totalnum / 4 ))"——"$(($totalnum / 2))"之间的数值: " guessnum

if [ $guessnum -lt $(($totalnum / 4 )) ]
then echo "数字太少过于简单,玩起来没意思"
elif [ $guessnum -gt $(($totalnum / 2)) ] 
then echo "相较于增加猜测的个数,增加总数字更加有趣"
fi

function rand()
{
    return $(($RANDOM%$2+$1))
}

for((i=1;i<=$guessnum;i++))
do
    rand 1 $totalnum
    answer[$i]=$?
    for((j=1;j<i;j++))
    do    
    if [ ${answer[i]} -eq ${answer[j]} ]
    then    
        ((i--)) 
        break
        fi
    done
done

function guess()
{
    for((i=1;i<=$guessnum;i++))
    do
    read -p ""$i"个数: " guessnum[$i]
    done
#!/bin/bash

#普通模式,输入总数,以及要猜的个数,给出并不详尽的提示

echo "欢迎来到普通模式"
echo "相信你已经了解了游戏规则,让我们开始吧"

read -p "请输入你要猜测的数字范围,为了让游戏合理有趣,请输入8——20之间的一个数: " totalnum

if [ $totalnum -lt 8 ]
then echo "数字太少过于简单,玩起来没意思"
elif [ $totalnum -gt 20 ]
then echo "20个数已经很难了,不信你去试试"
fi

read -p "请输入要猜测的个数,为了让游戏合理有趣,请输入"$(($totalnum / 4 ))"——"$(($totalnum / 2))"之间的数值: " guessnum

if [ $guessnum -lt $(($totalnum / 4 )) ]
then echo "数字太少过于简单,玩起来没意思"
elif [ $guessnum -gt $(($totalnum / 2)) ] 
then echo "相较于增加猜测的个数,增加总数字更加有趣"
fi

function rand()
{
    return $(($RANDOM%$2+$1))
}

for((i=1;i<=$guessnum;i++))
do
    rand 1 $totalnum
    answer[$i]=$?
    for((j=1;j<i;j++))
    do    
    if [ ${answer[i]} -eq ${answer[j]} ]
    then    
        ((i--)) 
        break
        fi
    done
done

function guess()
{
    for((i=1;i<=$guessnum;i++))
    do
    read -p ""$i"个数: " guessnum[$i]
    done
    flag=0 ; flag1=0
    for((i=1;i<=$guessnum;i++))
    do
    if [ ${guessnum[$i]} -eq ${answer[$i]} ]
    then
        ((flag1++))

    else
        for((j=1;j<=guessnum;j++))
        do
        if [ ${guessnum[$i]} -eq ${answer[$j]} ]
        then ((flag++))
        fi
        done
    fi
    done
    if [ $flag1 -eq $guessnum ]
    then echo "恭喜你猜对了所有数字"; return 1
    fi
    echo $flag1""$flag""$(($guessnum-$flag-$flag1))""
    return 0
}

for((;;))
do
    guess
    if [ $? -eq 1 ]
    then break
    fi
done

  这两个模式从实现上来讲没有任何难度,两者代码非常接近,但普通模式其实玩玩还行。难度三和难度四抽象层次太高,shell编程我还不远够熟悉,并且这不是合适的实现手段,所以就只能给出规则。

  难度三:根据玩家的猜测情况,给出局部最优的答案,即每一次都给出剩余可能猜测数字最多的结果。

  难度四:两方互换,由玩家做原本电脑的角色,而电脑给出一个数字较新而又可能正确的猜测。

 

posted @ 2018-06-06 10:02  Guqi  阅读(131)  评论(0编辑  收藏  举报