浅入浅出shell

记得上大学时跟着别人选修了linux,老师在课程介绍时提到linux是非常重要的,而课程结束后脑袋仍一片空白,还是不知道linux是个啥东西,老师在我的"软硬兼施"下给了个及格,混得了些学分,也不枉我每次跑到教室去点名报道。参加工作后发现linux这个东西还真得有,必须的。当初在项目的需要下,临危受命,开始了我的shell之旅,此过程孤独漫长,痛苦并快乐着。本文不是和大家讲解shell具体的编程技术,为的是和大家探讨一下如何学习一门技术,熟练掌握应用到项目中。

它是什么?用来做什么?
万事万物存在就有其道理,正如windows下的批处理bat文件,在linux下可以利用sh文件执行一系列操作完成某项功能。其由linux命令,搭配shell脚本自身的语法和变量组成;linux命令是shell脚本的主要角色,犹如存储过程中的sql语句;对linux命令越熟悉,shell脚本的功能就可以发挥得越强大。shell脚本一般作为自动化工具使用,常见于产品的安装和部署,以及性能测试中大批量数据的构造。它的优点在于不需要输入一条linux命令,修改一个文件,完全自动化,对不熟悉linux命令的人傻瓜式的操作也很容易上手。自动化工具产品化,流程化后,大大缩短了产品安装部署的时间,屏蔽了各人之间操作的差异性,给工作效率带来了显著提高,提升了产品的竞争能力。

它的历史和编程基础
大家百度,google一下肯定比我说的清楚,起先是有bsh,后来发展了csh,tcsh,ksh,各种shell基本上差不多,只是在少数功能上使用的linux命令和变量不同而已。编写一个shell文件时,文件头首行要申明使用哪种类型的shell,文件体定义一些方法或函数,文件尾定义要执行的方法或函数;或者不定义方法或函数,将会按照从上到下的顺序执行。例子如下:
test.sh

#!/bin/ksh

print()
{
  echo "this is test"
}

main()
{
  print
}

main $@

赋予test.sh文件可执行权限chmod +x test.sh,执行文件./test.sh,输出结果"this is test"。

这只是一个简单的例子,让大家对shell编程有个大致的了解,点到而止。当然编程里面可能还会用到变量的定义,变量的读取,if判断,for循环,管道,文字界面的输入输出等等,这些需要大家多找些资料来学习学习。



它用什么来开发?
最快速的方法就是用touch创建一个文件,然后使用vi工具进行编写;但是vi工具有时使用起来十分别扭,例如添加时前面行自动上移无法显示、无法在注释中输入中文等。介绍一种方便编写linux下文件的方法:
1。使用samba服务,为windows共享linux下的文件
  (1)修改/etc/samba/smb.conf文件,添加samba用户test
   [test]
    path = /
    writable = yes
    read only = no
    browsable = yes
  (2)配置samba用户密码
   samba +a test
  (3)重启samba服务
   rcsmb restart
  至此我们就可以通过windows的运行输入 \\linux系统的ip地址,输入用户名test和密码,完成后就可以像访问windows的网络共享文件一样访问linux下的共享文件了。
2。使用ue工具远程编写文件
  右键点击"网络邻居",选择"映射网络驱动器",驱动器默认,文件夹输入"\\linux系统的ip地址\test",完成后打开ue工具就可以像编辑本地盘符下的文件一样编辑映射后的linux下的文件了。
 
它的功能扩展
除了shell自身的功能外,还可以在shell脚本中调用java程序,c程序来增强其功能,反之也可以用其他编程语言来执行shell脚本,当然前提条件是要有各自语言的执行环境。

最后来点FAQ吧
1。执行shell脚本时为什么一定要在当前目录,其他目录行不行?
设置PATH环境变量,将shell脚本的目录路径添加进去,就可以在其他目录执行了。
2。怎样调试shell脚本?
脚本中打开调试开关:set +x
3。shell脚本执行出错,多次检查程序仍发现不了问题或者之前脚本运行成功,后来突然运行出错?
这种情况最大的可能是在文件的格式问题上,
使用命令cat -v test.sh检查文件是否是dos格式,查看每行的结尾处是否有"^M"
使用命令dos2unix test.sh将文件由dos格式转换为unix格式,或者使用ue工具的dos转unix功能进行转换
4。shell脚本执行时有些命令的执行不想输出屏幕显示,怎么做?
将其输出到空设备文件,例如 ls > /dev/null
5。在shell脚本中设置了环境变量,为什么后来使用环境变量却失效了?
执行脚本时生成了子进程,相当于父进程的一个副本,子进程环境变量的设置只会在子进程中有效,不会影响父进程。

6。linux命令有那么多的参数,记不住怎么办?
不需要记住,linux系统提供了详细的帮助功能。man command,就可以查看该command的详细用法了。

大家都有使用过linux的经验,为什么那些命令总是记不住呢,熟能生巧是至理名言,大家有针对性的多操作操作。或者逆向思维换种方式,以实现某种功能写个shell脚本,在写脚本的过程中尽量多的熟悉使用linux命令,或许有意想不到的效果。

猜你喜欢

转载自coolcc821.iteye.com/blog/779592