我是靠谱客的博主 体贴绿茶,最近开发中收集的这篇文章主要介绍shell while内获取外部变量内容一、问题二、答案,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、问题

问题很简单,看下面一段tmp.sh代码:

#!/bin/sh
x="this is the initial value of x"
cat /tmp/tmp | while read line;do
        x="$line"
        echo $x
done
echo x = $x

/tmp/tmp的内容

1,a

执行 ./tmp.sh,正常x变量是蓝色的“1,a”,但是实际的结果却是红色部分:

[qiu.li@l-tdata1.tkt.cn6 ~]$ ./tmp.sh 
1,a
x = this is the initial value of x

问题很明显,变量x在while内修改之后,并没有带到外面来,为什么哪?

二、答案

经过几经查找,终于发现问题的原因:是因为启动了子进程,而变量x在子进程修改之后,并没有带入到父进程。原文如下:

This is because in the Bourne shell redirected control structures run in a subshell, so the value of x only gets changed in the  subshell, and is lost when the loop ends.

In other shells the same result may be seen because of the way pipelines are handled. In shells other than ksh (not pdksh) and zsh elements of a pipeline are run in subshells. In ksh and zsh, the last element of the pipeline is run in the current shell.

An alternative for non-Bourne shells is to use redirection
instead of the pipeline

如何解决哪?

1、一般方法:

#!/bin/sh
x="this is the initial value of x"
while read line;do
        x="$line"
        echo $x
done < /tmp/tmp
echo x = $x

运行:

[qiu.li@l-tdata1.tkt.cn6 ~]$ ./tmp.sh 
1,a
x = 1,a

2、优雅一些的解决方法:

#!/bin/sh
x="this is the initial value of x"
exec 3<&0         # save stdin 将标准输入重定向到文件描述符3
exec < /tmp/tmp # 输入文件
while read line; do
        x=$line
        echo $x
done
exec 0<&3        # restore stdin
echo x = $x

上面使用的方法是:使用重定向代替子shell,从而可以在外面获取while里面的变量值。

参考:http://www.cnblogs.com/liqiu/p/4107948.html

转载于:https://www.cnblogs.com/liqiu/p/4128759.html

最后

以上就是体贴绿茶为你收集整理的shell while内获取外部变量内容一、问题二、答案的全部内容,希望文章能够帮你解决shell while内获取外部变量内容一、问题二、答案所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部