这里我首先会介绍一个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. PHP - 表单与验证

    第11章 表单与验证 学习要点: 1.Header()函数 2.接收及验证数据 我们对Web感兴趣,认为它有用的原因是其主要通过基于HTML的表单发布和收集信息的能力.这些表单用来鼓励网站的反馈.进行 ...

  2. EF的两种延迟加载

    EF的两种延迟加载 EF的延迟加载一: 在一次查询以后得到temp,然后在temp上直接进行查询得到temp2,我们调用temp2的时候,是直接为temp生成sql脚本的,没有生成temp的脚本,也就 ...

  3. Tomcat 7最大并发连接数的正确修改方法(转)

    几乎所有的中文网页都介绍,要修改Tomcat的默认最大并发连接数,应该进行如下设置(实际上这些步骤是错误的): -------------------------------------------- ...

  4. java class生成jar包(转)

    进入dos操作符窗口cd进入要打成jar包的class文件所有文件夹目录jar cvf [生成jar的名称.jar] [列出class文件] //若有多个,以空隔隔开 如:一.操作零散的单个或几个cl ...

  5. 基于visual Studio2013解决C语言竞赛题之1045打印成绩

       题目 解决代码及点评 /* 功能:用记录来描述一个学生的成绩情况,内容包括:姓名.学号.数学成绩和PASCAL成绩. 要求对一个小组的10个学生的成绩进行统计处理: 1)计算学生的总 ...

  6. 基于visual Studio2013解决C语言竞赛题之1081shell排序

        题目 解决代码及点评 /************************************************************************/ /* ...

  7. python模块介绍- HTMLParser 简单的HTML和XHTML解析器

    python模块介绍- HTMLParser 简单的HTML和XHTML解析器 2013-09-11 磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq ...

  8. HDU 4709 Herding 几何题解

    求全部点组成的三角形最小的面积,0除外. 本题就枚举全部能够组成的三角形,然后保存最小的就是答案了.由于数据量非常少. 复习一下怎样求三角形面积.最简便的方法就是向量叉乘的知识了. 并且是二维向量叉乘 ...

  9. Kendo UI开发教程(25): 单页面应用(三) View

    View为屏幕上某个可视部分,可以处理用户事件. View可以通过HTML创建或是通过script元素.缺省情况下View将其所包含的内容封装在一个Div元素中.Kendo创建View有两种方式: 使 ...

  10. mysql出现Waiting for table metadata lock的原因及解决方案

    最近经常遇到mysql数据库死锁,郁闷死, show processlist; 时 Waiting for table metadata lock 能一直锁很久 下面有官网的一段话,可以理解下 htt ...