本节为大家分享linux shell编程的一些基础知识,不了解shell脚本编程的朋友,可以作为入门参考。
1.1 什么是shell 
shell是核心程序(kernel)之外的指令解析器,是一个程序同时一中命令语言和程序设计语言。 
shell的类型:ash,bash,sh,ksh,csh,tcsh 
 -/etc/shells 
 -echo $SHELL 
程序在shell中运行 
shell中可以运行子shell 
 #!/bin/bash 
 echo "hello word" 
 chmod +x xx.txt 
 ./xx.txt
1.2存取权限与安全 
 文件和目录的权限(-rwrr--r--) 
 setuid(suid/guid)(chmod u+s,g+s file) 
 chown 和 chgrp (chown user file/chgrp group file) 
 unmask(unmask nnn) 
 符号链接(ln [-s] source_path target_path) 
 ls -lh 查看各个文件占用的空间大小 
 chmod [who] operator [permission] filename 
 who(u,g,o,a) u:用户, g:全部用户, o:其他用户,a:全部 
 operator(+,-,=) +:增加 - :减少 = :设定某个权限 
 permission(r,w,x,s,t) 
 r:可读,w:可写,可更改,x:执行 
 s或S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。 
 T或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。 
 [hadoop@localhost ~]$ ls -lh 
 总用量 32K 
 drwxr-xr-x. 2 hadoop hadoop 4.0K 4月 7 01:08 公共的 
 第一列:第一个字符表示文件的类型:目录或者文件,连接等 
第2,3,4位表示:当前用户对此文件的权限:读,写,执行 
第5,6,7位表示:所属组的权限:执行,读 
最后三位表示:其他用户对此文件用户的权限 
 第二列:文件硬链接数或目录子目录数 
 如果一个文件不是目录那么这一字段表示,这个文件所具有的硬链接数,即这个文件总共有多少个文件名.查看第一个文件: 
 -rw-r--r-- 1 root root 1581 11月 24 18:14 anaconda-ks.cfg 
 第2字段的值为1,说明这个文件只有anaconda-ks.cfg这一个文件名.即只有一个指向该链接的硬链接. 
 如果我用ln,做一个指向该文件的硬链接再查看该文件,该文件的第2字段就会变成2: 
 
 此时,anaconda-ks.cfg 和anaconda-ks.cfg.hardlink 称为互为硬链接.他们指向同一个文件,无论是修改哪一个文件,另一个里也做相应的变化,因为实际上他们指向同一个文件. 
用ls -i anaconda-ks.cfg可以查看它的文件节点(inode) 
互为硬链接的文件具有相同的文件节点. 以下是验证实验: 
 
可以看到,这两个文件具有相同的文件节点号:18102 
如果你知道一个文件有多个文件名,如何查找他的其他文件名分布在什么地方呢? 
可以先用ls -i 获得它的节点号,然后用find查找, 如/etc/sysconfig/networking/devices/ifcfg-eth0就具有多个文件名,我要查找与它互为硬链接的文件: 
 
得到它的节点号为 147181 
再用find查找: 
 
这样就得到了同一个文件的不同文件名的位置. 
************************************* 
如果是一个目录,第2字段的含义: 
************************************** 
如果是一个目录,则第2字段表示该目录所含子目录的个数. 
新建一个空目录,这个目录的第二字段就是2,表示该目录下有两个子目录.为什么新建的目录下面会有两个子目录呢? 
因为每一个目录都有一个指向它本身的子目录"." 和指向它上级目录的子目录"..",这两个默认子目录是隐藏的.用ls -a可以看到. 
每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加. 
-------------------------------------------------------- 
第三列:文件的拥有者 
第四列: 文件拥有者所在的组 
第五列:文件文件大小(以字节为单位) 
第六列:文件创建月份 
第七列: 文件创建日期 
第八列: 文件创建时间 
文件创建的时间可以通过touch命令来修改.如: 
#touch testfile
可以把testfile的创建时间修改为当前时间. 
touch的详细用法请看链接文档: 
#man touch
另外,一个文件还有最后访问时间,最后修改时间等属性. 
这些属性可以用ls 的其它参数显示出来. 
第九列:文件名 
如果是一个符号链接,那么会有一个 "->" 箭头符号,后面根一个它指向的文件名. 
如果想改变一个文件的权限,必须是root用户或者文件的拥有者 
chown [-cfhvR] [--help] [--version] user[:group] file... 
user : 新的档案拥有者的使用者 ID 
group : 新的档案拥有者的使用者群体(group) 
 -c : 若该档案拥有者确实已经更改,才显示其更改动作 
  -f : 若该档案拥有者无法被更改也不要显示错误讯息 
  -h : 只对于连结(link)进行变更,而非该 link 真正指向的档案 
  -v : 显示拥有者变更的详细资料 
  -R : 对目前目录下的所有档案与子目录进行相同的拥有者变更(即以递回的方式逐个变更) 
  --help : 显示辅助说明 
  --version : 显示版本 
 chown 和 chgrp (chown user file/chgrp group file) 
相关阅读:
改变文件所属的用户或者组 
 chown [-R] owner filename 
 chown ower.group filename 
 chown .group filename 
 chgrp [-R]group filename
umask 
 umask的值共有4位,分别代表:gid/uid,属主,组权,其它用户权限。一般用的是后3位。 
 umask设置的是权限“补码”:如上umask值为022,则对应目录权限为7-0=7,7-2=5,7-2=5,即用777减去umask的相应位上的值;而对应的文件权限是用666减去umask的相应位上的值
修改umask的值 
输入:umask 024,则可直接修改以后新建的目录和文件的默认权限为:553,642。 
//在文件 /etc/profile里可以设置umask值
符号链接 
硬链接 
软连接 
ln [-s] source_path target_path 
1.Linux链接概念 
Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(SymbolicLink)。默认情况下,ln命令产生硬链接。
1,硬连接 
 硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
2,软连接
 另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
3.通过实验加深理解 
 
从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。 
 
通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效
3.总结 
可以做一些相关的测试,可以得到以下全部结论: 
1).删除符号连接f3,对f1,f2无影响; 
2).删除硬连接f2,对f1,f3也无影响; 
3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效; 
4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。
别名的使用 
Linux 提供的命令别名功能很有用.比如我经常使用ll | more 命令,而不是直接使用ll.但又不想敲那么多的字符.那么,可以给ll | more设置别名: 
 
试试命令lm,它的效果跟ll | more一样! 再比如DOS下的清屏命令是cls,而Linux下是clear.如果在Linux下也想使用cls,可以给它设置一个别名: 
 
直接输入alias,可以查看当前设置的命令别名: 
 
如果想取消命令别名,使用unalias即可 
 
命令替换 
myfile的内容两个文件名:pram findfile 
ls `cat myfile` -al 
后台运行 
在后台执行程序 
nohup /root/start.sh & 
使用 jobs 查看任务 jobs -l 
管道 
cat xx.txt | more 
模式匹配 
ls *.txt -l 
特殊字符 
双引号:用来使shell无法认出空格,制表符和其他大多数的特殊字符。 
单引号:用来使shell无法认出所有特殊字符。 
反引号(`):用来替换命令。 
反斜杠:用于去除一个单个字符的特殊意义,它保留了跟随在之后的字符的字面值。 
分号:用于在同一行上放多个命令。 
&:命令后台执行。 
括号():创建成组的命令。 
竖杠(|):管道标示符。 
< >&:表示重定向。 
* ? [ ] !:表示模式匹配。 
#:表示注释(除第一行外)。 
空格,制表符,换行符:当做空白。