zoukankan      html  css  js  c++  java
  • 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 [[]]

    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

  • 相关阅读:
    SDN实验2:Mininet 实验——拓扑的命令脚本生成
    2020软工实践第一次作业
    POJ2942-Knights of the Round Table
    POJ1966 ZOJ2182<无向图点连通度 Isap版>
    POJ1523(求割点)
    POJ2391(最大流Isap+Floyd+二分)
    POJ1087 ZOJ1157(最大流Isap+map映射)
    POJ1459(最大流Isap)
    数字的字符串处理 (转)
    POJ2112 最大流(Isap+Floyd+二分)
  • 原文地址:https://www.cnblogs.com/lin7155/p/13786767.html
Copyright © 2011-2022 走看看