苏嵌第一天,shell中一些基础知识

来源:互联网 发布:浙江省软件协会网站 编辑:程序博客网 时间:2024/06/06 09:44

一、常用环境变量
1、HOME变量
Linux系统中的每个用户都有一个相关的称作HOME的目录。

2、PATH变量
包含一列用冒号定界的目录的路径名字,便于可执行程序的搜索。

3、PS1变量
PS1变量包含了shell提示符,$符号

4、LOGNAME变量
包含用户的注册名字
echo “${LOGNAME}”

5、SHLVL变量
该变量包含你当前工作的shell level

6、SHELL变量
环境变量存储了用户的缺省shell,即shell类型

7、env命令
可用来查看所有已移除的环境变量表和它们各自的值

二、常用内部变量
$# ——传送给shell程序的位置参数的数量
$? ——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)
$0 ——shell程序的名称
$* ——调用shell程序时所传送的全部参数的单字符串, “参数1”“参数2”…形式保存的参数
$n ——第n个参数

三、条件判断命令
test n1 -参数 n2(或 –参数 表达式)
真返回0,假返回1。

参数:
-lt 小于
-le小于等于
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于

·test语句的等价形式[ 1 –lt 4 ]
可用中括号代替test,把表达式括起来实现判断
注意表达式与中括号间有空格。

test 1 –lt 4 //判断1<4
echo $? //结果为0

eg:若输入的参数x 是正数,显示 x number is positive

#!/bin/bashif test $1 -gt 0thenecho "$1 number is positive"fi

四、文件测试的常用代码
-f 存在且是普通文件
-d 存在且是目录
-s 存在且字节数大于0
-r 存在且可读
-w 存在且可写
-x 存在且可执行
如:test -d “mydoc”
判断mydoc是否是目录
五、课后作业

  1. 编写一个名为iffile程序,它执行时判断/bin目录下date文件是否存在?
#! /bin/bash fname=/bin/date if (test –f “$fname”)  then     echo “exist” fi

说明:
在shell程序中经常需要判断所处理的文件是否存在。本程序采用if语句的简单格式测试date文件,如果存在,则显示相关信息,否则退出if语句。

2.编写一个名为greet的问候程序,执行时能根据系统当前的时间向用户输出问候信息。设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。

#! /bin/sh - hour=`date|cut –c 10-11` if test “$hour” –ge 0 –a “$hour” –lt 12; then   echo “Good morning!” elif test “$hour” –ge 12 –a “$hour” –le 18; then   echo “Good afternoon!” else   echo “Good evening!” fi

说明:
第一个有效语句是将命令执行的结果赋给hour变量,所以用反向单引号。
用cut命令从date命令的输出中切割出“小时”信息;这里-c 10-11选项表示只切割10到11列。
这个程序使用了if连用格式,也可以使用if完整格式的嵌套形式。

3.编写一个名为ifuser的程序,它执行时带用户名作为命令行参数,判断该用户是否已经在系统中登录,并给出相关信息。

#! /bin/sh -if test $# -ne 1 thenecho "Incorrect number of arguments"     echo "Usage: ifuser username"else     user=$1     if who | grep –q $user ; then        echo $1 "user is logged on."        exit 0     else        echo $1 "user is not logged on."        exit 1     fifi

说明:
(1)由于who | grep $user不是表达式而是命令组合,所以不需要test语句测试;如果命令组合执行成功,即找到指定的用户名则返回码为0;否则为非0。
(2)在这个程序中使用了grep字符串搜索命令和“|”管道命令
(3)用grep 命令–q选项来禁止显示搜索到的信息。
(4)还使用了exit命令,以终止shell程序的执行。exit 0表示程序终止后返回0值,而exit 1表示程序终止后返回非0的值。

4.编写一个名为menu的程序,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。

#! /bin/sh -clearecho "  -----------------MENU------------------"echoecho "  1.Find files modified in last 24 hours"echo "  2.The free disk space"echo "  3.Space consumed by this user"echo "  4.Exit"echo   echo -n "  Select:"read choicecase $choice in1)find $HOME -mtime -1 -print;;2)df;;3)du -s $HOME;;4)exit;;*)echo "Invalid option"  esac

说明:
(1)本程序菜单的第一项是显示/home目录下,最近24小时内所有修改过的文件。命令中的-1参数是数字“1”,表示一天(24小时)。第二项是检查磁盘空间。第三项是显示/home目录下文件的大小,命令中的-s选项是为了仅显示总计。第四项是退出程序。
(2)为了使程序美观,用echo –n实现输入的选择数字不换行。
(3)输入的数字不在1-4范围内时,显示无效的选项信息。

5.编写一个名为chname的程序,将当前目录下所有的.txt文件更名为.doc文件。

#! /bin/sh -for file in *.txtdo  leftname=`basename $file .txt`  mv $file $leftname.docdone

说明:
(1)在Linux系统中不支持mv .txt .doc这样的更名命令形式,如果需要将文件成批地更名最好编写一个shell脚本文件。
(2)在for语句的参数列表中使用了“*”通配符。
(3(在程序中用到basename命令,该命令从随后的文件名剥去指定的后缀。

6.编写一个名为chuser的程序,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入;如果指定的用户已经登录,则显示相关信息。

 #! /bin/sh – if test $# -ne 1 then   echo “Usage: chuser username” else   user=”$1”   until who |grep “$userdo    sleep 300   done   echo$user has logged on!” fi

说明:
(1)如果没有从命令行输入用户名,则测试$# -ne 1为“真”,显示用法提示信息。
(2)程序中until语句的expression(循环条件)是who|grep “$user”命令执行的返回码,如果没有找到指定的用户名,返回码为非0(为“假”),则用sleep命令暂停执行程序5分钟;找到后返回码为0(为“真”),则终止循环并显示该用户已经登录的信息。
(3)采用重定向到/dev/null空文件的目的是不显示查找到的用户其他信息。

原创粉丝点击