zoukankan      html  css  js  c++  java
  • shell编程基础练习

    shell作为一个人机交互的接口,在Linux中发挥着很大的作用,而shell编程则是减轻系统工程师工作的利器,这里总结一下shell编程的主要内容(趁着程序运行的空档).

    本文的基本结构是shell编程的基本命令和常用的实例。

    命令篇

    环境变量

    环境变量指的是当shell运行后,系统默认给shell传递的变量。

    $pwd:显示当前路径    
    $HOME:当前用户的主目录
    $#:shell中参数的个数
    $0:shell文件名
    $1-$n:参数值
    具体还有部分预设参数列表,见(此链接)[http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html]。
    

    文件和目录操作

    文件操作的主要命令有:

    cd:切换目录
    ls:列出目录下文件 通常含有 -a(隐藏文件) -l(文件权限)
    mkdir,rmdir:创建,删除目录
    cp,mv,rm:拷贝,移动,删除文件或者目录(rm在删除目录时需要加-rf)
    ln:建立硬链接(ln -s可以建立符号链接)
    chmod:改变文件权限
    //chmod 对文件权限的改变方式有两种:符号方法和八进制方法
    //所谓符号方法就是采用(who)(action)(permissions)来描述对对权限的操作
    //这里who的选择有:u g o a,分别表示属主,组,其他和所有用户
    //这里action的选择有:+ - =,分别表示增加,减少和设定文件权限。
    //这里permision的选择有:r w x t s,分别表示读,写,执行,粘滞位和SGID位
    //所以给个例子 chmod a+x hello.c 意思就是对hello文件的所有人增加执行权限
    //而所谓八进制的方法则是对每种权限用一个数字进行表示,读4写2执行1,对所有用户生效。
    //同样举个例子 chmod 777 hello.c 意思是任何人可以进行任何操作
    chown:改变文件的属主 -R(递归改变该文件夹内多有文件的属主)
    //这里给出用法 chown *user:group files*
    chgrp:改变文件所属的组 同样可以使用上述的-R
    //这里给出用户 chgrp *group files*
    

    输入输出和进程操作

    输入输出是使用命令过程中放入和产生的数据,对文件的输出可以使用最简单的echo和printf来进行,但是这两个命令只能将文件输出到终端上,为了保留我们想要的数据,需要将数据存储进文件的时候,就需要用重定向命令了,重定向命令很简单,按照cmd > files 即可,但是这会让每次重定向时将原来的数据冲掉,所以可以使用 cmd >> files命令在文件尾部进行追加。

    同时,对输入输出的描述还可以使用0,1,2进行简化描述,其中0代表标准输入STDIN,1表示标准输出STDOUT,2表示标准错误STDERR,因此在操作时可以利用0 1 2 进行简化表示。

    另外,还需要注意的是命令的输出可以作为另一个命令的输入,采用|管道命令实现。这是因为每个命令都是一个进程在运行,而使用管道后,其实后一个命令是前一个进程的子进程,这样管道实际上起着进程通信中的管道的作用。将父进程的输出系统传递给子进程。

    对于进程来说,可以分为前台进程和后台进程。很显然,当一个shell在运行前台进程时你是不可以输入的,而将进程放入后台去运行,你则可以在shell中继续干及自己的事情。前面说到了,一条ls命令什么的就是一个前台进程,而后台进程的实现可以在运行命令的末尾加上&来实现,比如说

    ls -n &
    

    这时,shell就会给你返回一条信息, [1] 620类似的,其中的框着的数字就代表是任务标志符,620代表进程标志符。

    这样就涉及到了另外一个问题,那就是前台进程和后台进程之间的切换,这里的切换操作之前可以列出当前的后台任务数,使用命令:

    jobs
    

    接着,可以使用两个简单的命令bg和fg,这两个命令的使用都是 cmd + 一个任务标志,如

    bg %1
    fg %2
    

    等等。再者,如果你想等待后台的某个任务结束,可以使用wait命令,使用的格式同上,只是在wait过程中你是不能输入的。

    最后关于进程操作还有一个重要的命令就是ps命令了,ps命令可以显示出所有正在运行的进程,但是通常情况下,我们都是用grep命令结合管道过滤出我们想要的进程,通常ps的属性项为-aux,即

    ps -aux
    //这里a代表终端中的所有进程 x非终端上的进程 u以用户为主的形式显示程序情况
    当然最后还有进程的杀死命令了,kill,用法很简单,参照bg命令。
    

    流控制 循环和函数

    shell中仍然存在高级语言中的选择和循环结构,下面主要介绍if和while语句。
    if语句的主要格式为

    if ...; then
        do sth,
    else
        do sth,
    fi
    

    case语句也比较常用,主要格式为:

    case keyword in 
        pattern1)
            sth.
            ;;
        pattern2)
            sth.
            ;;
        patterN)
            sth.
            ;;
    esac
    

    while语句的主要格式为:

    while cmd
    do 
        sth.
    done
    

    for循环的主要格式为:

    for name in word1 word2 ... wordN
    do 
        sth.
    done
    

    具体的语句需要在实践中多多使用就可以啦,下面在来说一下函数的简单用法。使用函数之前需要先定义函数,函数的定义方法为:

    function ()
    {
        sth, 
    }
    

    这样,在之后的shell脚本中就可以使用函数了,使用函数的方法为函数名加变量,如function 10 20 30,这样在函数的定义中你就可以使用$1,$2,$3来使用上述的三个变量了。

    文本过滤和处理

    这才是这篇文章的重点呀,文本过滤和处理应该是shell中最常用到的功能了,下来主要说三个博大精深的命令:grep,sed,awk。

    grep命令常用于查找文件中的字符串,其常见的用法为:

    grep word file 
    //从文件file中查找出包含word的行
    //grep的几个参数有
    //-v 后接需要忽略的word 
    //-i 搜索时大小写无光
    //-I 仅仅列出file中包含word的文件名
    

    sed命令后接正则表达式进行文件的过滤,常见的用法有:

    sed 'script' files
    //script可以用来进行打印,删除和替换等操作。
    //当使用打印命令时的格式为:'/正则/p'
    //当使用
    

    其他命令

    列表如下吧~

    head
    指的是取出文件头部的行 可以使用-number来进行具体指定
    例子: head -5
    tail
    和head的用法类似,指的是取出文件尾部的行,同样使用-number具体指定
    tr
    对文件中的符号进行替换
    sort
    对文件内容进行排序,常见的用法有-n(按照数字进行排序) -r(按照逆序进行排列)
    uniq
    将文件中的重复行剔除掉,保证行的唯一性,常见的参数有-c(列出此行出现的次数)
    find
    用于查找文件和目录,产用的参数有-name -type(文件类型) -size(文件的大小)
    xarg
    由于将之前管道中的参数传递进下一条命令中,常用的参数有-I{}(指明参数的代表符) -n(每次传递的个数) -P (使用的进程数) -p(给出用户交互,在执行一条命令之后,等待用户输入)
    最近,发现xargs还有一个好的用法是将文件奇偶行分开,

    cat file | xargs -n2
    

    sleep
    系统延时命令,常见的有sleep 1s,sleep 1m,sleep 1h。
    type:
    bc & expr
    进行数学运算,二者的用法不一样,其中expr的用法为 expr a + b(需要注意的是expr后面的参数都需要加空格) bc的常见用法为 echo "a+b" | bc
    wc
    测试文件中的行数,单词数等。

  • 相关阅读:
    erl_0012 timer:tc 测试模块函数调用运行耗时
    erl_0011 erlang 定时器相关
    erl0010
    erl0009
    erl0008
    erl0007
    erl0006
    erl0005
    开开心心过生活、踏踏实实做技术
    Android-理解Intent
  • 原文地址:https://www.cnblogs.com/nearmeng/p/4043519.html
Copyright © 2011-2022 走看看