zoukankan      html  css  js  c++  java
  • shell中脚本与函数的使用策略

    脚本:运行的副作用不影响父环境,开辟了fork子进程;

    函数:副作用,定义的变量,数据默认直接添加到了调用者的环境,也是它自己的环境;不想副作用影响调用者环境,就必须主动用local修饰;

    shell 中的参数只有一种类型:字符串,或者数字意义的字符串;使用=就意味着对变量进行赋数值,右边默认为字符串变量

    函数中要使用传数组只能:

        1.数组可以转换成字符串传入函数;

        2.不使用参数,使用全局数组

    双引号在shell 中意义非凡,它不仅仅代表字符串,被它包起来的数组"${arrname[@]}",代表一个字符串,其中数组元素的分隔符为空格;

    被双引号包住的包含换行符号的数据(通常是输入输出pipe),也代表了,换行符号换成空格分隔符后的数据;

    IFS  对字符串分隔有影响,对${arrname[@]} 无影响,对${armname[*]} 有影响

    #root@c7hp:/cmd/fun IFS=';'
    #root@c7hp:/cmd/fun echo "${jfstack[@]}"
    pwd /root /cmd /cmd/fun
    #root@c7hp:/cmd/fun echo "${jfstack[*]}"
    pwd;/root;/cmd;/cmd/fun
    #root@c7hp:/cmd/fun echo  ${jfstack[*]}
    pwd /root /cmd /cmd/fun
    #以上分为两部分:数组数据提取  数据转换为字符串

    @  echo 本身都有自己的字符串转换逻辑,并且其中没有使用公共环境设置的IFS

    只有 " [*]"的组合使用了自己定义的IFS

    #root@c7hp:/cmd/fun a=1
    #root@c7hp:/cmd/fun echo $a
    1
    #root@c7hp:/cmd/fun echo ${a[0]}
    1
    变量与数组之间无缝扩展

    awk 可以把字符串,正则,作为分隔符;

    sed 可以把分隔符 替换成字符串

    tr ,IFS只能把分隔符作单个字符替换;

    # 参数列表变量$n  默认就是有字符串化的,不管用不用引号,用单双引号,都对它的参数化进程没有影响.

    脚本可以使用source退化为函数;

    尽量使用脚本,而不是函数,除非函数本身就是系统级别的作用范围;

    使用脚本的好处                

      1.把函数封装在脚本中可以形成类似于文件范围的访问隔离;  

      2.脚本是文件级别的东西,文件目录,绝对路径本身就给它带来版本区分,作用范围划分的优势.

      3.linux文件有缓存机制,脚本不会明显的比内存中的函数慢,而且4.2以上版本的bash还可能直接把命令名和脚本路径hash绑定.

      4.函数从文件加载到环境后,修改函数需要重写后需要重新加载.脚本文件不存在这个步骤. 函数也是要用脚本文件落地到磁盘的.

  • 相关阅读:
    HDU 5119 Happy Matt Friends(DP || 高斯消元)
    URAL 1698. Square Country 5(记忆化搜索)
    POJ 2546 Circular Area(两个圆相交的面积)
    URAL 1430. Crime and Punishment(数论)
    HDU 1111 Secret Code (DFS)
    HDU 1104 Remainder (BFS求最小步数 打印路径)
    URAL 1091. Tmutarakan Exams(容斥原理)
    PDO连接mysql8.0报PDO::__construct(): Server sent charset (255) unknown to the client. Please, report to the developers错误
    swoole简易实时聊天
    centos安装netcat
  • 原文地址:https://www.cnblogs.com/jf001/p/10262893.html
Copyright © 2011-2022 走看看