首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

Shell中变量赋值更新

2012-09-05 
【求助】Shell中变量赋值更新代码如下:tmp_filetestidx0 #idx第一次赋值cat $tmp_file | while read lined

【求助】Shell中变量赋值更新
代码如下:

tmp_file=test

idx=0 #idx第一次赋值
cat $tmp_file | while read line
do
  idx=$[$idx + 1]
  echo "idx:"$idx #更新,并赋值正常
done

echo "exit idx:"$idx #idx竟然还是为0


求助,上面代码最后一行,idx的取值竟然还是0.
它在while循环中已经被成功修改了啊?


[解决办法]
管道另起一个进程,所以改的不是本脚本中的变量了。可以改为如下:

C/C++ code
tmp_file=1.txtidx=0 #idx第一次赋值exec 4<> $tmp_filewhile read -u4 line do    idx=$[$idx + 1]     echo "idx:"$idx #更新,并赋值正常 done echo "exit idx:"$idx #idx竟然还是为0
[解决办法]
在bash下输入man exec,找到exec命令解释处,可以看到有”No new process is created.”这样的解释,这就是说exec命令不产生新的子进程。

系统调用exec是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。
[解决办法]
exec 4<> $tmp_file
while read -u4 line

则会两句确实不明白?
[解决办法]
exec是重定向用的,和linux C里的exec是不一样的。

exec 4>文件名 就是相当于linux c的int fd = open(文件, "w"); dup2(fd, 4); 。

这里read -u4就是从描述符4读数据的意思。

还有exec 4&-就是关闭描述符4, 是这么写吧。 

exec 4<文件名 是open("", "r"), <>当然就是r+了。

当然描述符之间也可以直接dup2, 比如exec 4>&1, 就是dup2(1, 4); 写4等于写标准输出。

注意,>往右是写,<是读,这只是SHELL得约定,实际从C语言实现角度看是毫无意义的。

对应的,exec 4<&0 就是dup2(0, 4), 读4等于读标准输入。

热点排行