zoukankan      html  css  js  c++  java
  • shell 编程笔记

    #! /bin/sh
    寻找shell解释器 /bin/sh  是一个路径
    #! /usr/bin/python
    仅仅是寻找一个python的解释器


    执行linux程序的方法:
    使得文件具有可执行的权限 直接执行
    调用解释器来运行
    使用source来运行
    shell 存在着内部命令 和外部命令 内建命令就是shell 程序本身的命令
    运行内部命令的时候 不包含进程的创建和消亡
    可是在运行外部命令的时候,存在着进程是创建和消亡。以此同一时候
    外部命令运行的步骤例如以下:、
    创建一个子进程
    查找路径
    子进程运行 父进程休眠
    子进程运行完成。父进程从终端读取下一条命令


    source 命令的运行不会 创建进程 更加的不会有进程的消亡 没有子进程
    仅仅有在父进程中运行。


    比如:echo.sh
    #! /bin/sh
    cd /tmp
    echo "hello world"
    运行方法选择的是 赋予权限的方式的话 ./echo.sh 此时父进程接受命令 发现不是内建命令 就会创建一个子进程(和父进程一模一样)来运行这个外部命令 此时子进程 来设置自己的环境变量 cd 命令改变的仅仅是子进程的文件夹 并没有改变父进程的文件夹 。子进程运行完毕 消亡,父进程等待下个命令运行 所以此方式下的运行 cd命令会失效。




    所以选择的运行方式 是source的形式 就会运行 source不会创建子进程 仅仅是在父进程中进行。




    shell变量:
    全局变量 环境变量 自己定义变量
    局部变量 必须使用local声明 否则还是全局可见的
    export 用于设置当前的环境变量  


    计算机 不能直接理解高级语言 须要将高级语言 翻译成机器语言 计算机才干看的明确 翻译是方式有两种 一种是:编译 一种是:解释
    编译型的语言 是在程序运行之前 须要一个专门的编译过程 ,仅仅做一次的编译,运行的时候不须要进行编译了 运行效率较高
    解释型的语言 是在程序在运行的时候 运行一次 翻译一次 效率较低。




    脚本參数的传递
    參数的传递 能够将外部的值传递到脚本的内部函数中去,提高脚本的灵活性。
    testfunc()
    echo "$# parameters";
    echo "$@";


    testfunc a b c 
    3 parameters 
    a b c 
    testfunc a "b c"
    2 parameters
    a b c 


    shell中的变量是不区分类型的 都是字符串类型 shell变量中有3中:用户变量 位置变量 环境变量 


    linux中shell变量$#,$@,$0,$1,$2的含义解释: 
    变量说明: 
    $$ 
    Shell本身的PID(ProcessID) 
    $! 
    Shell最后执行的后台Process的PID 
    $? 
    最后执行的命令的结束代码(返回值) 有数值的情况下返回数值 成功返回0值 退出的状态0 表示正常退出 非0表示执行出现异常 
    $- 
    使用Set命令设定的Flag一览 
    $* 
    全部參数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出全部參数。

     
    $@ 
    全部參数列表。

    如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出全部參数。 
    $# 
    加入到Shell的參数个数 
    $0 
    Shell本身的文件名称 
    $1~$n 
    加入到Shell的各參数值。$1是第1參数、$2是第2參数…。 


    启动文件:
    /bin/login   读取/etc/passwd文件成功登录后,启动一个交互的shell
    /etc/environment 环境变量 
    假设须要对shell做全局性的设置 而且在每次的启动的时候 自己主动载入 能够将命令写入启动文件里去


    type用于显示 命令是什么类型的 是外部命令 内建命令 别名...
    shell 的函数
    #! /bin/sh
    # 数字相加


    function add(){
    let "sum=$1+$2"
    return $sum
    }
    运行:
    source add.sh 将函数从文件里读入 之后能够直接调用
    add 3 7
    echo $?

    $? 保存是上一次的命令运行的返回值
    7


    shell的条件控制与流程


    if condition
    then 
    statements
    elif contition
    then 
    statements
    else
    statements
    fi
    shell里面的case语句 
    case $1 in
    -f) statements;;
    -d) statements;;
    esac 


    for 循环语句
    for name [in list]
    do 
    ....
    done
    for file in `find . -iname "*.mp3"` //反单引號的作用就是将命令返回的结果作为字符串
    do
    mpg123 $file
    done


    无限循环 
    path=$PATH
    while true
    do
    if [-z $path]
    then
    break;
    fi
    ls -ld ${path%%:*} //列出path中第一个文件夹
    path=${path#*:} //截取path中的第一个文件夹和冒号
    done


    Tips:
    位置參数能够用shift命令左移。比方shift 3表示原来的$4如今变成$1。原来的$5如今变成$2等等,原来的$1、$2、$3丢弃,$0不移动。


    不带參数的shift命令相当于shift 1。


    很实用的 Unix 命令:shift。

    我们知道。对于位置变量或命令行參数,其个数必须是确定的。
    或者当 Shell 程序不知道其个数时,能够把全部參数一起赋值给变量$*。
    若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把參数一一处理,
    也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令运行前变量 $1 的值在 shift 命令运行后就不可用了。




    linux shell里面的正則表達式:
    定义:
    简而言之,正則表達式就是记录文本规则的代码。
    正則表達式:元字符 
     代表着单词的开头或是结尾
    d 代表着数字 比如0d{2}-d{8} 意思就是 010-12345678
    grep 查找文本
    正則表達式中的元字符:
    ^ :行或者字符串開始
    $ :行或字符串结束
    . :匹配一个非换行符的字符
    * :匹配0个或多个先前字符 .* 代表随意字符
    [...] :方括号表达式 [0-9]匹配单个数字 ^位于括号表达式的开头表示相反的意思[^0-9]不是0-9之间的数字
    :打开或者关闭兴许字符
    正則表達式:基本正則表達式 和扩展正則表達式
    (): 
    :
    x{m,n}: 区间表达式 x出现的次数 最少m次 最多n次 
    +: 匹配前面正則表達式的一个或者多个实例
    ?

    : 匹配前面正則表達式的一个或者0个实例
    ():用括号括起来的正則表達式
    |: 匹配|前面或者后面的正則表達式


    grep支持的元字符
    <: 单词的開始
    />: 单词的结束
    w: 匹配文字或是数字 [:alnum:]
    W: 匹配非文字或是数字 [[:alnum:]_]
    : 单词的锁定符


    字符集:
    [:alnum:]: 文字数字字符集 A-Za-z0-9
    [:alpha:]: 文字字符集
    [:blank:]: 空格或者定位字符
    [:digit:]: 数字字符
    [:graph:]: 非空字符
    [:lower:]: 小写字符
    [:cntrl:]: 控制字符
    [:print:]: 非空字符
    [:punct:]: 标点符号
    [:space:]: 空白字符
    [:upper:]: 大写字符
    [:xdigit:]: 十六进制数字 0-9 a-f A-F


    正則表達式里面的反向引用:
    (ab)(cd)[efg]*12 用来匹配: abcdabcd abcdeabcd abcdfabcd abcdgabcd 1: ab 2: cd 
    (go).*1 用来匹配一行出现了2个go
    交替 | you|me 用来匹配 you 或者 me 交替的优先级是最低的
    分组() (go)+ 匹配了一个go 或者是多个go 


    罗马数字:
    I=1
    V=5 
    X=10
    L=50
    C=100 CD=400 DC=600
    D=500
    M=1000 MCM=1900

  • 相关阅读:
    Windows 8实例教程系列 布局控制
    Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月7日1月14日)
    Silverlight动态设置WCF服务Endpoint
    轻松搭建Windows8云平台开发环境
    Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月28日2月3日)
    Windows8/Silverlight/WPF/WP7/HTML5周学习导读(1月1日1月6日)
    Qt 打印已加载可用的数据库驱动
    QSqlDatabase: QOCI driver not loaded
    QT oracle
    参数初始化列表
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6732846.html
Copyright © 2011-2022 走看看