Linux Shell 之 我的第一个Shell程序


这里我首先会介绍一个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/bash2.# filename:FileType.sh3.4.read -p "Please input the filename :" filename5.fpath=$filename6.if [ -d $fpath ];7.then8.echo "$fpath is a direstory.";9.elif [ -e $fpath ];10.then11.echo "$fpath is a file.";12.else13.echo "$fpath is NOT a file or direstory.";14.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,如有错误,欢迎指出!

原文链接: https://www.cnblogs.com/dyllove98/p/3189988.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/95824

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 上午3:16
下一篇 2023年2月10日 上午3:17

相关推荐