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