1.几个小问题
(1)将主提示符改为用户的主目录名
什么叫提示符:
提示符关系到系统的环境变量。如何查看环境变量,通过env查看
PS1是系统的主提示符
HOME下存取的是系统的主目录名
这里修改了主提示符发现下面的符号没以前清晰,但是因为之前没备份格式没法恢复,好在关掉SHELL再重启就回复正常,如果在程序内容前面加上export就会所有shell都改变。
(2)将字符串 DOS file c:>\$student\*赋值给变量 x,并显示出来
直接使用单引号,多个空格合并,但是如果使用双引号(\,$,’’)都不被作为普通字符对待
只有通过单引号先存下来,然后用双引号去引用,这样才不会合并空格
(3)在 shell 命令终端输入 likes=(cosmos galaxy moon); likes[6]=mars,然后使用 echo 分别显示以下表达式的值,并结合结果,写出表达式的作用。
1 ${likes[*]} 数组非空元素
2 ${likes[@]} 数组非空元素
3 ${#likes[*]} 数组非空元素个数
4 ${#likes[@]} 数组非空元素个数
5 ${#likes} 数组下标为0的数组元素的长度(起初误以为是数组的长度)
6 ${#likes[0]} 数组下标为0的数组元素的长度(起初误以为是数组的长度)
(4)
在 shell 命令终端输入 name=Phoenix,
然后使用 echo 显示表达式1,观察结果;然后输入命令 unset name,
再输入表达式1观察结果。结合两次结果,写出表达式的作用。
1 ${name:-hello}
变量1=${变量2:-字符串}的功能
如果变量2不为空,则变量1和变量2值相等,都选择变量2的值
如果变量2为空变量1则选择则默认的值,变量2保持不变
变量1=${变量2:=字符串}
如果变量2不为空则变量1和变量2值相等,都选择变量2的值
如果变量2为空变量1变量2都选择默认的值,
变量1=${变量2:+字符串}
如果变量2不为空则变量1取默认值,变量2的值不变,变量1与2不同
如果变量2为空变量1变量2都空,
(5)
在 shell 命令终端输入 name='/usr/share/doc/apg/php.tar.gz',然后使用 echo 分别显示表达式1和2的值,
观察结果。
修改 name 的值,让 name='/etc/apt/sources.list.d',再次使用 echo 分别显示表达式1和2的值,观察结果。
结合结果,写出表达式的作用。
1 ${name%%.*} name中除去最多后缀剩下的字符串
2 ${name%.*} name中除去最少后缀剩下的字符串
变量的引用补充:
${name##pattern} name去掉与pattern相同的部分,一个#表示最少的匹配,两个表示#最多的匹配,而且都是开头匹配与%的末尾匹配相反,这里面pattern支持通配符
${name%%pattren}一个%表示最少的匹配,两个表示%最多的匹配
(6)在 shell 命令终端输入 name=/usr/bin/X11,然后使用 echo 分别显示表达式1和2的值,观察结果。
修改 name 的值,让 name='/etc/apt/sources.list.d',再次使用 echo 分别显示表达式1和2的值,观察结果。
结合结果,写出表达式的作用。
1 ${name#*/} 去掉前缀这中情况就去掉一个/
2 ${name##*/} 也是去掉前缀这种情况只剩下X11
(7)已知某同学提交的博客文章页面地址 address 如下:
address='http://www.cnblogs.com/xyz/p/8569001.html'
通过字符串匹配,如何得到其博客主页地址:
homepage='http://www.cnblogs.com/xyz'
写出由变量 address 得到变量 homepage 的 shell 命令实现。
2. shell 脚本分析
(1)使用 vim/gedit 编写 shell 脚本文件 ex1.sh,其内容如下:(教材 P145 思考题 4.8)
两种方法查询代码,通过cat加选项的方式不会空行,直接nl会对空行不标号显示
在 shell 命令终端分 3 次运行该脚本,观察其运行结果。
1 第 1 次运行:. ex1.sh
2 第 2 次运行:. ex1.sh best wishes
3 第 3 次运行:. ex1.sh god bless u
结合 3 次运行结果,分析脚本代码,在实验报告中总结以下内容:
1 整个 shell 脚本的功能是什么? 将输入的字符串反向输出
2 第 8 行、第 9 行、第 11 行的功能是什么?
8 这里面\$用到了转义字符,表示对$不进行特殊操作与后面传上来的数字连在一起就是特殊变量
如$1 $2,该语句每运行一次就从后向前选择一个单词加在echo的后面,$1在这个步骤还没有 被转换
9 自减操作,执行一次循环次数减1
11 运行命令,因为前面\$的原因进行转义,这里纠正过来进行运行
3 每次运行时,脚本中的 while 循环分别执行几次?
2 3
4 运行. ex1.sh god bless u 时,while 循环体第 1 次被执行时,第 8 行执行后变量 cmd 的值为?
echo $3
预先设定的特殊变量
(2)使用 vim/gedit 编写 shell 脚本文件 ex2.sh,其内容如下:(教材 P145 4.10)
在命令终端输入. ex2.sh jsj,
(实际执行时,请将 jsj 替换为您电脑中的登录用户名)结合结果及帮助信息,
回答下列问题。
1 line6 中,who | grep “^$1”的功能? 根据输入的参数在用户的行首位置查找用户名称为
2 line8~10 功能? 即时文件定向,把shell程序的输入行重新定向到一个命令hello
(-----------本题存在问题没有hello这个结果,待解决-----------)
(3)使用 vim/gedit 编写 shell 脚本文件 ex3.sh,其内容如下:
#
在命令终端输入. ex3.sh,结合结果及帮助信息,回答下列问题。
1 截图显示运行结果。
2 该脚本的功能是?
生成备份文件,并在文件后面加上创建时间作为后缀
(4)使用 vim/gedit 编写 shell 脚本文件 ex4.sh,其内容如下:
在 shell 命令终端分 3 次运行该脚本,观察其运行结果。
1 第 1 次运行:. ex4.sh
2 第 2 次运行:. ex4.sh /etc/apt/sources.list
3 第 3 次运行:. ex4.sh /etc/apt/sources.list ex4.sh
最后一条在原有基础上增添了下面的内容
结合运行结果,分析 shell 脚本功能。回答:
1 line4-10 中函数 NL 的功能?
针对输入的内容在前面加上行号输出
2 line14 中,条件测试满足时,脚本执行的功能是?
从标准输入上接受参数,并一直循环运行下去
3 line17-line21,这部分脚本的功能是?
判断文件是否存在而且是否为普通文件,如果正确那么将标准输入重定向指定文件,执行完一个文件左移一次,直至参数全读取完
3. shell 脚本编写
此部分要求贴出实现相应要求的 shell 脚本程序,并截图显示脚本执行及结果
(1)第 4 章 思考题 4.9
#!/bin/bash
count=$#
for((i=2;i<=$count;i++))
do
eval cp \$$i $1
done
(2)第 4 章 思考题 4.11
#!/bin/bash
cd $1
shift
for f in $@
do cat $f
done
(3)第 4 章 思考题 4.12
#!/bin/bash
for file in `ls $PWD | grep "*.c"`
{
mv PWD/$file $1
}
ls -ls $1
(4)第 4 章 思考题 4.18
(提示:利用 cut 命令及相应选项,考虑位置参数使用)
#!/bin/bash
read str;
expr substr "$str" $1 $(($2-$1+1))
(5)猜数字游戏
具体要求如下:
1 写一个函数 random0_100 生成 0~100 之间的随机数
2 用户从键盘输入竞猜数字,如果猜错了,提示用户所猜数字偏大或偏小,用户继续猜,直至猜对为止。
(提示:shell 内部系统变量 RANDOM 生成 0~32767 之间的整数随机数)
#!/bin/bash
function rand()
{
return $(($RANDOM%$2+$1))
}
rand 1 100
answer=$?
function guess()
{
read -p "input a num" guessnum
if [ $guessnum -eq $answer ]
then echo "right"
return 1
elif [ $guessnum -gt $answer ]
then echo "big"
return 0
elif [ $guessnum -lt $answer ]
then echo "small"
return 0
fi
}
for((;;))
do
guess
if [ $? -eq 1 ]
then break
fi
done