dragon527 发表于 2005-6-2 23:43:22

[求助]:shell入门问题!

都说shell比c简单,可是我觉得比我当时学c入门难多了!真的/

但是我觉得我真的是还没有入门!在学习之前应该搞清楚一些基本的问题,所以我疑问很多,还是要劳驾你!!

-->
   1进入shell就是进入超级终端吗?所谓的shell就是超级终端吗?

   2.shell解释执行,那不用在文本编辑工具里先编辑好再允许,而是直接运行,但 是什么时候运行呢?在超级终端中任意敲入一个命令,enter 就执行了,这算编程吗?我就是对编程这个传统的观念没有打破,所谓编程,要么像windows带有集成编译环境,linux虽没有,但是先是编辑好,再用gcc编译,可是这种解释型的编程,解释执行是一边输入一边执行,可是在超级终端中没输入一行,要enter!我真的很不理解啊!
      :?::?: 3."脚本" 是个什么概念 ?一直是个迷! 不太理解!网上有讲linux shell编程,但是这些我是找不到的!所以很多疑   问!据我的理解脚本应该是跟文件才对啊,那应该像在windows 一样编辑,在存储为一个文件才对啊!?

demonlj 发表于 2005-6-3 01:29:11

这方面讨论的有点多了,多看看帖子上别人的说法吧

sbgang0811 发表于 2005-6-3 08:02:22

就是..这些高深点的问题就有点搞不明白了....希望斑竹多弄点这些文章上来.行吗?

dragon527 发表于 2005-6-3 08:22:15

这方面的讨论多吗?可是我很难找到啊!基本上是看不到,请解释解释吧!! :!:

zhy2111314 发表于 2005-6-3 09:31:09

shell和c都可以看作是一种语言,难易只是相对而言,因此这个没法比较!
学习一种语言最重要是要领略到这种语言的灵魂之处,而不是去追究它容易还是简单,每个编程语言都有自己的特点,但是大部分的思想都是相通的,比如你会c语言,那么学起shell来就容易一些,我们学习编程语言不是为了比较难易,而是融会贯通,互为补充的!

shell是一种可编程的人机交互的界面,那么Linux Shell 到底是命令来的,还是编程环境来的?
Linux只是一个内核,要让内核按照用户的命令工作,就需要建立一种方法让人机能够交流,shell是Unix/Linux提供的一种人机交互环境,它由一组命令和命令解释器组成。DOS环境就是摸仿它编写的。对于一些简单的操作如建个新目录、拷贝一个文件,只需一个个的执行某几个命令就可以完成了,但对于复杂的操作,如:将本周里所有的日志中包含XXX信息的日志备份到以备份日期为目录名的目录下,同时将其做为邮件发送到管理员信箱。就要输入好多命令才能完成,而且每周都要输入一次,对管理员来说这项工作也太无聊了,于是shell为用户提供了一个简化的方法,用户可以写一个脚本例如写一个 backup.sh,将这些命令按一定的方式(顺序、判断、循环)集成到一起执行,这样每次要备份时只需运行backup.sh文件就OK了(它是脚本所以不需要编译,就可以在sh解译器下执行),如果还想少做点事,还可以把它加入到cron中定期自动执行。

所以严格来说
shell:一种人机交互环境(它有多种实现方式如Bash、Ksh、Csh等等)它由一组命令和一个命令解释器组成。
shell脚本:为了达到某种目的,以编程的方式将shell命令组合到一起形成的一个文件。
shell编程:如果把系统命令理解成系统库函数(本质上两者没有什么差别),shell就相当于一种编程环境了。

对于终端的概念,参考下:
终端(Terminals)
Unix 是可以在许多种机器上运行的操作系统,但人们又如何使用这些机器呢?他们是通过哑终端来连接到这些机器,也就是用键盘、显示器及足够的 electronics (电子元件)组成的机器与中央计算机(central computer)相连。在这些终端上,用户可以敲字符(teletype),这就是字符串'tty'表示终端设备文件,和'getty'命令的名称来历。

您可能会问,现在这些东西都在哪儿。 这些终端的厂家无法达成一项最终标准,这导致每种牌子的终端都有各自的键盘布局、各自的在屏幕上显示字符的方法、发送或接收什么信号表示什么字符、控制代码等等。

为了避免这些混乱,就创建了一个含有所有不同终端特性的(capability)文件,这就是'termcap'。用一个工具打开'/etc/termcap'瞧瞧,可别吓着了 ;-) 。

Linux 终端大多数用'vt100'或'linux'作为终端类型。
而所谓的超级终端,好象这时windows中的产物,在做嵌入式arm等板子的交互时用到过:)

最后,再抛砖引玉一下,那么如何编写脚本和如何运行他呢?
用vi编写一个含有多个linux命令的文件,如
ls
date
...
存盘退出后,在提示符下用sh filename,即可运行

也可以这样执行:
在脚本文件的最前面加上这么一句:
#!/bin/bash
然后存盘后,在命令行下面输入这一句使它可以直接执行:
chmod +x filename
这样以后执行的时候就可以这样执行:
./filename

不知道我的解释能让你明白吗?

不死的天神永恒 发表于 2005-6-3 11:15:43

应该会明白吧

dragon527 发表于 2005-6-3 12:50:33

非常感谢楼主
谢谢!!
明白了! :lol:

kys_9138 发表于 2005-6-3 14:47:28

版主讲得很清楚~~很不错,我以后要好好得请教~~嘻嘻~~!!! :mrgreen::mrgreen:

dragon527 发表于 2005-6-3 15:41:40

真的是感谢版主的指导!
我是清楚了很多,也更进一步理解了shell,但是在理解的过程中还是有些疑问!
1.编译执行就是现将程序转化成二进制代码,在执行,而shell是由命令组成的,脚本是
由shell命令组成的,在终端中可以解释执行,但是,这跟编程好象没有很大的关系啊?!
不管是解释执行还是编译后执行,都是现生成文件,再在终端中执行罢了,不同点是
编译型程序的扩展名为:.c等,而解释型文件如shell脚本文件的扩展名为.sh,且它是由
shell命令组成。我这样理解不知道合不合理?
2.shell并不是可以看见的,在终端中输入命令或执行××.sh文件的时候,就将命令传给
shell执行,对吗?
3.在终端中执行××.sh型文件的时候有很多的方法的,若我在\home下建立了文件:hello.sh
可以在终端中输入:hello.sh, . hello.sh. source.sh .但是用chmod +x \home\hello.sh , 再
输入./ \home\hello.sh 却不能成功,是什么原因啊?chmod +x \home\hello.sh命令是将
hello.sh变成可以执行的文件,可是再具体怎么作啊??
#chmod +x file(在/etc/profile中,加入export PATH=${PATH}:~/yourpath, ~/ 是什么意思啊?
这里的path 是不是我的 hello.sh的路径啊?那~/yourpath应该改为\home,对吗?
还有个问题就是,用hello.sh, . hello.sh. source.sh执行\home\hello.sh文件时,在hello.sh中
不需要#!/bin/bash 也可以执行成功,也不要chmod +x \home\hello.sh命令,这到底是怎么
回事啊 ?

zhy2111314 发表于 2005-6-3 16:42:44

真的是感谢版主的指导!
我是清楚了很多,也更进一步理解了shell,但是在理解的过程中还是有些疑问!有疑问是好事!谢我倒不必了,这是我应做的!我的水平有限也希望大家能够共同进步!
1.编译执行就是现将程序转化成二进制代码,在执行,而shell是由命令组成的,脚本是
由shell命令组成的,在终端中可以解释执行,但是,这跟编程好象没有很大的关系啊?!
这个问题有点象是追究“编程”这个词语的准确解释,如果这样我想问一下:什么叫做编程?什么样的才算是编程?如果你能给出一个国际通用的大家认可的严格的标准的“编程”的定义,我们再来研究shell和c哪个是编程?
早就说过了,shell是可编程的人机交互的一个界面,是可编程,它是一种编程语言,又不尽是一种编程语言,它的主要用途恐怕不是为了编程,而是为了人机交互而可以用作编程使用!
不管是解释执行还是编译后执行,都是现生成文件,再在终端中执行罢了,不同点是
编译型程序的扩展名为:.c等,而解释型文件如shell脚本文件的扩展名为.sh,且它是由
shell命令组成。我这样理解不知道合不合理?
首先,你陷入了windows下扩展名的陷阱之中,一个文件并不是通过扩展名而识别的,比如一个windows下的.exe,你在linux下改成.run或者加上执行权限,它仍然不能执行,你可以在linux下用file命令来查看文件的类型,在决定类型时,file并不关心文件名(尽管它可以),因为命名传统仅仅是传统,它并不可靠。例如,后缀.c的文件通常是C源码,但是并没有任何东西可以防止你创建一个.c文件却包含别的任意的内容。file采用的方法是读入文件的前几百个字节,查看文件类型的线索。有的线索很明显,一个可执行程序的标识是在它的开始有一个二进制的“魔力数”,比如:

$od /bin/ed
0000000 000410 025000 000462 011444 000000 000000 000000 000001
0000020 ......
八进制410标识一个纯的可执行程序!410的编码不是ASCII码,所以这个值不会被类似编辑器这样的程序无意中创建出来,但是可以通过运行自己的程序来创建这样一个文件,系统将明白按照惯例这样的文件是二进制代码!
2.shell并不是可以看见的,在终端中输入命令或执行××.sh文件的时候,就将命令传给
shell执行,对吗?在这里,shell的工作原理大致是这样的:
shell工作原理:
shell根据IFS(Interal Field Separator:空格 Tab 回车)将command line分割为字段(words),先处理metacharacters,再重组整行.

详细了解的话可以看看置顶的Bash命令行处理[详解](转自sir之home_king)

3.在终端中执行××.sh型文件的时候有很多的方法的,若我在\home下建立了文件:hello.sh
可以在终端中输入:hello.sh, . hello.sh. source.sh .但是用chmod +x \home\hello.sh , 再
输入./ \home\hello.sh 却不能成功,是什么原因啊?chmod +x \home\hello.sh命令是将
hello.sh变成可以执行的文件,可是再具体怎么作啊??
#chmod +x file(在/etc/profile中,加入export PATH=${PATH}:~/yourpath, ~/ 是什么意思啊?
这里的path 是不是我的 hello.sh的路径啊?那~/yourpath应该改为\home,对吗?
还有个问题就是,用hello.sh, . hello.sh. source.sh执行\home\hello.sh文件时,在hello.sh中
不需要#!/bin/bash 也可以执行成功,也不要chmod +x \home\hello.sh命令,这到底是怎么
回事啊 ?
你的问题很多,问题多了有时候是需要考虑一下为什么这么多,上面的问题我可以给你详细的解释,但是这个问题我只能有点怀疑您在遇到问题的时候有没有去查阅资料或者搜索论坛或者google搜索而很好的利用网上的资料,我不清楚您是要打算学习shell吗?如果是的话,应该静下心来,多动脑,多动手,去实践!
简单解释一下第一个
./表示当前目录
你./ \home\hello.sh怎么可能成功??

不知道我说的对不对,如有不对请指证!!

BOoRFGOnZ 发表于 2005-6-3 21:06:24

受益非浅 :mrgreen:

sbgang0811 发表于 2005-6-4 13:39:01

多谢师兄~~~`..公社有没有这方面的教程可下载啊?

zhy2111314 发表于 2005-6-4 14:03:26

公社没有,我这里有呵呵
http://zhy2fly.lysafe.com/web/index/zhy2fly_docs_document01.htm

dragon527 发表于 2005-6-4 16:35:42

我的怎么不能执行啊?
我在/home目录下建立了文件test.sh,文件内容为:#!/bin/bashecho "hello,world"
然后:# chmod +x test.sh ;# test.sh
可是:bash: test.sh: command not found
是哪里出了问题啊 ?
我真的是检查不出来啊!(我也检查了/bin,下面有bash)
请指点!!

不死的天神永恒 发表于 2005-6-4 20:36:51

#!/bin/bash echo "hello,world"

为什么不写成
#!/bin/bash
echo "hello,world"
页: [1] 2
查看完整版本: [求助]:shell入门问题!