这里我首先会介绍一个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. 使用ViewPager模拟实现应用程序启动界面

    经常在开发应用程序的时候,软件启动有启用动画界面,一般使用图片来进行界面该版本最新更新等等内容,今天来使用ViewPager来模拟实现这功能,也希望对大家有个小小的参考作用,在以后的项目中能够使用到. ...

  2. c语言,动态数组

    试着直接malloc一个2*3*4的空间来模拟数组: #include <stdio.h> #include <malloc.h> int main(void) { int** ...

  3. WM_PAINT在微软官方定义中,wParam和lParam都没有使用,所以就被Delphi给重定义了这个消息,还增加了DC(Delphi可任意改写消息的结构)

    LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); Parameters wParam ...

  4. WCF技术剖析之十三:序列化过程中的已知类型(Known Type)

    原文:WCF技术剖析之十三:序列化过程中的已知类型(Known Type) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话) ...

  5. ssh安装过程

    1.在线安装[root@Asianux ~]# sudo apt-get install ssh   2.进行加密设置[root@Asianux ~]# ssh-keygen -t rsa3.启动SS ...

  6. JS实现图片翻书效果

    picture.html <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http- ...

  7. UIViewController加载过程

    UIViewController是视图和数据的桥梁,UIViewController是所有controller的基类,ios内置了很多试图控制器,如导航控制器,tableViewController等 ...

  8. perl学习(9) 实例:取出操作时间最长的100个记录

    需求描述: 日志记录了一次操作的时间,即server端接收包到发送结果到client端的时间,取出操作时间最长的100个记录. 日志信息片段: [2013-09-13 15:23:50,445.500 ...

  9. RHEL Server 6.3下MySQL5.5.25a源码安装

    OS:RHEL Server 6.3 MySQL:mysql-5.5.25a.tar.gz 相关依赖包: ncurses-5.9.tar.gz bison-2.5.tar.gz 安装MySQL 一.安 ...

  10. sql: sybase与oracle中insert into select和select into的用法

    1. sybase与oracle中insert into select和select into的用法 http://wjlvivid.iteye.com/blog/1921679 Sybase 一.首 ...