思考题4

4.1 常用的 shell有哪几种? Linux系统中默认的shell是什么?

答:
linux几种常见的Shell:sh、bash、csh、tcsh、ash
Linux下默认的Shell是Bourne Again Shell(bash)

4.2 简述shell的主要功能。bash有什么特点?

答:Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口
它接收用户输入的命令并把它送入内核去执行
引用、
多命令执行、
命令行展开:~ {}、
命令的执行状态结果、
多命令执、
命令补全:$PATH、
路径补全:TAB、
命令hash缓存表、
命令别名:alias, unalias
命令历史:history、
文件名通配符:glob、
变量、
bash快捷键。

4.3 执行shell脚本的方式是哪些?

答:
1、输入定向到shell脚本。
该方式用输入重定向方式让shell从给定文件中读入命令行,并进行相应处理。其一般形式是:
$bash<脚本名例如:
$ bash <ex1
2、以脚本名作为bash参数。其一般形式是:
$bash脚本名 [参数]
3、将shell脚本的权限设置为可执行,然后在提示符下直接进行。

4.4 将主提示符改为用户的主目录名,并予以输出。

答:export PS1= $HOME 
echo $HOME

4.5 说明三种引号的作用有什么区别。

答:Linux Shell中有三种引号,分别为双引号(" ")、单引号(' ')以及反引号(` `)。
双引号(" "):在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身。
单引号(' '):在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。
反引号(` `):在反引号中的字符串将解释成shell命令来执行。

4.6 利用变量赋值方式,将字符串DOS file c:>$student*显示出来。

答:$ i=DOS
$ j=file
$ k=”c:>\$student\*”

4.7 显示环境变量的设置情况,说明各自的意义。

答:
只对当前的shell 起作用的环境变量
1、控制台中设置,不赞成这种方式,因为他只对当前的shell 起作用,换一个shell设置就无效了:
直接控制台中输入 : $PATH="$PATH":/NEW_PATH (关闭shell Path会还原为原来的path)
对所有的用户的都起作用的环境变量
2、修改 /etc/profile 文件,如果你的计算机仅仅作为开发使用时推存使用这种方法,因为所有用户的shell都有权使用这个环境变量,可能会给系统带来安全性问题。这里是针对所有的用户的,所有的shell
vi /etc/profile
在/etc/profile的最下面添加: export PATH="$PATH:/NEW_PATH"
针对当前特定的用户起作用的环境变量
3、修改bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别,这里是针对某一特定的用户,如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的 .bashrc文件就可以了。
vi ~/.bashrc
在下面添加:Export PATH="$PATH:/NEW_PATH"。

4.8 分析下列shell脚本的功能:
count=KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ cmd=echo while…count -gt 0]
do
cmd= "$cmd $$count ”
count=‘expr $count-1’
done
eval $cmd

答:count=$# # 获取脚本参数个数
cmd=echo # 初始化 cmd 变量,赋值为 “echo”
while [ $count -gt 0] # 如果 count 大于0,执行下面的循环
do
cmd="$cmd \$$count" # 给cmd重新赋值,变为 “echo ${count的值}”
count='expr $count-1' # count减1
done # 之后回到上面的 while 判断
eval $cmd # 执行cmd命令。
类似于执行堆栈操作。

4.9 编写一个shell脚本,它把第二个位置参数及其以后的各个参数指定的文件复制到第一个位置参数指定的目录中。

答:#!/bin/bash //调用bash程序对其解释执行,相当与于头文件
dir=$1 //初始化
shift //参数向左移
while [$1] /循环
do
file=$1 // 初始化 ,赋值现在位置的参数1
cp $1 $dir //将现位置参数1中的值复制到目录中
shift //参数左移
done
ls $dir 显示指定目录中的列表
运行:bash+代码名称+要移动的目录+要移动的文件

4.10 编写一个shell脚本,显示当天日期,查找给定的某用户是否在系统中工作。如果在系统中,就发一个问候给他。

答:#!/bin/bash
date /显示日期
if
who |grep "^$1" /寻找用户
then
write $1 << ! /对用户发消息

echo "hello !"
fi
运行:bash+文件名称

4.11 打印给定目录的某些文件,由第一个参数指出文件所在的目录,其余参数是要打印的文件名。

答:#!/bin/bash
dir=$1 // $1表示第一参数
cd $ dir
shift
for f in $@; // $@表示全部参数
do
cat $f
done
运行:bash+程序代码名称+目录名称+文件名称

4.12 利用for循环将当前目录下的(*.c)文件移到指定的目录下,并按文件大小排序,显示移动后指定目录的内容。

答:#!/bin/bash
for file in `ls -l /root/a | grep ".*.c"` (Tab键上面的`)
{
mv /root/a/$file /root/b
}
ls -lS /root/b
运行:bash+文件名称

4.13 利用数组形式存放10个城市的名字,然后利用for循环把他们打印出来。
答:#!/bin/bash

for China in Beijing Shanghai Guangzhou Shenzhen Chongqing Tianjin Wuhan Taiwan Xianggang Aomen 
do
echo $China
done
运行:bash+代码名称

4.14 编写一个shell脚本,求斐波那契数列的前10项及总和。

答:#!/bin/bash          
a=1
b=1
echo –n –e "$a\t$b"
let "n=a+b"
count=4
while [ $count –gt 0 ]
do
let "a=a+b"
let "b=b+a"
echo –n –e "\t$a\t$b"
let "n +=a+b"
let "count=count-1"
done
echo
echo "The sum is $n"
运行:bash+创建的文件

4.15 下述表达式的作用是什么?
${ name []} ${ name[@]} ${ name#/ } ${ name%%.* } ${ #name[*]} ${name:-Hello}

答:${name[*]}:数组所有元素 
${name[@]}:数组每一个元素
${name#*/}:删掉第一个/及其左边的字符串
${name%%.*}:删掉第一个.及其右边的字符串
${#name[*]}:数组元素的个数
${name:-Hello}:用 Hello 代替 name进行替换,name的值不变

4.16 显示前面所执行的40个命令的清单,重新执行倒数第5条命令。编写其中一条命令,然后执行。

答;运行:history 40
#!-5

4.17 定义一个别名命令,它等价的功能是:显示当前日期和工作目录,并列出有多少用户在系统上工作。

答:#!/bin/bash
echo $(date)
echo $(pwd)
who | wc -w

运行:bash+代码名称

4.18 设计一个程序cuts,它由标准输入读取数据,获取由第一个参数n和第二个参数m所限定范围的数据,n和m都是整数,即从输入的字符串中抽取第n个字符至第m个字符之间的所有字符(包括这两个字符)。

答;#!/bin/bash
read line;
expr substr "$line" $1 $2 ;
运行:bash+创建的文件 1 4
再次输入 abcdefghik
意思是用第一个字开始连续输出四个字

课后答案文档下载

需要课后文档下载的小伙伴
可以前往海轰的微信公众号:海轰Pro
回复:海轰
就可以啦