脚本:运行的副作用不影响父环境,开辟了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.函数从文件加载到环境后,修改函数需要重写后需要重新加载.脚本文件不存在这个步骤. 函数也是要用脚本文件落地到磁盘的.