zoukankan      html  css  js  c++  java
  • Linux下shell编程

    什么是shell

    shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令

    使用<和>对输入输出进行重定向

    使用|在同时执行的程序间实现数据的管道传递

    使用$获取子进程的输出

    /bin/bash --version  // 查看bash的版本信息

    管道和重定向

    重定向输出

    ls -l > isoutput.txt    #把ls命令的输出保存到文件isoutput.txt中,文件不存在则创建,存在则覆盖
    cat isoutput.txt

    文件描述符

    0代表程序的标准输入

    1表示标准输出

    2表示标准错误输出

    追加重定向

    >> 将输出追加到指定文件的尾部

    (base) asgter@asgter-TM1613:~/Linux/C/funclib$ ps >> isoutput.txt
    (base) asgter@asgter-TM1613:~/Linux/C/funclib$ tail isoutput.txt
    -rw-rw-r-- 1 asgter asgter 1528 8月  25 00:59 fred.o
    -rw-rw-r-- 1 asgter asgter    0 8月  25 01:57 isoutput.txt
    -rw-rw-r-- 1 asgter asgter 3266 8月  25 01:11 libfoo.a
    -rw-rw-r-- 1 asgter asgter  112 8月  25 01:02 lib.h
    -rwxrwxr-x 1 asgter asgter 8720 8月  25 01:14 program
    -rw-rw-r-- 1 asgter asgter   93 8月  25 01:07 program.c
    -rw-rw-r-- 1 asgter asgter 1568 8月  25 01:14 program.o
      PID TTY          TIME CMD
     5189 pts/1    00:00:00 bash
     7631 pts/1    00:00:00 ps

    标准错误输出重定向

    ls -l 2> isoutput.txt
    kill -HUP 1234 >killout.txt 2>killerr.tx
    kill -1 1234 >killouterr.txt 2>&1  
    # 将标准输入重定向到文件killouterr.txt,将标准错误输出重定向到与标准输出相同的地方
    kill -1 1234 >killouterr.txt 2

    Linux回收站

    /dev/null

    管道

    ps | sort > pssort.out
    ps | sort | more
    ps -xo comm | sort | uniq | grep -vsh | more
    # 首先按字母的顺序排序ps命令的输出
    # 再用uniq命令去除名字相同的进程
    # 然后用grep -v sh命令删除名为sh的进程  -v就是反转,就是不查找带sh的字符串
    # 最终将结果分页显示在屏幕上

    Shell简单的脚本

    grep -l 列出文件内容符合指定的范本样式的文件名称。 这个命令会去深入的查文件内容, 不是文件名.

    (base) asgter@asgter-TM1613:~/Linux/C/funclib$ for file in *
    > do
    > if grep -l POSIX $file
    > then
    > more $file
    > fi
    > done

    shell通配符扩展

    * 匹配一个字符串

    ? 匹配单个字符

    [set]允许匹配方括号中的任何一个单字符

    [^set]对方括号的内容取反

    {finger, toe}允许将任意的字符串组放在一个集合中,匹配成功任意一个就行

    shell的语法

    变量

    变量通常不需要事先声明

    在默认情况下, 所有变量都被看作字符串并以字符串来存储

    Linux区分大小写, 变量foo与Foo是不同的

    可以在变量名前加$符号来访问变量的内容

    (base) asgter@asgter-TM1613:~$ salutation=Hello
    (base) asgter@asgter-TM1613:~$ echo salutation
    salutation
    (base) asgter@asgter-TM1613:~$ salutation="Yes:
    > "
    (base) asgter@asgter-TM1613:~$ echo $salutation
    Yes:
    (base) asgter@asgter-TM1613:~$ echo salutation
    salutation
    (base) asgter@asgter-TM1613:~$ salutation=7+5
    (base) asgter@asgter-TM1613:~$ echo salutation
    salutation
    (base) asgter@asgter-TM1613:~$ echo $salutation
    7+5
    (base) asgter@asgter-TM1613:~$ read salutation
    what's up?
    (base) asgter@asgter-TM1613:~$ echo salutation
    salutation
    (base) asgter@asgter-TM1613:~$ echo $salutation
    what's up?

    使用引号

    一般情况下, 脚本文件中的参数以空白字符分隔(空格,制表符,换行符)

    如果想在一个参数中包含一个或多个空白字符, 必须给参数加上引号

    双引号等同于不加双引号

    单引号等同于将$转义

    (base) asgter@asgter-TM1613:~$ myvar="Hi threr"
    (base) asgter@asgter-TM1613:~$ echo $ myvar
    $ myvar
    (base) asgter@asgter-TM1613:~$ echo "$myvar"
    Hi threr
    (base) asgter@asgter-TM1613:~$ echo $myvar
    Hi threr
    (base) asgter@asgter-TM1613:~$ echo '$myvar'
    $myvar
    (base) asgter@asgter-TM1613:~$ echo $myvar
    $myvar
    (base) asgter@asgter-TM1613:~$ 
    (base) asgter@asgter-TM1613:~$ echo "Hello here"
    Hello here
    (base) asgter@asgter-TM1613:~$ read myvar
    Hello friend
    (base) asgter@asgter-TM1613:~$ echo '$myvar' now equals $myvar
    $myvar now equals Hello friend

    环境变量

    $HOME 当前用户的家目录

    $PATH  以冒号分隔的用来搜索命令的目录列表

    $0  shell脚本的名称

    $#  传递给脚本的参数个数

    $$  shell脚本的进程号,脚本程序通常会用它来生成一个唯一的临时文件,如 /tmp/tmpfile.$$

    参数变量

    $1, $2, ...  脚本程序的参数

    $*  在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔符

    $@  $*的变体, 用法大致相同

    (base) asgter@asgter-TM1613:~$ IFS=""
    (base) asgter@asgter-TM1613:~$ set foo bar bam
    (base) asgter@asgter-TM1613:~$ echo $@
    foo bar bam
    (base) asgter@asgter-TM1613:~$ echo $*
    foo bar bam
    (base) asgter@asgter-TM1613:~$ echo "$*"
    foobarbam
    (base) asgter@asgter-TM1613:~$ unset IFS
    (base) asgter@asgter-TM1613:~$ echo "$*"
    foo bar bam
    #!/bin/bash
    
    salutation="Hello"
    echo $salutation
    echo "The program $0 is now running"
    echo "The second parameter was $2"
    echo "The first parameter was $1"
    echo "The parameter list was $*"
    echo "The user's home directory is $HOME"
    
    echo "Please enter a new greeting"
    read salutation
    
    echo $salutation
    echo "The script is now complete"
    exit 0
  • 相关阅读:
    梦断代码阅读笔记
    程序员的自我修养阅读笔记
    11月总结3
    11月总结3
    程序员的自我修养阅读笔记
    程序员的自我修养阅读笔记
    程序员的自我修养阅读笔记
    程序员的自我修养阅读笔记
    第十四周总结
    第十三周总结
  • 原文地址:https://www.cnblogs.com/draven123/p/11406782.html
Copyright © 2011-2022 走看看