linux shell脚本编程基础教程
本节为大家分享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:
复制代码 代码示例:
[root@localhost ~]# ln anaconda-ks.cfg anaconda-ks.cfg.hardlink
[root@localhost ~]# ls -l
总用量 4071
-rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg
-rw-r--r-- 2 root root 1581 11月 24 18:14 anaconda-ks.cfg.hardlink
此时,anaconda-ks.cfg 和anaconda-ks.cfg.hardlink 称为互为硬链接.他们指向同一个文件,无论是修改哪一个文件,另一个里也做相应的变化,因为实际上他们指向同一个文件.
用ls -i anaconda-ks.cfg可以查看它的文件节点(inode)
互为硬链接的文件具有相同的文件节点. 以下是验证实验:
复制代码 代码示例:
[root@localhost ~]# ls -i anaconda-ks.cfg
18102 anaconda-ks.cfg
[root@localhost ~]# ls -i anaconda-ks.cfg.hardlink
18102 anaconda-ks.cfg.hardlink
可以看到,这两个文件具有相同的文件节点号:18102
如果你知道一个文件有多个文件名,如何查找他的其他文件名分布在什么地方呢?
可以先用ls -i 获得它的节点号,然后用find查找, 如/etc/sysconfig/networking/devices/ifcfg-eth0就具有多个文件名,我要查找与它互为硬链接的文件:
复制代码 代码示例:
[root@localhost ~]# ls -i /etc/sysconfig/networking/devices/ifcfg-eth0
147181 /etc/sysconfig/networking/devices/ifcfg-eth0
得到它的节点号为 147181
再用find查找:
复制代码 代码示例:
[root@localhost ~]# find /etc -inum 147181
/etc/sysconfig/networking/devices/ifcfg-eth0
/etc/sysconfig/networking/profiles/default/ifcfg-eth0
这样就得到了同一个文件的不同文件名的位置.
IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家
如果是一个目录,第2字段的含义:
IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家IT之家
如果是一个目录,则第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.通过实验加深理解
复制代码 代码示例:
[root@localhost ~]$ touch f1 #创建一个测试文件f1
[root@localhost ~]$ ln f1 f2 #创建f1的一个硬连接文件f2
[root@localhost ~]$ ln -s f1 f3 #创建f1的一个符号连接文件f3
[root@localhost ~]$ ls -li # -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r--2 oracle oinstall 0 Apr 21 08:11 f1
9797648 -rw-r--r--2 oracle oinstall 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。
复制代码 代码示例:
[root@localhost ~]$ echo "I am f1 file" >>f1
[root@localhost ~]$ cat f1
I am f1 file
[root@localhost ~]$ cat f2
I am f1 file
[root@localhost ~]$ cat f3
I am f1 file
[root@localhost ~]$ rm -f f1
[root@localhost ~]$ cat f2
I am f1 file
[root@localhost ~]$ cat f3
cat: f3: No such file or directory
通过上面的测试可以看出:当删除原始文件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设置别名:
复制代码 代码示例:
[root@localhost ~]# alias lm='ll | more'
试试命令lm,它的效果跟ll | more一样! 再比如DOS下的清屏命令是cls,而Linux下是clear.如果在Linux下也想使用cls,可以给它设置一个别名:
复制代码 代码示例:
[root@localhost ~]# alias cls='clear'
直接输入alias,可以查看当前设置的命令别名:
复制代码 代码示例:
[root@localhost ~]# alias
alias cls='clear'
alias cp='cp -i'
alias l.='ls -d .IT之家 --color=tty'
alias ll='ls -l --color=tty'
alias lm='ll | more'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot -- show-tilde'
如果想取消命令别名,使用unalias即可
复制代码 代码示例:
[root@localhost ~]# unalias cls
[root@localhost ~]# unalias lm
[root@localhost ~]# alias
alias cp='cp -i'
alias l.='ls -d .IT之家 --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
命令替换
myfile的内容两个文件名:pram findfile
ls `cat myfile` -al
后台运行
在后台执行程序
nohup /root/start.sh &
使用 jobs 查看任务 jobs -l
管道
cat xx.txt | more
模式匹配
ls IT之家.txt -l
特殊字符
双引号:用来使shell无法认出空格,制表符和其他大多数的特殊字符。
单引号:用来使shell无法认出所有特殊字符。
反引号(`):用来替换命令。
反斜杠:用于去除一个单个字符的特殊意义,它保留了跟随在之后的字符的字面值。
分号:用于在同一行上放多个命令。
&:命令后台执行。
括号():创建成组的命令。
竖杠(|):管道标示符。
< >&:表示重定向。
IT之家 ? [ ] !:表示模式匹配。
#:表示注释(除第一行外)。
空格,制表符,换行符:当做空白。
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/shell/8624.shtml
相关文章
热门TAG
命令 外链 企业网站 白帽 php 织梦教程 dedecms修改内容 javascript 织梦 功能 标签 调用 详解 技巧 权重 服务器 网站流量 Dedecms 织梦cms HTML tags标签 python jquery教程 jquery windows 蜘蛛 搜索引擎 网站收录 JSP 实例解析最新文章
-
PHP生成奖状
时间:2021-01-06
-
python实现输入五个数并求
时间:2021-01-06
-
php检测网站是否正常打开
时间:2021-01-05
-
python怎么右对齐
时间:2021-01-05
-
Python3爬虫入门之Python3的安
时间:2021-01-05
-
如何用PHP接收http请求头信
时间:2021-01-05
-
数据库怎么连接用php写的
时间:2021-01-05
-
php后缀怎么打开
时间:2021-01-05
热门文章
-
解析shell字段分隔符的用法(图文)
时间:2020-12-22
-
Python3爬虫进阶:MongoDB存储(非关系型数
时间:2020-12-29
-
如何在Linux或者UNIX下调试Bash Shell脚本
时间:2020-12-22
-
关于php中匿名函数与回调函数的详解
时间:2020-12-29
-
php文档怎么打开
时间:2020-12-29
-
php检测网站是否正常打开
时间:2021-01-05
-
PHP PHP_EOL 换行符
时间:2020-12-29
-
python实现输入五个数并求平均值
时间:2021-01-06
-
浅谈Linux Shell的管道与重定向
时间:2020-12-23
-
如何检测Django是否安装成功
时间:2020-12-29
