shell学习

 

查看shell版本

cat /etc/shell

 

shell解析命令:shell读入命令行,并对其分解为词,称为token。shell会检查第一个token是否为内部命令或者磁盘上的可执行程序,如果是内部命令,那么shell在自己内部执行,如果不是找到路径变量所指的程序,创建一个新线程执行它。

 

进程,标识符 PID

 

正在运行的进程  ps aux

查看进程及子进程的情况 ptree

 

系统调用

shell可以派出其他进程,事实上,如果用户在提示符输入命令或者运行shell脚本,shell会负责找到相应的命令,并执行。这个过程称为  系统调用 System call 。

 

系统调用 fork ,进程是系统通过调用fork 创建的。

系统调用wait,当子进程处理重定向,管道和后台细节时,父shell进入休眠状态。

系统调用exec,子shell负责运行用户命令,它是通过系统调用exec 实现的。

系统调用exit,子进程通过调用exit终止,向父进程发出一个信号量并等待父进程接收它的退出状态,信号量是一个0-255的数字,0 代表正常退出,不为0,代表发出了错误。 $?,或 $status 会保存上个程序的

退出状态。

 

暂停进程多少秒   sleep 60 , sleep60& ,&代表程序在后台运行

终止进程 kill ; ctrl +C

 

环境与继承

所以权

UID GID 

EUID有效用户标识, EUID有效用户组标识,决定了进程读,写,可执行的访问权限

UID 在/etc/passwd

 

命令 id 查看 UID,GID

 

文件掩码

当前用户,用户组,其他用户

r 4 ; w 2 ; x 1;

一开始文件的掩码是 0 0 0 ,目录的权限是 7 7 7 ,文件的权限是 6 6 6 

 

去掉权限 unmask

增加权限 chmod

 

查看文件权限 ls -l file

增加权限 chmod 755 file , 给文件用户增加rwx ,组 r-x,其他用户 r-x

                chmod g+w file

                chmod go-rx file  组和其他用户 去掉rx权限

                chmod a=r file  所有权限重置,all代表只给读权限 ,all =u 用户,g 组,o 其他

 

chown命令

 

变量

局部变量 和 环境变量

局部变量用 set 

环境变量 env查看

 

文件描述符 和  重定向

头3个文件描述符 0 是标准输入 ;1是标准输出;2是标准错误输出。

 

重定向:当问文件描述符被分配给终端以外的对象时,就称为IO重定向。

 

who > file1 

cat file2 >>file1

find . sh  2 > errors 错误输出到errors

>& file 代表把前面命名的全部错误输出到file , &> file 是同样的效果

 

 bash shell 语法

起始行#!/bin/bash ;#!/bin/csh代表使用了那种shell解释脚本的行
注释 #
通配符 * ? [] 常用于文件扩展名,!历史命令符,> < |重定向,防止这些字符被shell解析,需要用反斜杠或者引号进行引用。rm *; ls ??; cat file[1-3] ; !! ; echo Oh, body!
显示输出 echo "hello"
局部变量 作用域被限定在当前shell中, var=value; name="hello"
全局变量 又称环境变量,在当前shell创建,并能在该shell派生的任意进程中使用。export VAL=value ;
获取变量 使用美元符号 $VAL
读取用户输入 read命令用于从用户输入读取一行,如果read命令中有多个参数,那么将输入这一行分解为多个单词。read name; read a1 a2 a3
参数 从命令行传递参数给脚本,位置参数 $1,$2,$3 ; $argv[1],$argv[2];$*所有参数,$#参数个数
数组 用空格符隔开组成的词表,使用一对圆括号扩起来。除了使用位置参数访问数组,还可以使用0开始下标访问。declare -a fruit=(apple pears) , $fruit{0}; set apple pears ,print $1 $2
命令替换 将Linux命令的输出赋给一个变量,或者在字符串中使用某个命令输出,使用反引号引起来。set today=`date` ; echo "today is `date`"
算术运算 declare -i 声明一个整型变量 ;算术运算使用 (()) let 命令 ((n=5+5)) echo $n
文件测试 -r -w -x -e该文件存在 -o文件属于当前用户 -d 文件是目录 -f普通文件 -z文件长度为0
条件语句 ((算术表达式)) []旧的测试命令,依然可用。 新的测试命令[[]],用于条件表达式的模型匹配,if (()) if [[]]

 

 

bin\bash的区别以下有很多用法

$()  用于命令替换  ${} 特殊用法,截断功能,字符串提取,字符串替换,针对不同变量状态赋值,获取变量的长度${#param},数组运算

 ()只是对一串命令重新开一个子shell进行执行,{}对一串命令在当前shell执行ech

 echo $(date) ; 相当于执行date命令,结果为2017. 然后把结果替换到$() 原来的位置, echo 2017. 

 https://www.cnblogs.com/cornerxin/p/9105612.html

 

 

正则表达式,/ pattern / 模式,使用 / 号括号引用模式。

 

元字符功能示例,匹配对象
^ 行首定位符 /^love/ 匹配love开头的行
$    
. 单个字符  
* *前面的0个或者多个字符  /o*ve/ *号是和o黏在一起的,它可以匹配0个或者多个o字符,且后面的两个字符必须是ve,比如love,lve,looooove等。
[]    
[x-y]    
[^]    
\ 转义字符  
附加的元字符    
\< 词首定位符  
\> 词尾定位符  
\(..\) 匹配稍后将要使用的字符标签,使用\1,\9表示,只能使用9个标签 /\(love\) able\1er/
x\{m\} ,x\{m,\},x\{m,n\} m次,至少m次,至少m次,且不超过n次  

 

        

使用正则表达式,vi grep sed awk中都用到正则表达式。

 

VI

vi中使用正则表达式,进入insert 模式后,在 尾行 直接输入 / pattern / 即可进行查找

 

GREP

grep命令 在一个或多个文件中查找某个字符模式,并把它打印,不做任何更改,模式可以是一个单词,可以是一个括号包含的字符串,模式后面全部都是文件的名字。

如果模式包含空格,那么需要使用括号。

 

grep word file1 file2

grep (word g) file1 file2

cat file1 | grep word

 

查找成功grep的退出标识是 0,找不到是 1,找不到指定文件是 2.

 

grep 'pattern' file 也是可以的,输出匹配成功的行。

 

选项 -n 输出匹配的行号 -i 关闭大小敏感 -v 打印输出不包含模式的行,可以用作删除文件特点的行,通过重定向输出到一个文件。

-w 输出pattern作为一个词,而不是词的一部分的 行。

 

扩展的egrep 

egrep不允许使用\(\) \{ \}

新增的元字符

+ 匹配1个或多个前面的字符
? 0,1个前面的字符
a|b 二选一
() 字符组

 

 

fgrep 不对任何的元字符做任何处理,字符本身代表他们本身字符,脱字符就是脱字符,美元符就是美元符

fgrep $hh file , 匹配$hh的行

 

递归地查找文件,可以在文件目录下

grep -r 'Tom'  ./dir

rgrep 'Tome' ./dir  在./dir目录下,查找包含Tom文件

 

SED

sed是一种新型的,非交互式的编辑器,它没有破坏性,不会修改文件,只会在屏幕输出结果。

 

sed的输出状态 只要语法不错误,输出status都是0

 

正则表达式是在 斜杠内的

sed -n '/RE/p' filename  p代表打印

 

sed 'commod'  filename

 

sed '1,3d' data 删除文件1-3行,d代表删除

 

三个选项 -n 取消默认的输出 -f指定脚本 -e 是多重命令编辑

命令 

对所选择的行以外的行执行相应操作
d 删除行
p 打印输出
g 行内执行全局替换
s 用字符替换另一个字符
a\ append
c\ 替换当前行
r 从文件中读取输入行

 

 

示例

sed 's/west/north/g' file 行内的所有west被替换成north ,如果没有g命令,那么只有第一个west被替换。

 

默认的匹配分隔符是 反斜杠,但是是可以替换的,只有跟命令s凑近,就可以改变,比如 sed 's#87#jj#g' file

 

指定行的范围,使用逗号 ,

sed '/sd/, /df/p' file 打印所有在sd , df 之间的行

 

-e 

sed -e '1,3d' -e 's/gh/de/p' file 

两重编辑,第一次编辑操作是删除行,第二次编辑是替换字符,前面的编辑结果是后编辑结果的输入

 

r, w, a,i

读命令,把文件的内容读到当前行

写命令,把当前行写入文件

追加,插入操作要求后面添加一个斜杠操作符,因为要求转义,所有还需要再添加一个反斜杠

 

awk 处理数据和生成报告的UNIX编程语言

 

awk 的命令包含两个部分,一个是模式,一个是动作

awk nawk新版 gawk GUN版本

 

nawk 'pattern' filename

nawk '{action}' filename

nawk 'pattern {action}' filename

 

awk工作原理

awk是逐行分析,它先读取第一行记录,赋予一个内部变量$0 ;

然后对这一行进行分词,每个单词使用空格隔离,并把它们赋值给内部变量$1,$2 .... 多达100个内部变量,awk使用一个内部变量存储FS确定字段的分隔符

解析完成后,接着读取下一行,下一行的记录赋值$0.

可以使用 {print $1, $3} ,$1,$3之间的逗号称为输出字段分隔符,使用一个内部变量OFS存储,OFS是空格,逗号会被OFS的字符替换。

 

格式输出

awk '{print "Month:" $2 "\n,\t,\fYear",$6}

 

OFMT变量="%0.6gd" 打印数字

 

awk的内部变量

ORS,RS 输入和输出记录的分隔符

NR记录号,索引号

-F 命令可以更改ORS,RS的字段分隔符,

 

模式

& 用在替代串中,代表查找串匹配到的内容

~ 匹配操作符,用于对记录或字段的表达式进行匹配

awk '$1 ~ /bili/' file 对$1进行匹配

 

 

bash shell 启动

系统启动,运行第一个进程init , 然后派生出getty 进程,接着执行 /bin/login 进程,登录进程会启动用户登录的shell,也就是/bin/bash 。

bash进程查找用户/etc/profile系统文件,执行里面的命令,然后在它用户的主目录下查找一个名为 .bash_profile的文件,执行里面的命令,然后执行用户的ENV文件,叫.bashrc.

 

环境

一个进程的环境包括许多,比如打开的文件,变量,当前的工作目录,函数,资源,信号量等。

初始化文件

bash shell有许多的启动文件,这些文件是可以执行source命令的。对一个文件执行source命令,会让当前文件的所有设置成为shell的一部分,而不是派生子进程执行。

初始化文件是否执行source命令,取决与当前的shell 是否是一个登录shell。

 

登录时,会对用户的 .bash_profile .bash_login  .profile 执行source命令。

 

/etc/profile是一个系统级别的初始化文件,在用户登录时执行指定任务,会在shell启动时被执行。

/etc/motd 显示文件,会记录当日信息之类的任务

 

用户注销时,如果有 .bash_logout 存在,就对其执行source命令。

 

禁止执行启动文件的选项 --noprofile , bash --noprofile 方式启动shell,就不会执行启动文件

 

bash -p 不会读取用户的.profile 文件

 

内置的 set shopt 命令设置bash选项

 

提示符

用户登陆后,会使用美元符号作为提示符,bash提供了4  种提示符,主提示符是 美元,次提示符 是 > ,保存 第三,第四提示符 是 PS3, PS4。

 

变量PATH 用来设置命令的搜索路径

 

hash命令,通过一张表,寻找路径,值是 命令的 位置

 

source  ,dot命令 通常用来重新执行启动文件,时修改生效

source .bash_profile

dot 命令就是 . 命令  . .bash_profile

 

命令行

commod& , &会让命令在后台运行

commod &&commod ; commod|| commod 条件命令

 

作业控制 

ctrl C 终止任务,停止发送信号量

ctrl D暂停任务

jobs 命令 显示在运行的进程  相关命令fg bg

 

fc  命令

 

命令行编辑,可以在 .bashrc 文件设置 默认的编辑器

set -o vi  ; set -o emacs

 

算术运算的两种形式

$[     ]

$((   )) 

 

函数,一经定义,就成为当前shell的一部分,可以重复调用,但是一般会把函数定义在 .bash_profile文件

function_name () {  commmod } 

function  function_name {  commmod }   新的

function   function_name () {  commmod }  旧的

 

exec 命令 能在启动新的shell前提下,将当前运行的程序 替换 成 新的程序

 

bash shell 编程

read 把输入一行,赋值给内置变量REPLY

 

算术运算

X=2#101 二进制101被以2为基赋值给变量X,X=5

Y=8#17 , 8进制数17赋值给Y, Y=16

#前面的是进制,后面是数值

let = ((  ))

 

调试

bash +x name

bash -v name

bash -n name

set -x

set +x

 

posted @ 2020-10-13 16:27  lfcom  阅读(170)  评论(0编辑  收藏  举报