二 shell 基础
一 文件的 权限基础
文件有三类权限 user,group,other,
权限分为 r w x 代表数字分别为 4 2 1
修改权限命令 chmod
权限还有特殊权限,在执行的时候代表某一身份的权限去执行
分别有文件拥有者权限,组权限,所有人权限。
文件拥有者身份的权限即在 user权限将执行权限x改成s。即 rwx=>rws来表示。权限值则为在原有权限前加4000.如原权限为 755,则现权限则变更为4755
组身份权限 即将组的执行权限的x变更为s。权限值为在原有权限前+2000.即755=》2755
所有人执行的权限即在所有人权限组中将x=》s。权限值+1000 即 755=》1755
chmod命令,可以用权限值也可以用标识符
即 chmod +x aa.sh 等同于chmod 755 aa.sh.即对三种身份加上可执行权限
单独针对某一群组增加可执行权限,可以如下操作
chmod u+x/g+x/o+x来操作
去掉某一群组的权限
chmod u-x/g-x/o-x来操作执行
二 通配符
重点的两个通配符 * 和?
* 代表任意字符,可以是空字符串
?代表单一字符,不可以为空字符
例
ls -la /usr/bin/* #列出bin下的所有文件 ls -la /usr/bin/???? #列出bin下的四个字符的文件
还有一些例子。我觉得很实用
转义字符 “ \”
例 echo 9 \* 9 =81 即将*转义成乘号
注意: 单引号转义
echo 'This is jack's book' 这种就无法通过\转义 ,echo 'This is jack\'s book' 因为在shell中,系统会将\当成续航符,认为输入未完成,而允许用户继续输入
争取的做法为
echo This is jack's book 外层不加单引号
echo "This is jack's book" 用双引号括起来
echo 'This is jack'\''s book'
常见的转义字符有
字符集合
用途:对集合内部的任意字符进行匹配,字符集合就是【】中所列的字符范围中的某一个字符,其长度为1
符号: 【】
例子:
ls -la [abc]* #查询首字母为a,b,c的所有文件
注意: “-”字符,因为该字符代表的是字符集合的范围,如上图中【a-z】表示从a-z范围中的任意字符。拿如果要表示-字符时,就需要用下划线_放到横杠的前面来表示待-的字符
ls -la /usr/bin/[a-z_-]#表示查询从a-z以及带-字符的所有文件
非 集合 !
如[!0-9】 【!a-z】等
如果要将!认作叹号而非 非集合字符时,则需要转义字符\来转义
注意:在集合中,无论是.还是*都只代表单一字符,没有任何其他的特殊含义。
[,*] #只代表1,, ,.,*这五个字符其中之一
括号扩展
字符串组合 {}
ls -la /usr/bin/{g,nc,s}ftp #将{}中的字符与后面的ftp进行组合查询
举例说明
ls -la /usr/{sb,b}in/*er #查询sbin和bin中的所有以er结尾的文件
[root@localhost ~]# echo {,,,,,,,,}\*{,,,,,,,,}
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
系统默认开启文件
每个shell script执行时,系统都会默认开启三个标准文件。标准输入 stdin 标准输出 strout 标准错误 strerr
这里有个文件代码的概念,我没有理解,他的用途是什么?百度了一下,找到了答案:
摘抄 https://www.cnblogs.com/YaoDD/p/4921685.html
shell script 学习笔记-----标准输出
1、将标准输出(stdout)和标准错误输出(stderr)分别重定向到两个不同的文件
其中符号'>'默认将标准输出重定向,意思和'1>'相同,‘2>'表示重定向标准错误输出,数字1和2其实是文件描述符,在Linux下默认1为标准输出STDOUT,2为标准错误输出STDERR
2、将标准输出和标准错误输出重定向到同一个文件中,共有下图所示三种写法,后两种写法可以认为符号&是作为特殊标记了,第一种写法则可以看做先将STDOUT输出到both文件,“2>&1”则可将1理解为标准输出重定向的文件,然后“2>&1”相当于一个赋值操作,将文件描述符2指向的文件赋值为文件描述符1指向的文件
3、重定向符'>'默认会将目标文件清空(如果存在的话),然后添加重定向的内容。如果需要在目标文件的末尾进行添加,则需要使用">>"重定向符,如下所示
4、/dev/null是Unix/Linux系统中一个特殊的设备,它并不是真正的设备,所有你认为没用的数据都可以重定向到它,并且不会占据任何磁盘空间,如下图就将错误信息扔进了/dev/null中
5、将多个命令的输出重定向到同一个文件有以下两种方式,但是基于的原理是完全不同的,花括号那组其实只是将括号中命令的输出集中重定向而已,但是普通括号内的命令是在子shell,也就是subshell中运行的。这时我们就会发现,因为cd指令的存在,第一条命令运行后我们仍在之前的目录(因为subshell中位置的改变与父shell无关),但是第二条指令运行之后,我们就在上级目录了
6、将一个程序的输出作为另一个程序的输入,最常见的如下图所示,但是需要注意的是,这两个程序是运行在不同的subshell中的!
7、将管道中的数据流备份:使用如下所示是tee命令,它将数据量输入下一级管道的同时,将它们备份到tee.file文件中
8、将数据重定向到多个文件中,如下图所示,其实本质上就是将写入不同文件描述符的数据重定向到不同的文件中,这样的话,在程序中可以不事先打开文件,而直接向文件描述符写数据,例如:write(3,buf,255),就是直接向文件描述符3写数据,而我事先并没有打开文件的操作
9、如果没有使用特殊的手法,例如将STDERR重定向至STDOUT或者在程序中就进行重定向,那么管道只重定向STDOUT,我们没有办法只重定向STDERR而不重定向STDOUT
10、交换STDOUT和STDERR:如果你想要将STDOUT输出到stdout.logfile中,并且通过tee将STDERR即输出到屏幕又输出到stderr.logfile。这时就需要使用下图所示的方法。其实本质上就是交换了STDOUT和STDERR。类似于两个整数的交换。首先将描述符3赋值为1,即STDOUT,再将标准输出的内容输出到stdout.logfile中,最后"2>&3"表示将标准错误的数据往标准输出中写,因为此时描述符3的值就是标准输出,这样标准错误的内容就能通过标准输出通过管道了
11、我们知道重定向符号'>'会覆盖目标文件中的内容,那么为了防止误操作导致重定向覆盖了我们原先不想被覆盖的文件,我们可以采用如下的方法,如果要恢复默认设置,使用“set +o noclobber”,如果在已经设置了noclobber的情况下,仍然强行做一次重定向覆盖操作,则可使用类似“echo do it >| my.file”的方法,“>|”表示强行重定向覆盖操作
参考文献:《bash Cookbook》,Carl Albing
看到以上的摘抄之后,尤其是第一和第二两个举例,我们就可以明白,可以通过1,2来将输出信息重定向。
标准输入/输出转向
将标准输入/标准输出 重新定向到别的文件。就是上面摘抄中的举例1,2等。学过鸟叔的书中,可以看到,很多shell都会将输出定向到/dev/null这个黑洞中。就是这样用的。
转向输出时,如果输出文件不存在则会创建新文件,如果已存在,则会将源文件内容清空,再输出。如果想在后面继续附加内容,则需要转向附加操作符
>> 则会在文件后面追加标准输出的内容
转向输入
[root@localhost ~]# wc -l #按ctrl+D,则会输出输入的行数
[root@localhost ~]#
同样,如果我们要统计某一个文档的行数时,可以利用标准输入专向来操作。例
[root@localhost ~]# cat /var/log/pcp/pmlogger/pmlogger_daily.stamp #查看该文件的内容。可以看到有两行内容
# -- :: [root@localhost ~]# wc -l < /var/log/pcp/pmlogger/pmlogger_daily.stamp #将该文件,输入到wc-l中 [root@localhost ~]#
转向输出和转向输入的混合使用
用法: 命令或Script < 输入文件 >输出文件
将输入文件的内容,输出到输出文件中
sort < unsort.txt > sorted.txt #将未排序的unsort.txt文件的内容,排序后输出到sorted.txt文件中
利用转向输出做简易编辑
[root@localhost ~]# cat > out.sh
#! /bin/bash echo hello world![root@localhost ~]# sh out.sh
hello world!
[root@localhost ~]# man cat
CAT() GNU CAT() NAME
cat - 连接文件并在标准输出上输出 SYNOPSIS 总览
cat [选项列表] [文件列表]... DESCRIPTION 描述
将文件列表中的文件或标准输入连接到标准输出。 -A, --show-all
等价于 -vET 。 -b, --number-nonblank
给非空输出行编号。 -e 等价于 -vE 。 -E, --show-ends
在每行结束显示 $ 。 -n, --number
给所有输出行编号。 -s, --squeeze-blank
将所有的连续的多个空行替换为一个空行。 -t 等价于 -vT 。 -T, --show-tabs
把 TAB 字符显示为 ^I 。 -u (被忽略的选项) -v, --show-nonprinting
除了 LFD 和 TAB 之外所有控制符用 ^ 和 M- 记方式显示。 --help 显示帮助并退出。 --version
显示版本信息并退出。 没有指定文件或指定的文件是 -,则从标准输入读取。
管道
管道的意义:
管道的意思就是将一个程序的输出,放到管道中,作为另一个程序的输入。从而链接两个程序之间的通道
用法:
基本型 : 命令1 | 命令2
[root@localhost ~]# cat unsort.txt | sort
读取unsort.txt内容,用sort命令排序
[root@localhost ~]# cat unsort.txt | sort > sorted.txt
读取unsort.txt内容,用sort命令排序后输出到sorted.txt文档中
[root@localhost ~]# cat sorted.txt | lp
读取sorted.txt内容输出到lp打印程序中
多管道组合: 命令1 | 命令2 | 命令3 |。。。。| 命令n
一个查询apache日志中 4XX错误的脚本
[root@localhost ~]# grep '".*" 4[0-9][0-9]' access.log | grep -o '".*" 4[0-9][0-9]' | sort | uniq -c | sort -n | tee alog.txt
grep从access.log中将行按照要求取出来=》将这些行按匹配要求取出相应的数据=》排序=》删除重复行,并统计重复数据的次数=》排序=》交给tee打印并输出到alog.txt文档中
前后台工作
这个在鸟个的书中也学习过,就是前后台搭配使用。
& 符号 。意思就是将命令丢到后台执行
当后台执行完毕后,会出现
很简单,不是么?如果想详细了解,还是要看鸟哥的前后台的文章。
二 shell 基础的更多相关文章
- shell基础及变量
一 Shell概述 1.Shell的作用——命令解释器,“翻译官” shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的2进制代码,并将执行的结果返回在标准终端上. ...
- shell基础二十篇 一些笔记
shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...
- 运维 04 Shell基础命令(二)
Shell基础命令(二) 查看Linux的发行版 cat /etc/redhat-release cat /etc/os-release 查看系统用户的id信息 id 用户名 id root id ...
- LINUX二十个基础命令
LINUX二十个基础命令 一. useradd命令 1.命令格式: useradd 选项 用户名 2.命令功能: 添加新的用户账号 3.常用参数: -c comment 指定一段注释性描述.-d 目录 ...
- shell学习之路:shell基础大全2
原文:http://note.youdao.com/share/?id=cd2ad6e6d5db2b347f92958efc2bdbc1&type=note 正则表达式与通配符: 一.介绍: ...
- shell基础(转)
shell基础1:文件安全与权限 http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger 附:Linux ...
- Linux实战教学笔记17:精简shell基础
第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...
- Linux基础学习(10)--Shell基础
第十章——Shell基础 一.Shell概述 1.Shell是什么: (1)Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来 ...
- Linux Shell基础(下)
Linux Shell基础(下) 目录 一.shell特殊符号cut命令 二.cut.sort.wc.uniq命令 三.tee.tr.split命令 四.简易审计系统 五.fork, exec, so ...
随机推荐
- YOLOV3算法详解
YOLOV3 YOLO3主要的改进有:调整了网络结构:利用多尺度特征进行对象检测:对象分类用Logistic取代了softmax. 新的网络结构Darknet -53 darknet-53借用了re ...
- linux文档和目录结构
Linux文件系统结构 Linux通过操作目录来实现对磁盘的读写.Linux通过使用正斜杠" / "来表示目录. Linux通过建立一个根目录,所有的目录都是通过根目录衍生出来的. ...
- springboot 中的 thymeleaf 页面进阶小知识
我们做好了登录页,那设计一个场景吧,比如我们登录后跳转到公司主页,想从公司主页再跳转到员工列表页: 这样的场景我们该如何实现,首先要知道一些基础知识,就是SpringBoot的一些关于请求的架构知识: ...
- 如何分析及处理 Flink 反压?
反压(backpressure)是实时计算应用开发中,特别是流式计算中,十分常见的问题.反压意味着数据管道中某个节点成为瓶颈,处理速率跟不上上游发送数据的速率,而需要对上游进行限速.由于实时计算应用通 ...
- Transaction 在同一个类中不生效
参考:https://blog.csdn.net/qq_30336433/article/details/83338835 最近在开发项目中踩到一个坑,以此记录下来.以备后来人借鉴 1.相信使用spr ...
- Jesus Is Here
Jesus Is Here Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)To ...
- 服务器在没有request请求时是什么状态
服务器,例如web服务器,在没有接受到request请求时,它是一种什么状态? 是监听状态,就像电灯泡在没通电的时候,没法光,灯泡不会不停的问电线有电吗?有电吗?而是电来了,状态就发生了改变! 服务器 ...
- Linux shell 归纳之 ~/. 是什么意思
假设用户名目录是:/home/test ~> cat ~/.profile ~ 是代表用户名目录/home/test/ .是代表隐藏文件, profile 就是home/test目录下的隐藏文件
- Java连接MySql数据库之JDBC
1.首先创建一个java Project项目 2.起一个英文的项目名 3.此窗口点击NO 4.此时项目状态如下 5.创建一个文件夹,并将mysql-connector-java-5.1.8-bin.j ...
- jsc2019_qualC Cell Inversion
先吐槽一下这个比赛的奇怪名字 这个破名字让我实在不知道博客标题该叫啥/px 题目大意 给你一个长度为2n的序列 包括W和B 每次可以选一个区间将里面的颜色反转 但是每个点只能被作为端点选一次 问将序列 ...