查看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 |
条件语句 |
binash的区别以下有很多用法
$() 用于命令替换 ${} 特殊用法,截断功能,字符串提取,字符串替换,针对不同变量状态赋值,获取变量的长度${#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) able1er/ |
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 " , ,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