linux自学笔记课后练习_第1页
linux自学笔记课后练习_第2页
linux自学笔记课后练习_第3页
linux自学笔记课后练习_第4页
linux自学笔记课后练习_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、author: fenghundate: 2013.07.29function: bash练习笔记linux bash: 交互式bash习题一、 bash 入门a) 哪个进程把登陆提示符显示到屏幕上?答:getty进程。注:该问题涉及到的知识点是linux的启动过程。1. 系统启动后运行的第一个进程是init(该进程的pid号是1)。2. init派生出一个getty进程,该进程负责打开终端端口,提供标准输入的来源,标准输出和标准错误输出的去处,并在屏幕上显示一个登陆提示符。3. 接下来执行的是/bin/login程序,读入用户输入的用户名和口令,设置初始环境,启动bash(并不绝对,具体要看

2、系统默认的启动shell)。4. bash进程首先查找系统文件/etc/profile,并执行其中的命令。5. 然后在用户的主目录中查找并执行名为.bash_profile的初始化文件。6. 接着在用户的ENV(通常叫做.bashrc)中执行一个命令,默认的美元提示符($)显示在屏幕上,启动完毕。b) 哪个进程为HOME、LOGNAME和PATH赋值?答:login进程。注:linux系统启动第三步(如上题),执行/bin/login程序会设置初始环境。执行cat /bin/login 命令,查看login文件乱码(待解决)。c) 怎么才能知道自己正在运行哪种shell?答:使用ps命令,可以

3、查看当前所使用的shell进程。注:使用如下命令查看本机安装了哪几种shell。d) 如何改变登录shell?答:改变登录shell需要更改/etc/passwd文件的配置。如图是用户fenghun当前使用的shell为标准的Bourne shell。更改登录shell的配置文件/etc/passwd,切换到root用户,查看/etc/passwd文件如下图:显示的fenghun用户的登录shell为/bin/sh。使用vi命令修改/etc/passwd文件中的fenghun用户这一行的最后,把/bin/sh更改为/bin/bash(前提是系统已经安装了bash)。如下图:重新用fenghun

4、用户登录如下图:登录shell已经改为bash。注:如果是临时改变使用的shell,可以直接输入shell名即可。e) 在哪一个文件里指定您的登录shell?答:/etc/passwd。有上题可知。f) 解释/etc/profile和/.bash_profile这两个文件之间的区别。shell先执行哪一个?答:/etc/profile属于系统文件,/.bash_profile属于用户的初始化文件,启动系统时,shell先执行/etc/profile文件,而后在执行/.bash_profile文件(如果存在)。注:由第一题的系统启动过程分析可知。g) 编辑.bash_profile文件,完成下列

5、功能。i. 欢迎用户ii. 如果路径中不包括主目录,将其加入。iii. 用stty命令设置退格键的擦除功能。iv. 键入:source .profile 。source命令的功能是什么?答:source命令(即”.”-dot命令)可以使shell脚本文件生效而不必重新登录系统,也不需要文件有执行权限。执行该命令的脚本中的所有参数都会成为当前shell的一部分(即不会启动子shell)。h) BASH_ENV文件是什么?什么时候执行?答:BASH_ENV文件简称为ENV,文件BASH_ENV在/.bash_profile中设置,每次交互式bash shell或bash脚本启动时要执行的文件名赋值

6、给该变量。i) 默认的主提示符是什么?答:bash的默认的主提示符是美元符号$。保存在变量PS1中。i. 改变提示符以包括当天的时间和主目录。答: ii. 默认的次提示符是什么?他的功能是什么?答:bash的默认的次提示符是一个向右的尖括号(>)。保存在变量PS2中。如果没有输入完整的命令或者是期望输入更多,就需要使用次提示符。j) 解释下面每项设置的功能:i. set o ignoreeof答:ignoreeof变量用来禁止使用ctrl+d来退出shell。ii. set o noclobber答:用-o设置选项noclobber,他禁止在重定向时重写文件。如果没有设置noclobbe

7、r选项,重定向时就会覆盖原来的文件,没有则会创建。iii. set o emacs答:表示编辑命令行用 emacs 模式,不分编辑状态和控制状态iv. set o vi答:set -o vi 表示编辑命令行用 vi 模式,默认状态是 vi 的 编辑状态,k) 前一个例子中的设置保存在哪个文件中?他们为什么被保存在那里?答:通常保存在BASH_ENV(ENV)文件中。l) shopt p 做什么用的?为什么用shopt而不是set命令?答:带 p 选项的shopt打印所有可用的选项设置。内置命令shopt是set命令的一种替换,shopt(内置命令)在很多方面和set内置命令一样,但它为配置sh

8、ell增加了更多的选项。m) 什么是内置命令?如何知道一个命令是内置命令还是可执行程序?命令builtin的作用是什么?命令enable呢?答:内置命令:是shell内部源代码的一部分,他们是内置的,且很容易被shell获取。help命令可以查看所有的内置命令。builtin(内置命令)命令只查找内置命令,忽略在路径中找到的函数和可执行程序。enable(内置命令)命令可以关闭和打开内置命令。n) 什么情况可以使shell返回退出状态127?答:shell没有找到命令,返回的退出状态就是127。注:退出状态是一个0-255之间的一个整数,通常情况退出状态为0,表示命令执行成功。如果退出状态为非

9、0,表示命令执行失败。二、 作业控制a) 程序和进程有什么区别?什么是作业?答: 程序:程序(Program)是为实现特定目标或解决特定问题而用计算机语言编写的命令序列的集合 进程:进程就是运行着的程序。(进程又称作业)状态:程序是静止的,进程是动态的。时间:程序是永久的,而进程则是暂时的。数量:一个程序可以有多个进程,而一个进程只能属于一个程序。等b) shell的PID是什么?答:PID是每个进程的标识号(进程号)。c) 如何停止一个作业?答:使用kill命令可以停止作业。d) 什么命令可以将一个后台作业放到前台?答:fg命令可以将后台作业放到前台。e) 如何列出所有正在进行的作业,如何列

10、出所有暂停的作业?答:jobs r 命令列出所有的正在运行的作业,jobs s 命令列出所有的暂停的作业。f) kill命令的作用是什么?答:kill命令用于终止进程,g) jobs l 显示什么,kill l显示什么?答:jobs l 显示在后台运行的进程(作业)和它们的PID。kill l 显示出信号的名称和编号。三、 命令补全、历史和别名a) 什么是文件名补全?答:文件名补全就是键入文件名的一部分,然后按TAB键补全剩余的部分。(为了减少键入bash实现了命令和文件名补全机制)b) 用于保存在命令行键入的命令历史文的文件是什么?答:默认的历史文件名是.bash_history,它位于主目

11、录中。c) “bang, bang”是什么意思?答:重新执行历史命令需要使用感叹号(称为bang)。如果键入两个感叹号(!)即”bang”,”bang”历史清单中的最后一条命令将被执行。d) 如何重新执行最后一条以v开头的命令?答:fc s string 命令可以执行以string为开头的命令。如图:执行最后一条以”l”开头的命令。e) 如何重新执行第125条命令?如何反序打印历史清单?答:重新执行第125条命令,可以用命令!125去实现。如图:重新执行第690条命令。反序打印历史清单f) 如何将所使用的交互式编辑器设置为vi编辑器?可以将该设置放在哪个初始化文件中?答:set o vi命令可

12、以将交互式编辑器设置为vi,可以将该命令放到/.bashrc文件中。g) fc命令是什么?答:fc命令也称为fix命令,用于两个方面:(1)从历史清单中选择命令。(2)用vi或emacs编辑器,或系统上的任何其他编辑器来编辑命令。h) readline库的目的是什么?它从哪个初始化文件中读取指令?答:readline库用于决定按键所完成的功能,不管是在vi下还是emacs模式下。readline还可以控制方向键、光标移动、更改、删除和插入文本以及回复键入和撤销键入。readline还提供命令补全的功能。利用tab键补全文件名或命令。readline库还提供了许多特性以帮助在命令行操作文本。总之

13、,readline库的目的就是用以解决交互式shell的功能实现问题。i) 什么是按键绑定?如何确定绑定了哪些键?答:?j) 什么是全局参数?答:环境变量(即全局变量)可以用在创建他们的shell和从该shell派生的任意子shell或进程中使用。k) 为下列命令创建别名:i. clear答:ii. fc s答:iii. ls color=tty答:iv. kill l答:四、 shell元字符a) 创建一个名为wildcards的目录,cd到该目录然后在命令行键入如下命令:b) 写出能实现下列功能的命令,并测试所写的命令。i. 列出所有以a开头的文件答:ii. 列出所有名称以至少一个数字结尾

14、的文件。答:iii. 列出所有以a或A开头的文件答:iv. 列出所有的以一个句号和数字结尾的文件答:v. 列出所有的名称中只包含两个字母的文件答:vi. 列出所有的名称为3个字母组成,且3个字母都大写的文件答:注:大小写没搞懂。vii. 列出所有的名称以10、11和12结尾的文件答:viii. 列出所有的以x或y结尾的文件答:ix. 列出所有的名称以数字、大写字母或小写字母结尾的文件答:注:大小写没搞懂。x. 列出所有的名称不是以a、b或B开头的文件答:xi. 删除名称为两个字符,并以a或A开头的文件答:五、 重定向a) 与终端关联的3个文件流的名称是什么?答:stdin、stdout、std

15、err。分别表示标准输入、标准输出和标准错误输出。stdin:标准输入通常来自键盘。stdout、stderr:标准输出和标准错误输出通常被发往屏幕。b) 什么是文件描述符?答:文件描述符是一个较小的无符号整数,是文件描述符表的索引。文件描述符表由内核维护,内核用它来访问打开的文件和I/O流。头三个文件描述符为0、1和2,被赋给了终端,分别表示标准输入(stdin:0)、标准输出(stdout:1)和标准错误输出(stderr:2)。c) 用什么命令来完成下列任务i. 把ls命令的输出重定向到lsfile文件中答:ii. 重定向date命令的输出,将其追加到文件lsfile的尾部答:iii.

16、把who命令的输出重定向到文件lsfile,会出现什么结果?答:?d) 只输入cp会出现什么后果答:报错呗e) 如何把上面的错误信息输出到一个文件中。答:f) 用find命令从父目录开始,找出所有类型为目录的文件。把标准输出保存到found文件中,把所有的错误信息输出到文件found.errs中答:g) 取3条命令的输出,将他们重定向到文件gottem_all中?答:?h) 使用管道来运行ps和wc命令,查出当前正在运行的进程数。答:六、 变量a) 什么是位置参数,在命令行键入:答:通常被shell脚本用来从命令行接受参数,或者被函数用来保存传给它的参数的一组内置变量常常称为位置参数。i. 如

17、何列出所有的位置参数?答:ii. 哪个位置参量赋值为birds?答:iii. 如何输出位置参数的个数?答:iv. 怎么从shell的内存中删除所有的位置参量?答:set - 命令清除或复位所有的位置参量。b) 环境变量是什么?用来列出他们的命令是什么?创建一个名为CITY的环境变量并将它赋值一个城市名。如何导出这个变量?答:1.环境变量可以用在创建他们的shell和由该shell派生的任意子shell中,它们通常被称为全局变量,用以区别局部变量。2.用env命令或export(或-p)命令可以查看所有的环境变量。3.c) 局部变量是什么?将一个局部变量设置成您的名字。打印它的值,然后删除它。答

18、:d) declare i 的功能是什么?答:内置命令declare用于创建变量。declare i var_name 将变量设置为整型。e) $变量显示什么?$!呢?答:$:显示当前shell的PIDlinux bash: bash脚本练习(非交互式bash)一、 第一个bash脚本a) 编写一个名为greetme的脚本,它包含以下内容:i.包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的。ii.问候用户。iii.显示日期和时间iv.显示这个月的月历v.显示您的机器名vi.显示当前这个操作系统的名称和版本(cat /etc/motd)。vii.显示父目录中所有的文件的列表。viii

19、.显示root正在运行的所有的进程。ix.显示变量TERM、PATH和HOME的值。x.显示磁盘的使用情况。xi.用id命令打印出您的组ID。xii.显示“Please,could you loan me $50.00?”xiii.跟用户说“GoodBye”,并且告诉它当前的时间(请参考date命令的手册页)答:bash脚本代码:#!/bin/bash# author: fenghun# date: 2013.08.30# scriptname: greetme# function: The first bash script of bash exercise.echo -ne "H

20、ello $LOGNAME.n" # Do not ouput the trailing new-lineecho # output an empty lineecho -e "# The date of today # nToday:" $( date +'%x' ) $( date +'%A') $( date +'%X' ) # $( date ) <=> dateecho -ne "THe date of other format:" $( date +%F) $( date

21、+%r) $( date +%A )"n"echo -e "The current Month Calendar: n$( cal )"echo # output an empty lineecho -e "# The name of your computer #n"$( uname -a)echo # output an empty lineecho -e "# The infos of OS #n" "$( cat /etc/issue )"echo # output an empty l

22、ineecho "# The list all files in parents directory of current directory #"echo "$( ls -al . )"echo # output an empty lineecho "# The list of processes of root #"echo "$( ps -ef | grep root )"echo # output an empty lineecho "# Show the variable of PATH|TER

23、M|HOME #"echo -e "PATH:$PATH nTERM:$TERM nHOME:$HOME"echo # output an empty lineecho -e "# Show the using infos of disk #"echo "$( df -h )"echo # output an empty lineecho "# The id of your group #"echo "$( id -g )"echo # output an empty lineecho

24、 "Please, could you load me $50.00?"echo # output an empty lineecho "GoodBye!$LOGNAME-$( date +%F) $( date +%r )"b) 确保脚本可执行。chomd u+x greetme您的脚本的第一行是什么,为什么要加这一行。答:第一行#!/bin/bash必须放在第一行,作用是告诉linux内核通过哪种shell解析该脚本。“#!”通常称作shbang,又称幻数。二、 命令行参数a) 编写一个rename的脚本,这个脚本需要两个参数:第一个参数:文件的原名

25、,第二个参数:文件的新名称。如果这用户没有提供两个参数,就在屏幕上显示一条信息提示脚本的用法,然后退出脚本下面是该脚本如何工作的一个例子。答:脚本代码#!/bin/bash# author: fenghun# date: 2013.08.30# scriptname: rename# function: Rename the file by the script and backup old file.if ( $# != 2 ) ; # if the number of parameters is not 2then echo "Usage: $0 oldfilename newf

26、ilename " # output the prompt infoselse if -e $1 ; # If the oldfile exist. then cp $1 ./$1.bak # Backup the oldfile.if $1.bak has already exist,cover it if -e $2 ; # If the newfile exist. then echo "$2 has already existed.Please rename other name." else mv $1 $2 # Rename the oldfile e

27、cho "The $1 has been renamed $2." echo -e "Here is a listing of directory:n $( ls )" fi else echo "Not found $1." fifib) 下面的find命令(SunOS系统上)将列出根分区上所有大于100kb、并且在上周修改过的文件,(查看自己所用的操作系统上的手册,以确定find命令在当前系统上的正确语法)c) 编写一个名为bigfiles的脚本。这个脚本带两个参数:第一个:mtime的值(修改时间)第二个:size的值(文件的大

28、小)如果用户没有提供两个参数,就向stderr发送一条合适的报错信息。答:脚本代码#/bin/bash# author: fenghun# date: 2013.09.02# scriptname: bigfile# function: find the file whose modify time less then $1 and size greater then $2 in current directory.if ( $# != 2) ;then echo "Usage: $0 mtime size"else echo "find ." find

29、 . -mtime -$1 -size +$2 echo "find end."fid) 编写一个名为vib的脚本,用它来为vi创建备份文件。备份文件的名称是在原始文件的名称加上.bak答:脚本代码#!/bin/bash# author: fenghun# date: 2013.09.02# scriptname: vib# function: Create the back up file in order to vi command.if( $# != 1 ) ;then echo "Usage: $0 file"else cp $1 ./$1.ba

30、k vi $1fi三、 获取用户的输入a) 编写一个名为nosy的脚本,该脚本将执行下列操作:i. 询问用户的全名名字和姓。ii. 用用户的名字问候他。iii. 询问用户的出生年份,并计算出他(她)的年龄(使用let命令)iv. 询问用户的登录名,并打印他的用户ID(从/etc/passwd)中获得。v. 告诉用户他(她)的主目录在哪vi. 向用户显示他(她)正在运行的进程。vii. 告诉用户现在是星期几,并且用非军用的时间格式告诉他(她)现在的时间,输出结果应类似于:答:脚本代码#!/bin/bash# author: fenghun# date: 2013.09.02# scriptnam

31、e: nosy# function: test the read commandecho "Please enter your full name(name and last name):"read name last_nameecho "Hello $name."echo "Which year were you born:"read birth_year( age=$( date +%Y ) - $birth_year )echo "You are $age."echo "what is your l

32、og name:"read log_name# Get the id and home of user(log_name) and put them to only read array user_infosdeclare -ar user_infos=( $( grep $log_name /etc/passwd | awk -F: 'print $3,$6' ) )echo "Your id is:"$user_infos0 # Get the first elementecho "Your home is:"$user_i

33、nfos1 # Get the second elementecho -e "The running progress belong to you is:n$( ps -ef | grep $log_name )"echo "The day of week is $( date +%A ) and the current time is $( date +%r )"b) 创建一个名为datafile的文本文件(除非已经提供了这个文件)。文件中的每一条记录包含若干由冒号分隔的字段记录中的字段包括:1. 名和姓2. 电话号码3. 地址4. 出生日期5. 工资

34、答:创建数据库及其操作的脚本:#!/bin/bash# author: fenghun# date: 2013.09.03# scriptname: createDB# function: 1.Create database file# 2.Call the function, addonif ! -e datafile then touch datafile datafile=./datafileelse datafile=./datafilefisource dbfunctions_bash.shif ! -e $datafile then echo "$datafile is

35、not exist" >&2 exit 1fiecho "Select one:"cat << EOF # Use the here document to show a menu 1 Add infos 2 Delete infos 3 Update infos 4 ExitEOFread -p "please enter the choice 1,2,3 or 4:"case "$REPLY" in 1) addon # Calling the addon function ; 2) delet

36、e # Calling the delete function ; 3) update # Calling the update function ; 4) echo "Bye" ; *) echo Bad choice exit 2 ;esacecho "Returned from function called"#echo "The name is $name?"name is not found."" # Variable set in the function are known in this shell

37、.function script: (add/delete/update)#!/bin/bash# author: fenghun# date: 2013.09.03# scriptname: dbfunctions_bash.sh# function: The add, delete and update function.function addon() while true do echo "Adding information" echo "Type the full name of employee" read name echo "

38、Type tel for employee" read tel echo "Type address for employee" read address echo "Type birthday for employee" read birthday echo "Type salary for employee" read salary echo $name:$tel:$address:$birthday:$salary echo -n "Is this correct:" read ans case &

39、quot;$ans" in Yy*) echo "Adding info . " echo $name:$tel:$address:$birthday:$salary>>datafile # sort -u datafile -o datafile # Sort the datafile. echo -n "Do you want to add continue?" read ans if $ans = Yy then echo "continue ." continue # Return to calling

40、program. else echo "return ." return # Go to the top of the loop fi ; *) echo "Do you want to try again ? " read answer case "$answer" in Yy*) continue ; *) break ; esac ; esac donefunction delete () echo "executing the delete function."function update () echo

41、 "excuting the update function." c) 创建一个名为loopup的脚本,让他完成如下任务:i. 包含一段注释,用来说明脚本名、作者姓名、时间和编写这个脚本的原因。编写这个脚本的目的是要将datafile的内容按顺序显示。ii. 按姓氏对datafile排序。iii. 向用户显示datafile内容iv. 用户文件中一共有多少条记录。答:脚本代码#!/bin/bash# author: fenghun# date: 2013.09.03# scriptname: loopup# function: Make items of the dataf

42、ile order by name and show the items and the count of items# Sort -u(unique) the datafile and -o overide the datafilesort -u datafile -o datafileecho "The list of datafile order by name:"# Show the records of datafile and show the number of row at first column# and show the number of colum

43、n at last columnawk -F: 'print NR,$0,NF' datafileecho "The number of records is :$( awk 'ENDprint NR' datafile)"d) 尝试用-x和-v选项来调试脚本。如何使用这些命令?他们有何不同?答:bash x scriptname 在变量替换之后,执行之前显示脚本的每一行。bash v scriptname 执行之前显示脚本的每一行,与键入脚本中的一样。四、 条件语句a) 编写一个名为checking的脚本来执行如下操作:i. 接收一个命令行

44、参数:用户登录名。ii. 检查用户是否提供了命令行参数。iii. 检查用户是否在/etc/passwd文件中,如果存在,就显示信息:Found <User> in file /etc/passwd中。若不存在就显示信息:No such user on your system.答:脚本代码#!/bin/bash# author: fenghun# date: 2013.10.14# scriptname: checking# function: Get a logname from terminal and judge the name is in /etc/passwd or no

45、tif( $#!=1 ); # If the number of params is not 1then echo "Usage:$0 logname." # Output the prompt infos.else grep $1 /etc/passwd if( $?=0 ); then username=$( grep $1 /etc/passwd | awk -F: 'print $1') echo "Found <$username> in file /etc/passwd." else echo "No such user in your system." fifib) 在脚本loopup中,询问用户是否要往文件datafile增加一条记录如果用户回答yes或y,则:i. 提示用户输入姓名、电话、地址、出生日期和工资,将每一项分别保存在一个变量中,在字段间加冒号,然后把这条信息追加到文件datafile的尾部(creatDB和dbfunctions_bash.sh脚本实现了该功能)。ii. 按姓氏对该文件排序,告诉用户这条记录

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论