忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 2162 | 回复: 3

[系统管理] shell脚本函数写法讨论 [复制链接]

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-01-20 06:20:00
发表于 2018-03-23 13:09 |显示全部楼层
本帖最后由 bobower 于 2018-03-23 13:11 编辑

HI ALL:

今天看别人写的一个shell写本,发现里面有个函数的写法不是很明白,百度很久也没有找到合理说明(可能百度关键字不最优吧,哈哈~),特来向各位大神请教~!

例一:
脚本如下:
# cat /tmp/a.sh
a () {
        a=1 b=3
        echo $a
        echo $b
}
a
echo $a
echo $b

====================
脚本说明:函数a中,a=1 b=3 没有换行,也没用分号隔开,我理解这样是会报错的,但执行是对的,如下
执行:
# sh -x /tmp/a.sh
+ a
+ a=1
+ b=3
+ echo 1
1
+ echo 3
3
+ echo 1
1
+ echo 3
3


====================
执行说明:函数中a=1 b=3相当于变量,可以在函数内外使用。

例二:
再来看一个例子,脚本如下:
# cat /tmp/b.sh
a () {
        a=1 b=3 ls /etc/fstab
        echo in: $a
        echo in: $b
}
a
echo out: $a
echo out: $b

=====================
脚本说明:相比于/tmp/a.sh,/tmp/b.sh脚本函数在 a=1 b=3后面多加了“ls /etc/fstab”,其它在变量输出时加了前缀信息,便于理解。
执行:
# sh -x /tmp/b.sh
+ a
+ a=1
+ b=3
+ ls /etc/fstab
/etc/fstab
+ echo in:
in:
+ echo in:
in:
+ echo out:
out:
+ echo out:
out:

====================
执行说明:执行结果显示,函数内的a=1 b=2是有赋值的,后面ls /etc/fstab也有执行。
但echo $a和$b时,不管是函数内还是函数外,都为空,请问这是为什么?

论坛徽章:
1
天秤座
日期:2013-09-05 10:45:07
发表于 2018-03-30 19:13 |显示全部楼层
本帖最后由 howandsen 于 2018-03-30 19:30 编辑

例一:
分号和换行一样只是众多 control operator 中的一种。
只有命令结尾才需要加 control operator ,变量赋值严格来讲不是命令,而是命令的前置。
所以多个变量赋值之间不应该用分号分割,因为分号和换行的作用是等同的。
man bash 中也明确定义了简单命令的组成——由一系列可选的变量赋值开始。
SHELL GRAMMAR
        Simple Commands
                A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator...




例二:
如果变量赋值后面加了命令,则变量成为后面命令的环境变量,并且对当前 shell 无效。
SIMPLE COMMAND EXPANSION
...
               If  no command name results, the variable assignments affect the current shell environment.  Oth‐erwise, the variables are added to the environment of the executed command and do not affect  thecurrent  shell  environment...


论坛徽章:
0
发表于 2018-04-12 10:27 |显示全部楼层
佩服楼上
只想知道楼上大神,是了解真相去查manual来给我们这些菜鸟解释,还是学习过程中就已经通读过了.

论坛徽章:
0
发表于 2018-04-15 22:20 |显示全部楼层
bobower 发表于 2018-03-23 13:09
HI ALL:

今天看别人写的一个shell写本,发现里面有个函数的写法不是很明白,百度很久也没有找到合理说 ...

厉害了,为什么a函数结束后,还有一个a,为什么在a函数里面可以有a变量?顺便问一下,能帮忙推荐一本学习shell脚本的书吗。
正在学习shell脚本,但是我手上这本感觉好粗略,好多细节都没有。想找一本比较比较详尽的书看看。

来自一个正在努力学习shell脚本的小白

您需要登录后才可以回帖 登录 | 注册

本版积分规则

【重磅资料】多云网络实战的相关问题汇总!
云网融合的多云网络

本文介绍如何管理私有云数据中心,构建数据中心互联和混合云解决方案。对于OTT 网络架构的深入理解,基本上来源于SIGCOM 的白皮书和一些公开视频。

Overlay SDN 控制器详解

云计算为了适应业务/APP 的快速开发和部署,会把网络分为两层:Overlay 和 Underlay 网络。本文主要讲Overlay网络层面的问题。

超级核心路由器演进

2016 年,网络连接已经采用100G/200G/400G(虽然 400GE 接口技术还未成熟),互联网出口也已经增长到了 T 级别。

获得资料 >>
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP