这里我首先会介绍一个Shell是什么,再介绍我的第一个Shell程序和从中总结的经验。

一、Shell是什么

在说我的这个Shell程序之前,还是先跟大家说说什么是Shell吧,相信Shell这个词大家一定听过很多了,但是它其实是什么东西呢?其实Shell是一个程序,我们在shell中输入一些命令,它就告诉操作系统内核我们想做什么,好让内核可以控制硬件来正确无误地工作。简单点来说就是,Shell的功能只是提供一个用户操作系统的接口,而这个shell则可以调用其他的程序来完成这些操作,只要能操作应用程序的接口都叫Shell。而现在的Linux中的Shell默认都是/bin/bash这个Shell。

什么是Shell程序?简单点来说,编写一个可以在Shell中直接运行文件。说白了就是跟大家在Shell中直接输入命令差不多,只不过是把它按照一定的法则写到了一个文件中,然后直接执行那个文件来执行里面的写好命令而已。

二、我的第一个Shell程序
 
[plain] 
view plain
copy
print
?

 

  1. #! /bin/bash
  2. # filename:FileType.sh
  3. read -p "Please input the filename :" filename
  4. fpath=$filename
  5. if [ -d $fpath ];
  6. then
  7. echo "$fpath is a direstory.";
  8. elif [ -e $fpath ];
  9. then
  10. echo "$fpath is a file.";
  11. else
  12. echo "$fpath is NOT a file  or direstory.";
  13. fi
 


这个就是我的第一个Shell程序,功能非常简单,就是输入一个文件名,判断这个文件名是目录还是文件,如果两都都不是,则给出相应的提示。

可别看这是个非常简单的程序,我在写这个程序时,由于没有之前一直在学C和C++,没有接触过任何的脚本语言,所以可以说是写得错漏百出,非常艰苦才能它写到可以运行的。所以我就在这里把我的经验说一说,好让其他的像我一样一直在学像C++这些静态强类型语言而没学过脚本语言的人少走一些弯路吧。

三、程序分析

1、fpath=$filename
首先来看看这句,在Shell中变量是不用像C或C++那样,需要先定义再使用,在Shell中,直接写直接用就行了,filename是上一句中的变量,用以保存我们输入的文件名。大家一定要注意一下这句话的写法,常见的错误有如下两点:

1)fpath = $filename,注意这样的写法在Shell中是另一种的意思,即判断filename的值是否为fpath,注意是fpath,不是fpath这个变量对应的值。因为在Shell中a=b,与a = b,是完全不同的,前者是赋值,后者是比较。这对于写惯了C/C++的程序员来说可能是致命的,因为在C/C++中,a=b,与a = b是完全相同的,而且不少人喜欢第二种写法,因为这样写代码比较好看,然而在Shell中却栽了大根头。

2)fpath=filename
对于C/C++程序员来说,既然filename是一个变量,fpath也是一个变量,则fpath=filename应该是把变量filename的值赋给fpath,应该是没问题的。但是在Shell中却不然,因为Shell中的变量都不需要定义,你想让Shell知道这是一个变量,而不是一个普通的字符串,就应该在它的前面加上一个$,所以当你写成fpath=filename时,它的意思就是fpath这个变量的值赋为filename,而不是filename这个变量所对应的值,因为你没有加上$号,所以默认filename只是普通的字符串。所以当你想把filename的值赋给fpath时,应该写成fpath=$filename,这时Shell就是认为filename是一个变量,也就会取出filename的值并赋给fpath。

2、if [ -d $fpath ];
第二个值得注意的地方就是这里了,注意这条语句的所有空格都是必须的,特别要注意的是if与“[”之间一定要有一个空格。因为在Shell中这不是编码规范或风格的问题,是语法问题。

3、echo "$fpath is a direstory.";
注意,在Shell中双引号与单引号有所不同的,虽然大家都能打印也字符串,但是双引号中的变量,会用其值来代替,而在单引号中则不会对变量求值。例如,在程序中你输入:/root,则输出为:/root is a direstory.。$fpath用/root被代替了。若改为echo '$fpath is a direstory.';,则无论你输入的内容是什么哪个目录都只会输出:$fpath is a direstory.。还有就是,echo也可以不加双引号和单引号,不过这样的话,你就无法在要显示中文本中使用命令定界符。

以上就是我根据错误总结的经验,希望对大家有帮助,刚刚接触Shell,如有错误,欢迎指出!

 
 

Linux Shell 之 我的第一个Shell程序的更多相关文章

  1. shell脚本中执行另一个shell脚本

    分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量   注意,圆点后面有 ...

  2. Shell 脚本中调用另一个 Shell 脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  3. 013-在 Shell 脚本中调用另一个 Shell 脚本的三种方式

    如下: fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. exec: exec path/to/foo.sh source: sourc ...

  4. linux中备份mysql数据库的一个shell脚本

    #!/bin/bash #FileName:select_into_bak.sh #Desc:Use select into outfile to backup db or tables #Creat ...

  5. Linux Shell系列教程之(二)第一个Shell脚本

    本文是Linux Shell系列教程的第(二)篇,更多shell教程请看:Linux Shell系列教程 通过上一篇教程的学习,相信大家已经能够对shell建立起一个大体的印象了,接下来,我们通过一个 ...

  6. 【技术分享】linux各种一句话反弹shell总结——攻击者指定服务端,受害者主机(无公网IP)主动连接攻击者的服务端程序(CC server),开启一个shell交互,就叫反弹shell。

    反弹shell背景: 想要搞清楚这个问题,首先要搞清楚什么是反弹,为什么要反弹.假设我们攻击了一台机器,打开了该机器的一个端口,攻击者在自己的机器去连接目标机器(目标ip:目标机器端口),这是比较常规 ...

  7. linux系统编程综合练习-实现一个小型的shell程序(一)

    之前已经花了不少篇幅学习了linux系统编程的很多知识点:文件与io.进程.信号.管道,而零散的知识点,怎么能够综合的串接起来是学习的一个很重要的目的,当然最好的方式就是用所学的知识点做一个项目了,所 ...

  8. linux c语言编写一个shell壳

    目的:我们要用c语言编写一个shell可以运行在linux机器上的. 介绍:shell所在的层次 我们要做的是操作系统,用于用户与操作系统进行交互的myhsell 思路:用户输入  一行字符串,我们先 ...

  9. Linux Shell编程(2)——第一个shell程序

    在最简单的情况下,脚本程序不过是存储在一个文件里的系统命令列表.这至少让你执行它 时不必重新按顺序键入相同功能的命令序列.一个清空/var/log目录下的日志文件的脚本 # Cleanup # 必须以 ...

随机推荐

  1. ADO.NET 2SqlDataAdapter、DataSet 的基本用法

    数据集完全独立于数据源,可以与数据源链接或者完全断开,其基本作用是为存储在内存缓存中的的数据提供关系视图 如果只是想读取和显示数据,则值需要使用数据读取器,尤其是处理大量数据的时候 如果需要处理数据, ...

  2. 记一次在Tomcat部署项目后无法启动该项目的例子

    在一次正常部署后,发现在Tomcat的管理中无法将该项目启动起来,并在Tomcat的日志文件localhost.log中发现以下错误信息: java.lang.NoSuchMethodError: o ...

  3. VS2008+Qt 项目目录

    1.项目开发环境:VS2008,QT4.7 2.项目的目录: 1)PETCT是解决方案名字 2)Bin目录存放所有动态链接库和执行档,包括自己的产出和第三方库,区分Release和Debug两个版本. ...

  4. HDU 1425 sort 题解

    选择出数列中前k个最大的数. 这里由于数据特殊.所以能够使用hash表的方法: #include <cstdio> #include <algorithm> #include ...

  5. 把VS2010的智能代码提示和注解从英文变成中文

    最近安装了个高级点的VS2010,起初还没留意.今天无意发现提示信息只能提示英文.....头大oooo. 我以为是个别现象,于是GG了下,发现有很多盆友都有这种. 记录下来了,以后省事儿: 访问MS的 ...

  6. Eclipse用法和技巧四:生成说明文档1

    写代码经常要添加注释的,java代码的注释也可以分为两种.单行注释以“//”作为开头就可以.段落注释在第一行开头添加“/*”,在最后一行结尾添加“*/"即可.这里介绍一种添加注释的方法,其注 ...

  7. CSDN高校俱乐部2013年秋季北京地区第一站“编程语言的应用及其发展”—北京联合大学

    2013年12月11日晚17:00.CSDN高校俱乐2013年秋季北京地区第一站“编程语言的应用及其发展”在北京联合大学进行. 首先,CSDN总部人员介绍CSDN俱乐部的改版以及线上编程挑战赛.CSD ...

  8. WEB应用如何解决安全退出问题

    让我先来描述一下这个情况.一位用户第一次请求一个web页面,web应用弹出登录窗口提示用户登录,用户输入用户名,密码,验证码后服务器进行判断,正确后,返回用户请求的页面.     此时,用户有事需要离 ...

  9. Valera and Tubes

    C. Valera and Tubes time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. TApplication.Initialize的前世今生

    ---------------------------------------------------------------------------------------------------- ...