Shell基础练习题PPT
Shell基础与编程技术讲义(PPT 90页)
件、现有用户群、将工作目录改为指定目录、显示当前日期等。完成 这些工作的命令是固定的,可把它们写入一个shell脚本中,每次批处 理完成。
• 有些固定工作的命令很复杂,如文件系统安装mount带多个选项和参 数,此时用shell脚本存放该命令,就能提高效率。
端时都被读一次。.bash_profile经常设置先读.bashrc文件,用户能把 所有配置都放进.bashrc里。 • 这些是用户个人设置,系统级设置在'/etc/profile'、'/etc/bashrc'及目 录'/etc/profile.d'下的文件里。当系统与用户设置发生冲突时,用户设 置有效。
2020/10/18
(1)bash 配置文件
9
• 在用户的home目录下,运行命令:
• $ls .bash*
• 将会看到这些文件: • .bash_history :记录了用户以前输入的命令。 • .bash_logout :当用户退出shell 时,要执行的命令。 • .bash_profile :当用户登入shell 时,要执行的命令。 • .bashrc :每次打开新的shell 时,要执行的命令。 • 其中.bash_profile只在会话开始时读取一次,而.bashrc每次打开新终
【例】4.1 建立一个shell脚本,在提示符后输入显示和重定向命令: $ cat > myprogram 回车后直接输入命令,再回车并输入命令,如下
所示:
#!/bin/sh #filename:myprogram x=”hello world.” echo $x y=”my first shell program.” echo $y exit
Shell的练习题
Shell的练习题1、判断/etc/inittab⽂件是否⼤于100⾏,如果⼤于,则显⽰”/etc/inittab is a big file.”否者显⽰”/etc/inittab is a small file.”#!/bin/bashrow=`cat /etc/inittab|wc -l` #获取/etc/inittab⽂件的总⾏数if [ $row -gt 100 ];then #判断⾏数是否⼤于100echo "/etc/inittab is a big file" #如果⼤于则输出“/etc/inittab is a big file”elseecho "/etc/inittab is a small file" #如果⼩于等于则输出“/etc/inittab is a small file”fi2、给定⼀个⽤户,来判断这个⽤户是什么⽤户,如果是管理员⽤户,则显⽰“该⽤户为管理员”,否则显⽰“该⽤户为普通⽤户”#!/bin/bashuser=`id -u $1` #获取$1⽤户的uidif [ $user -eq 0 ];then #判断$user⽤户的uid值(管理员⽤户的uid为0)是否为0echo "该⽤户为管理员⽤户" #如果为0则输出“该⽤户为管理员⽤户”elif [ $user -ge 500 ];then #判断$1⽤户的uid值(普通⽤户的uid为500+)是否为500+echo "该⽤户为普通⽤户" #如果为500+则输出“该⽤户为普通⽤户”fi3、判断某个⽂件是否存在#!/bin/bashif [ -f $1 ];th #判断$1这个⽂件是否存在echo "$1⽂件已经存在" #如果⽂件存在则输出“$1⽂件已经存在”elseecho "$1⽂件不存在" #如果⽂件不存在则输出“$1⽂件不存在”fi4、判断当前系统上是否有⽤户的默认shell程序是否为bash程序,如果有,就显⽰有多个这类⽤户,否则就显⽰没有这类⽤户;【并且显⽰出那些⽤户是bash】#!/bin/bashnum=`cat /etc/passwd |grep 'bash$'|wc -l` #获取默认为bash的⽤户数user=`cat /etc/passwd | cut -d ":" -f 1` #获取默认为bash的⽤户if [ $num -eq 0 ];then #如果⽤户数是否为0echo "没有这类⽤户" #如果为0则输出“没有这类⽤户”elseecho "user" #否则显⽰⽤户名fi5、写出⼀个脚本程序,给定⼀个⽂件,⽐如:/etc/inittab a、判断这个⽂件中是否有空⽩⾏? b、如果有,则显⽰其空⽩⾏的⾏号,否则显⽰没有空⽩⾏#!/bin/bashrow=`cat /etc/iiittab |grep '^$' |wc -l` #统计/etc/inittab⽂件中的空⽩⾏数if [ $row -eq 0 ]:then #判断⽂件中有没有空⽩⾏echo "没有空⽩⾏" #如果没有则输出“没有空⽩⾏”elseecho "$row" #如果有输出有多少⾏fi6、写⼀个脚本程序,给定⼀个⽤户,判断其UID与GID是否⼀样,如果⼀样,就显⽰该⽤户为“good guy”,否则显⽰为“bad guy”#!/bin/bashuid=`id $1 | cut -d "=" -f 2 |cut -d "(" -f 1` #给定⼀个⽤户$1,获取它的uidgid=`id $1 | cut -d "=" -f 3 |cut -d "(" -f 1` #给定⼀个⽤户$1,获取它的uidif [ $uid -eq $gid ];then #判断uid和pid是否相等echo "good guy" #如果相等则输出“good guy”elseecho "bad guy" #如果不想等则输出“bad guy”fi7、写⼀个脚本程序,给定⼀个⽤户,获取其密码警告期限;然后判断⽤户最近⼀次修改密码的时间距离今天是否已经⼩于警告期限;注:/etc/shadow ⽂件以“:”为分隔符分为:登录名:加密⼝令:最后⼀次修改时间:最⼩时间间隔:最⼤时间间隔:告警时间:不活动时间:失效时间:标志#!/bin/bashW=`grep "dmm" /etc/shadow | cut -d: -f6` #取出密码过期的警告时间S=`date +%s` #指定系统元年到现在经过的时间(秒)T=`expr $S/86400` #指定系统元年到现在经过的天数(天)L=`grep "^dmm" /etc/shadow | cut -d: -f5` #取出密码使⽤的过期时间N=`grep "^dmm" /etc/shadow | cut -d: -f3` #取出密码最近⼀次修改的时间SY=$[$L-$[$T-$N]] #算出还剩下的多少天过期(SY)if [ $SY -lt -$W ]; then #判断剩下的过期时间是否⼩于警告时间echo "Worning" #如果⼩于发出警告elseecho "OK" #否则输出“ok”fi8、判断命令历史中历史命令的总条⽬是否⼤于1000,如果⼤于,则显⽰“some command will gone”,否则显⽰OK#!/bin/bashrow=`history|wc -l` #获取history的⾏数if [ $row -gt 1000 ];then #判断⾏数是否⼤于1000echo "some command will gone" #如果⼤于输出“some command will gone”elseecho "ok" #否则输出“ok”fi9、给定⼀个⽂件,如果是普通⽂件,就显⽰出来,如果是⽬录⽂件,也显⽰出来,否则就显⽰“⽆法识别”#!、bin/bashfile=`ll $1 | cut -b 1` #获取$1的⽂件类型if [ $file=='d' ];then #判断⽂件类型是否为d(d代表⽬录⽂件)echo "$1是⽬录⽂件" #如果是输出“$1是⽬录⽂件”elif [ $file=='-' ];then #判断⽂件类型是否为-(-代表普通⽂件)echo "$1是普通⽂件" #如果是输出“$1是⽬录⽂件”elseecho "$1⽆法识别" #否则输出“$1⽆法识别”fi10、写⼀个脚本,能接受⼀个参数(⽂件路径),判断这个参数如果是⼀个存在的⽂件就显⽰“ok”,否则显⽰“No such file”#!/bin/bashif [ -f $1 ];then #判断$1是否存在echo "ok" #如果存在输出“ok”elseecho"No such file" #否则输出“No such file”fi11、写⼀个脚本,给脚本传递两个参数,显⽰两则之和和两者之积#!/bin/bashsum=$(($1+$2)) #获取$1和$2的和product=$(($1*$2)) #获取$1和$2的乘积echo $sum #输出和echo $product #输出乘积。
(最新整理)49道shell基础题
(完整)49道shell基础题编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)49道shell基础题)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)49道shell基础题的全部内容。
一、vi编辑器的使用练习1.请在 /tmp 这个目录下建立一个名为 vitest 的目录;mkdir /tmp/vitest2.进入 vitest 这个目录当中。
cd /tmp/vitest3.将 /etc/man。
config 拷贝到本目录底下;cp /etc/man。
config .4.使用 vi 开启本目录下的 man。
config 这个文件.Vi man。
config5.在 vi 中设定一下行号。
:set nu6.移动到第58行,看到的是什么内容?58G7.移动到第一行,并且向下搜寻一下bzip2 这个字符串,请问他在第几行?1G 然后 /bzip2 在118行8.接着下来,我要将 50 到 100 行之间的 man 改为 MAN ,并且一个一个挑选是否需要修改,如何下达指令?:50,,100s/man/MAN/gc9.修改完之后,突然反悔了,要全部复原,有哪些方法?一直按u,直到回到想要的地方10.我要复制 51 到 60 行这十行的内容,并且贴到最后一行之后;51G 然后10yy 按下G到最后一行然后p即可11.删除 11 到 30 行之间的 20 行;11G 20dd12.将这个文件另存成一个 man.test.config 的文件名;:w man。
test。
config13.去到第 29 行,并且删除 15 个字符;29G 15x14.在第一行新增一行,该行内容输入“I am a student”1G O 然后输入即可15.保存后离开:wq二、文件和目录管理1.查看当前的路径。
Shell基础练习题PPT课件
#!/bin/sh DIRNAME=`ls /root | grep bak` if [ -z "$DIRNAME" ] ; then
mkdir /root/bak cd /root/bak fi YY=`date %y` MM=`date %m` DD=`date %d` BACKETC=$YY$MM$DD_etc.tar.gz tar -zcvf $BACKETC /etc echo “fileback finished!”
12
case “$1″ in #case结构开始,判断“位置参数”决定执行 的操作。本程序携带一个“位置参数”,即$1
‘start’) #若位置参数为start /usr/sbin/apachectl start ;; #启动httpd进程 ‘stop’) #若位置参数为stop /usr/sbin/apachectl stop ;; #关闭httpd进程 ‘restart’) #若位置参数为stop /usr/sbin/apachectl restart ;; #重新启动httpd进程 *) #若位置参数不是start、stop或restart时 echo “usage $0 start|stop|restart” ;; #显示命令提示信
录,不存在先创建/userdata再创建子目录 • 权限赋值rwxr-xr-- 数字方式754
10
#! /bin/bash #adddir.sh i=1 while [ $i -le 50 ] do if [ -d /userdata ] then
mkdir -p /userdata/user$i else
息:程序的正确调用方法 esac #case结构结束 (2)程序的功能是启动,停止或重新启动httpd进程 (3)程序的调用方式有三种:启动,停止和重新启动。
第9单元Shell编程基础PPT课件
脚本名
当脚本文件有执行权限以及脚本所在的目录已经 在’环变量中时就可以在任何目录中执么脚本名。
3、Shell中的特殊变量
在Shell脚本中经常会用到下列特殊的变量: $#:位置参数的个数
sh test1.sh -n -i -k ($# => 3)
for循环控制语句格式如下: for 变量名 in one two three four five do
Shell编程基础
整体 概述
一 请在这里输入您的主要叙述内容
二
请在这里输入您的主要 叙述内容
三 请在这里输入您的主要叙述内容
学习目标
Shell编程的概述 Shell脚本的执行方式 Shell中的特殊变量 Shell脚本命令行参数变量 测试指令(test) Shell控制语句(if) Shell控制语句(case) Shell控制语句(for) Shell控制语句(while) Shell控制语句(until)
2、Shell脚本的执行方式
当一个Shell脚本程序编写好后就可以直接执行 这个脚本了,它不像其它的某些程序(如C程 序)需要编译后才能执行。 执行Shell脚本程序的方法有在种:
sh <脚本所在的路径>
例:sh test1.sh (“.sh”默认为Shell脚本的扩展名)。
脚本绝对路径 或 ./脚本名相对路径
test <字符串1/变量1> = <字符串2/变量2> 当字符串1或变量1的值与字符串2或变量2的 值相同时,测试结果为真(注:在=两边必须 要有空格)。
test <字符串1/变量1> != <字符串2/变量2> 当字符串1或变量1的值与字符串2或变量2的 值不相同时,测试结果为真(注:在!=两边必
《Shell脚本基础》PPT课件
Shell脚本基础
主讲:刘晓涛
议程
创建和执行shell脚本 使用echo命令显示消息 创建变量 使用本地和全局变量 计算表达式 使用if构造执行基于条件的shell脚本 使用case构造执行基于条件的shell脚本 识别用于执行重复任务的while、for、和until 构造 在shell脚本中使用break和continue语句 控制进程的执行 计算命令的开始到结束之间的时间
$ read fname
本地和全局 Shell 变量
局部变量 当引用shell时,只有创建它的shell能够知道 到变量的存在
全局变量 称为子shell shell中创建的变量局部于创建它的shell,除 非使用export命令特别指出是全局的
9
环境变量 通过改变这些变量的值,用户能够定制此环境
10
本地和全局 Shell 变量(续)11
环境变量(续) PATH变量 包含一列用冒号定界的目录的路径名字, 便于可执行程序的搜索 PS1变量 PS1(Prompt String 1)变量包含了shell提 示符,$符号 $ PS1="HELLO>" <Enter> HELLO> New prompt
变量
创建变量 可以在任何时间通过简单的赋值来创建。 语法 <variable name>=<value> Linux中的所有变量都被当作字符串。 引用变量 $符号用于引用一个变量的内容
7
variable1=${variable2}
8
读入值给变量 在执行shell脚本时,shell还允许用户 从键盘中输入一个值给变量。可以使用 read命令来做
08.shell基础32页PPT
$ ls
test1
test2
$ ls [!j]*[2-5]
test2 test3
test3
john2 cong
[!j] 表示除了j字母外的任意字符
8.2.1 重定向
文件描述符 输入重定向,符号“ < ” 输出重定向,符号“ > ”和“ >> ” 错误重定向,符号“ 2> ”和“ 2>> ” 复合重定向
$ ls
doc
few
net
$ ls n*
net new nod
$ ls *w
few new
new tmp nod
*w 通配以w结束的任意字符串
示例
[ ] 通配符,通配方括号中列出的字符
$ ls
doc
few
net
$ ls [fghbdn]e[tw]
net new beet
new tmp beet
[fghbdn] 通配f、g、h、b、d、n其中的一个字符
管道(2)
示例1,统计当前在线用户的人数:
$ who|wc -l 2
第八章 Shell 基础
第八章 shell基础
第八章 shell基础掌握基本的shell 操作
8.1.1 shell概述
shell 是系统用户界面,提供了用户与操作系统 内核进行交互操作的接口 shell是命令解释器,解释用户输入的命令,把 它们送到内核去执行 shell 是脚本编程语言 AIX默认用的shell是ksh
8.1.2 通配符
? 通配符 * 通配符 [ ] 通配符 [ - ] 通配符 ! 通配符
示例
? 通配符,通配任意某个字符
$ ls
doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3
#!/bin/bash cd / touch m1.txt m2.txt m3.txt m4.txt I=1 while [ $I -le 4 ] do
mkdir m$I cp m$I.txt m$I I=$((I+1)) done
4
判断拷贝
• 用Shell编程,判断一文件是不是字符设备 文件,如果是将其拷贝到 /dev 目录下
7
#! /bin/bash #deluser.sh i=1 while [ $i -le 50] do if [ -n "`ls /etc/passwd | grep stud$i`" ] then userdel -r stdu$i else echo "No find stdu$i" i=$(($i+1)) done
录,不存在先创建/userdata再创建子目录 • 权限赋值rwxr-xr-- 数字方式754
9
#! /bin/bash #adddir.sh i=1 while [ $i -le 50 ] do if [ -d /userdata ] then
mkdir -p /userdata/user$i else
• 思路: • 使用read命令从键盘上获取文件名 • 如何判断是否是字符设备
5
#! /bin/bash echo -e "please input filename \n" read FILENAME if[ -c $FILENAME ] then
cp $FILENAME /dev else
echo "It's not Charactor device file"ell程序,在/userdata目录下建立50 个目录,即user1~user50,并设置每个目录的 权限,其中其他用户的权限为:读;文件所有者 的权限为:读、写、执行;文件所有者所在组的 权限为:读、执行
• 思路: • While循环生成文件目录 • 判断/userdata是否存在,如果存在直接创建子目
Shell算术运算
• 求1+2+3+...+100的和是? • 思路: • 使用while循环,注意循环体和循环终止条
件 • 注意算术运算的使用
1
#!/bin/bash SUM=0 I=0 while [ $I -le 100 ] do
SUM=$((SUM+I)) I=$((I+1)) done echo "由1+2+3+...+100的和是:$SUM"
11
case “$1″ in #case结构开始,判断“位置参数”决定执行的 操作。本程序携带一个“位置参数”,即$1
‘start’) #若位置参数为start /usr/sbin/apachectl start ;; #启动httpd进程 ‘stop’) #若位置参数为stop /usr/sbin/apachectl stop ;; #关闭httpd进程 ‘restart’) #若位置参数为stop /usr/sbin/apachectl restart ;; #重新启动httpd进程 *) #若位置参数不是start、stop或restart时 echo “usage $0 start|stop|restart” ;; #显示命令提示信息:程
2
文件拷贝
• 在根目录下创建四个文件m1.txt,m2.txt, m3.txt,m4.txt,用Shell编程,实现自动创 建m1,m2,m3,m4四个目录,并将m1.txt , m2.txt,m3.txt,m4.txt 四个文件分别拷贝 到各自相应的目录下
• 思路: • 用touch命令创建文件,mkdir命令创建目录 • 使用while循环依次拷贝,目录和文件的表
• 思路: • 使用while循环添加 • 使用useradd命令添加 • 应增加用户的主目录,以及修改目录权限
和组的权限
13
#!/bin/sh i=1 groupadd class1 while [ $i -le 30 ] do if [ $i -le 9 ] ;then
USERNAME=stu0${i} else
USERNAME=stu${i} fi useradd $USERNAME mkdir /home/$USERNAME chown -R $USERNAME /home/$USERNAME chgrp -R class1 /home/$USERNAME i=$(($i 1)) done
mkdir /userdata mkdir -p /userdata/user$i fi chmod 754 /userdata/user$i i=$(($i+1)) done
10
读程序,写注释
#!/bin/sh # /etc/rc.d/rc.httpd # Start/stop/restart the Apache web server. # To make Apache start automatically at boot, make this # file executable: chmod 755 /etc/rc.d/rc.httpd case “$1″ in ‘start’) /usr/sbin/apachectl start ;; ‘stop’) /usr/sbin/apachectl stop ;; ‘restart’) /usr/sbin/apachectl restart ;; *) echo “usage $0 start|stop|restart” ;; esac
6
账号删除
• 编写shell程序,实现自动删除50个账号的 功能。账号名为stud1至stud50
• 思路: • 采用while循环删除,循环中变量的对应表
示stud$i • 查看账户是否存在:在/etc/passwd文件查
找 • 如何搜索指定用户 ls /etc/passwd | grep stud$i
序的正确调用方法 esac #case结构结束 (2)程序的功能是启动,停止或重新启动httpd进程 (3)程序的调用方式有三种:启动,停止和重新启动。
12
添加用户
• 设计一个shell程序,添加一个新组为class1, 然后添加属于这个组的30个用户,用户名 的形式为stdxx,其中xx从01到30。