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