redhat shell 变量作用域问题

GG_wg 2015-09-28 03:06:21

rownum=1
load_file="/data/resource.txt"
cat $load_file | while read LINE
do
rownum=2
echo $rownum #这个地方变量值为2
done

echo $rownum #这个地方变量值应该为2,但是输出值为1,是什么原因
...全文
178 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nswcfd 2015-09-30
  • 打赏
  • 举报
回复
在子进程里修改的变量,父进程看不到。 a=0; (a=1; echo $a;); echo $a 最后一个echo显示0,而不是在子进程修改的1。这里()里的命令在子进程里执行。 同样,| 管道分割的命令也在子进程里执行。 a=0; a=1 | a=2; echo $a 最后显示a还是0,而不是pipe里的1或者2
图灵转世 2015-09-29
  • 打赏
  • 举报
回复
还是不太懂,请指教。
nswcfd 2015-09-29
  • 打赏
  • 举报
回复
更改一下格式,去掉{},换成if语句
shell_id()
{
	echo "$1: \$\$=$$, \$BASHPID=$BASHPID"
}

shell_id parent

shell_id cmd1 | if true; then
			read shell_id_from_cmd1;
			echo $shell_id_from_cmd1;
			shell_id cmd2
		fi
nswcfd 2015-09-29
  • 打赏
  • 举报
回复
[test ~]$ cat a.sh 
shell_id()
{
	echo "$1: \$\$=$$, \$BASHPID=$BASHPID"
}

shell_id parent
{ shell_id cmd1; } | { read shell_id_from_cmd1; echo $shell_id_from_cmd1; shell_id cmd2; }
[test ~]$ bash a.sh 
parent: $$=7495, $BASHPID=7495
cmd1: $$=7495, $BASHPID=7496
cmd2: $$=7495, $BASHPID=7497
注意:三个BASHPID的不同。
nswcfd 2015-09-29
  • 打赏
  • 举报
回复
典型的错误。 cmd1 | cmd2 这里while是cmd2,它在subshell里执行。
vachel66 2015-09-28
  • 打赏
  • 举报
回复
只看你贴出来的部分,最后值应该是2,请贴完整脚本看下

23,115

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧