这里我首先会介绍一个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. 网盘大全, 邮箱大全 good

    网盘推荐 115网盘 注册 百度网盘 注册 微云 注册 360云盘 注册 金山快盘 注册 新浪微盘 注册 和彩云 注册 酷盘 注册 OneDrive 外链 BOX 注册 Dropbox 注册 国内网盘 ...

  2. log4net结构

    log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.其大致分为如下这些模块. Appenders模 ...

  3. POJ - 1185 炮兵阵地 (状态压缩)

    题目大意:中文题目就不多说大意了 解题思路: 1.每行最多仅仅有十个位置,且不是山地就是平原,那么就能够用1表示山地,0表示平原,将每一行的状态进行压缩了 2.接着找出每行能放炮兵的状态.先不考虑其它 ...

  4. sn9c291 驱动载入成功,mpayer无法播放

    先眼下将一个sn9c291+ov9712的模块驱动在fedora上载入成功,但是在使用mplayer却无法播放,不知道为何? watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...

  5. 开源JDBC工具类DbUtils

    本篇将会详细地介绍Apache公司的JDBC帮助工具类DbUtils以及如何使用.在上一篇中我们已经通过将以前对dao层使用JDBC操作数据库的冗余代码进行了简易封装形成自己的简单工具类JdbcUti ...

  6. css 水平居中的办法

    <div style="width: 100%; text-align: center; margin: auto;"> <div style="dis ...

  7. POJ 3481 &amp; HDU 1908 Double Queue (map运用)

    题目链接: PKU:http://poj.org/problem?id=3481 HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1908 Descript ...

  8. eclipse发布项目报错:Multiple Contexts hava a path of “/xxx“

    你的位置:首页 > Java编程 > eclipse发布项目报错:Multiple Contexts hava a path of “/xxx“ eclipse发布项目报错:Multipl ...

  9. HDU 1556 Color the Ball 线段树 题解

    本题使用线段树自然能够,由于区间的问题. 这里比較难想的就是: 1 最后更新须要查询全部叶子节点的值,故此须要使用O(nlgn)时间效率更新全部点. 2 截取区间不能有半点差错.否则答案错误. 这两点 ...

  10. POJ 2632 Crashing Robots (坑爹的模拟题)

    Crashing Robots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6599   Accepted: 2854 D ...