第一次学shell编程,看的文章中说shell程序必须以"#!/bin/sh"开始,也就认为是这样了。
虽然知道在shell中以"#"开始的语句都是注释,但也从没认为"#!/bin/sh"也是注释,就像对C语言程序必须有main函数一样毫无怀疑。
但前些时候又听说"#!/bin/sh"也是注释,可有可无,当时觉得真是一个失败,连基本的语法都分不清。
前几天借了一本书,才真正认识了"#!/bin/sh"。
shell编程是以"#"为注释,但对"#!/bin/sh"却不是。
"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在。
如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell。
比如:如果脚本被编写为在Korn Linux中运行,而默认运行shell脚本的为C shell csh,则上述脚本在执行过程中很可能失败。
所以建议大家就把"#!/bin/sh"当成C 语言的main函数一样,写shell必须有,以使shell程序更严密。
即: #!/bin/sh 是指此脚本使用/bin/sh来解释执行,#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
其实第一句的#!是对脚本的解释器程序路径,脚本的内容是由解释器解释的,我们可以用各种各样的解释器来写对应的脚本。
比如说/bin/csh脚本,/bin/perl脚本,/bin/awk脚本,/bin/sed脚本,甚至/bin/echo等等。
那我们真的能写一个/bin/echo的脚本文件吗?我们来试试,下面是一个例子:代码:#!/bin/echo –e这只有一行的程序(实际上它也只能是一行,echo程序并不是被设计成像awk那样的编程语言,能写成源程序文件)命名为myecho,加上权限后执行它:代码:$ ./myecho "hi\a" ./myecho hi如果你的echo支持-e选项并且你工作的环境还算安静,你在得到上面的结果的时候也应该听到清脆的终端响铃。
但这种程序是毫无作用的。
1、linux分区--在linux里面所有的设备、任何东西,在linux看来都是文件。
--文件在它看来,有两种形式:第一种是字符型(键盘输入、打印机);第二种是二进制型(硬盘、光驱、U盘)--linux中所有硬件--手动分区--A、至少有两个分区/ 根分区SW AP 交换分区(物理内存大小的两倍)--B、个人桌面分区//boot 128MB is enough/usrSW AP/tmp(用于光盘刻录)2、linux目录说明--/dev/xxyN--xx (分区所在设备类型:hd--IDE硬盘sd--SCSI硬盘)--y (标明分区所在设备例如:/dev/hda 第一个IDE硬盘或/dev/hdb 第二个IDE硬盘或/dev/sdb 第二个SCSI 硬盘)--N (数字代表分区:1-4--主分区或扩展分区;逻辑分区从5开始!例如:/dev/hda3 第一个IDE硬盘上的第三个主分区或扩展分区/dev/sdb6 第二个SCSI硬盘上的第二个逻辑分区)3、linux目录结构/ 根目录,最高级别/bin 系统基本命令存放目录(/usr/bin)/boot linux的内核及引导系统程序文件存放目录(如:vmlinuz、initrd.img) 一般情况下,GRUB或LILO系统引导管理也位于这个目录/dev 设备文件存储目录,如声卡、光驱.../ect 存放系统设置文件(如用户账号密码、服务器配置文件等)/home 普通用户家目录,默认存放目录/lib 库文件存放目录/lost+found 在ext2或ext3文件系统中,当系统以外崩溃或机器意外关机,而产生一些文件碎片放在这里。
当系统启动的过程中,fsck工具会检查这里,并修复已经损坏的文件系统。
有事喜用发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或者移文件到原来的位置上。
/media 即插即用型存储设备的挂载点自动在这个目录下创建。
如USB盘系统自动挂在后,会在这个目录下产生一个目录;类似cdrom的目录/mnt 存放挂载存储设备的挂载目录,如cdrom等目录/opt 表示可选的意思,有些软件包也会被安装在此,也就是自定义软件包,比如OpenOffice,或者一些我们自己编译的软件包,也可安装此处。
/proc 操作系统运行时,进程(正在运行的程序)信息及内核信息(比如CPU、硬盘分区、内存信息等)存放在此。
/proc目录是伪装的文件系统proc的挂载目录,proc并不是真正的文件系统/root linux超级权限用户root的家目录/sbin 大多是涉及系统管理的命令的存放,只有超级权限用户root才可执行命令存放,普通用户无权限执行此目录下的命令与/usr/sbin; /usr/X11R6/sbin; usr/local/sbin 目录相似(sbin,只有root权限才能执行)/tmp 临时文件目录,有时用户运行程序的时候,会产生临时文件。
/var/tmp目录和此目录相似/usr 系统存放程序的目录,如命令、帮助文件等。
这个目录下有很多的文件和目录。
大部分Linux发行版提供的软件包都安装在此,涉及服务器的配置文件就安装在/ect中。
/usr/share/fonts 字体目录/usr/share/man 或/usr/share/doc 帮助目录/usr/bin 或/usr/local/bin 或/usr/X11R6/bin 普通用户可执行文件目录/usr/sbin 或/usr/local/sbin 或/usr/X11R6/sbin 超级权限用户root可执行命令存放目录/usr/include 程序头文件存放目录/var (vary)此目录经常变动/var/log 用来存放系统日志/var/www 用来定义Apache服务器站点存放/var/lib 用来存放一些库文件,如MySQL的,以及MySQL数据库的存放地。
4、基本命令--查看帮助*** --help *** --?--查看详细帮助man ***--登录login--退出窗口exit--关机shutdown--重启reboot--初始化init (run level -/etc/inittab),0-6看第六部分的g--进入根目录cd /--回上层目录cd ..--相对路径cd dev--绝对路径cd /dev--查用户名whoami--查当前目录pwd--列出当前目录内容ls-l(树详细显示目录内容)-m(横列显示目录内容,是屏幕长度显示)-a(列出全部文件,包括隐藏文件)-S(以文档大小排序)--创建目录mkdir dname--删除目录rmdir dnamerm -r *** -(递归删除该目录下所有内容,询问每个准备删除的文件)rm -rf ***-(强制删除该目录下所有内容,不询问)--创建空白文件touch ***(ps:从技术的角度来讲,linux的文件后缀名没有任何意义)--复制cpcp -r **1 **2 (复制1到2中)--移动mvmv -t **1 **2 (把2移动到1中)--编辑文本vi [文件名]--查看文本cat 由第一行开始显示文本內容tac 从最后一行显示,可以看出tac 是cat 的倒着写more 一页一页的显示文档內容less 与more 类似,可以往前翻页head 只看头几行-N(数字,可根据行数显示)tail 只看后几行-N(数字,可根据行数显示)nl 显示的時候,顺序输出行号od 以二进制位的方式读取档案內容--查找文本find [路径][查找类型][搜索文件名]如查找rc.local find /etc -name *.local--查找命令信息及其位置whereis 命令如whereis ls--查看环境变量echo $SHELL如echo $PA TH (分大小写:分隔符是:,windows是echo %path%;)--链接ln如ln joe.txt a (硬链接,如同复制一个新文件,joe.txt删除后,a还存在) a是链接的名称,a和joe.txt同步,然后a的内容和joe.txt一样joe.txt改变,a也跟着变如ln -s joe.txt b (软链接,如同创建一个快捷方式,joe.txt删除后,b不存在) --wc 统计指定文本文件的行数、字数、字符数--grep(很常用) 在指定的文本文件中查找指定的字符串grep 字符串文件名--col 见管道..------------------------信息显示命令--------------------------date 显示和设置日期--stat 显示指定文件的相关信息--who、w 显示在线登录用户--whoami 显示用户自己的身份--id 显示当前用户的id信息--hostname 显示主机名称--uname 显示操作系统信息--dmesg 显示系统启动信息--du 显示指定的文件(目录)已使用的磁盘空间--df 显示文件系统磁盘空间的使用情况--free 显示当前内存和交换空间的使用情况--fdisk -l 显示磁盘信息--locale 显示当前语言环境5、挂载点(mount 设备目录挂载目录)--访问设备(那设备当成一个文件,和另外一个文件夹进行绑定)--例如挂载光驱:步骤[cd /mnt]---[mkdir cdr]---[mount /dev/cdrom /mnt/cdr]---[cd cdr]--OK!直接访问光驱内容--卸载挂载设备(umount /dev/cdrom)--注意必须先退出挂载目录,否则出现"device is busy"错误.6、startup-shutdown(linux启动流程)--A、boot sequence(important) linux启动过程a. load bios(hardware information)b. read MBR's config to find out the OS(MBR--Master Boot Record,硬盘第一个物理扇区,柱面0、磁头0、扇区1,包含主引导程序和硬盘分区表)c. load the kernel of the OS(加载为kernel核心的OS)d. init process starts...(启动linux第一个进程init)e. execute /etc/rc.d/sysinit(执行系统最重要的配置文件,后台启用进程)(rc.d--run command)f. start other modules(stc/modules.conf)(开启各种模块,如内存管理模块、硬盘管理模块)g. execute the run level scripts(系统启动是分层次的,根据情况执行,每个层次之间没关系)0 - 系统停机状态1 - 单用户工作状态root2 - 多用户状态(没有NFS)3 - 多用户状态(有NFS)NFS - Network File System 网络文件系统,联网系统4 - 系统未使用,留给用户5 - 图形界面6 - 系统正常关闭并重新启动如:cd /etc -- 有rc0.d、rc1.d、rc2.d、rc3.d、rc4.d、rc5.d等多个文件夹,保存着各个层次执行的进程文件h. execute /etc/rc.d/rc.local (重要)(保存其它进程脚本,如tomcat自动启动,要修改此配置文件)i. execute /bin/login(登录界面)j. shell started...7、vi 文本编辑器--两种模式:命令模式编辑模式--vi [文件名](切换到编辑模式)a append-光标后添加i insert-光标前插入o open-另起一行编辑esc (切换回命令模式):w 存盘:wq 存盘退出:q 退出:q! 不存盘退出dd 删除其中一行dw 删除一个单词(sudo gedit 文本常用linux下的文本编辑器,比vi好用)8、用户设置--切换用户(switch user) su username小技巧:直接exit切换--添加用户useradd username [-g] [组名](分配到某个用户组)(创建后会自动在/home目录下创建该新用户的文件夹,如/home/username)--设置密码passwd username--cd /etc--查看用户信息more password如新增的用户信息:username:x:500:500::/home/username:/bin/bash第一个数字,代表用户组,当添加用户没有指定用户组时,系统会创建一个和用户ID一样的组ID;第二个数字:用户ID号;用户的目录是/home/username;用户的SHELL是/bin/bash(命令--->SHELL[解释命令]--->kenrel内核)SHELL有多种类型,如csh、bash(常用)、bsh、ksh、sh(最原始)--添加用户组groupadd groupname--查看用户组信息more group--删除用户组groupdel groupname--修改用户usermod [-g] [组名] [用户名]--删除用户userdel username然后把/home的文件夹删除了rm -rf 文件夹9、权限file privilege--linux把文件的权限分成四种:r:read w:write x:execute -:none如:-rw-r--r--lrwxrwxrwxdrwxr-xr-xdrwxr-xr-x第一个数字'-'代表文件,其余是文件夹,后9位分为3组,每组有四种权限设置rwx- 第一位表示文件所有者第二位表示和所有者在同一用户组的用户第三位表示不在同一用户组的用户权限--设置权限(随意应用,灵活组合!)1、普通用法--添加权限[chmod +x 文件]如:-rw-r--r-- ---> -rwxr-xr-x--删除权限[chmod -x 文件]如:-rwxr-xr-x ---> -rw-r--r----给自己添加权限[chmod ?+x 文件]如此类推,组--g,其他人--o如:chmod u+x -rw-r--r-- ---> -rwxr--r--chmod g+x -rw-r--r-- ---> -rw-r-xr--chmod o+x -rw-r--r-- ---> -rw-r--r-x2、专业用法chmod 755/777--原理,八进制转二进制如755,111 101 101,rwx r-x r-x777,111 111 111,rwx rwx rwx--修改所有者权限chown (change owner)如:chown 原来文件file1 的所有者是root,改成joe的chown joe file110、管道(把上一个命令执行的结果交给下一个命令)--使用方法:命令1|命令2|命令3......|命令n--使用举例--$ls -Rl /etc | more(如ls -Rl /etc (在控制台模式下,无法返回前面过去的信息),因此需要管道执行该查询,实现分页的工作,ls -Rl /etc | more)--$cat /etc/passwd | wc(显示文件结果,再数数有多少行)--$cat /etc/passwd | grep lrj(显示文件结果,再查找包含lrj的行)--#dmesg | grep eth0(显示系统启动的信息,再查找包含eth0的行--真正含义,检查网卡执行信息是否正常) --$man bash | col -b > bash.txt语法:col [-bfx][-l<缓冲区列数>]补充说明:在许多UNIX说明文件里,都有RLF控制字符。