本随笔为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)) 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)) 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编程我还不远够熟悉,并且这不是合适的实现手段,所以就只能给出规则。
难度三:根据玩家的猜测情况,给出局部最优的答案,即每一次都给出剩余可能猜测数字最多的结果。
难度四:两方互换,由玩家做原本电脑的角色,而电脑给出一个数字较新而又可能正确的猜测。