免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3691 | 回复: 13

[文本处理] linux shell问题 [复制链接]

论坛徽章:
0
发表于 2013-04-08 17:01 |显示全部楼层
今天linux下写脚本的时候遇到个问题,如下
var=1
for i in {1..10} ;
do
let 'var+=1'
done
echo $var
这样最后输出的是11
var=1
cat ceshi | while read lin1
do
let 'var+=1'
done
echo $var
*ceshi是文件,里边有10行,
这样最后输出的是1
这是为什么啊

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
发表于 2013-04-09 13:53 |显示全部楼层
本帖最后由 rdcwayx 于 2013-04-10 11:57 编辑
  1. execve("/bin/sh", ["sh", "-x", "test.sh"], [/* 24 vars */]) = 0
  2. brk(0)                                  = 0x84ae000
  3. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b14b5853000
  4. uname({sys="Linux", node="code", ...})  = 0
  5. access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
  6. open("/etc/ld.so.cache", O_RDONLY)      = 3
  7. fstat(3, {st_mode=S_IFREG|0644, st_size=66862, ...}) = 0
  8. mmap(NULL, 66862, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b14b5854000
  9. close(3)                                = 0
  10. open("/lib64/libtermcap.so.2", O_RDONLY) = 3
  11. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@\17\240\2318\0\0\0"..., 832) = 832
  12. fstat(3, {st_mode=S_IFREG|0755, st_size=15584, ...}) = 0
  13. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b14b5865000
  14. mmap(0x3899a00000, 2108688, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3899a00000
  15. mprotect(0x3899a03000, 2093056, PROT_NONE) = 0
  16. mmap(0x3899c02000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x3899c02000
  17. close(3)                                = 0
  18. open("/lib64/libdl.so.2", O_RDONLY)     = 3
  19. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\16 \2318\0\0\0"..., 832) = 832
  20. fstat(3, {st_mode=S_IFREG|0755, st_size=23360, ...}) = 0
  21. mmap(0x3899200000, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3899200000
  22. mprotect(0x3899202000, 2097152, PROT_NONE) = 0
  23. mmap(0x3899402000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x3899402000
  24. close(3)                                = 0
  25. open("/lib64/libc.so.6", O_RDONLY)      = 3
  26. read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\332\341\2308\0\0\0"..., 832) = 832
  27. fstat(3, {st_mode=S_IFREG|0755, st_size=1717800, ...}) = 0
  28. mmap(0x3898e00000, 3498328, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3898e00000
  29. mprotect(0x3898f4e000, 2093056, PROT_NONE) = 0
  30. mmap(0x389914d000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14d000) = 0x389914d000
  31. mmap(0x3899152000, 16728, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3899152000
  32. close(3)                                = 0
  33. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b14b5866000
  34. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b14b5867000
  35. arch_prctl(ARCH_SET_FS, 0x2b14b5866dd0) = 0
  36. mprotect(0x3899402000, 4096, PROT_READ) = 0
  37. mprotect(0x389914d000, 16384, PROT_READ) = 0
  38. mprotect(0x3898c1b000, 4096, PROT_READ) = 0
  39. munmap(0x2b14b5854000, 66862)           = 0
  40. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  41. open("/dev/tty", O_RDWR|O_NONBLOCK)     = 3
  42. close(3)                                = 0
  43. brk(0)                                  = 0x84ae000
  44. brk(0x84cf000)                          = 0x84cf000
  45. open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
  46. fstat(3, {st_mode=S_IFREG|0644, st_size=56413600, ...}) = 0
  47. mmap(NULL, 56413600, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b14b5868000
  48. close(3)                                = 0
  49. getuid()                                = 0
  50. getgid()                                = 0
  51. geteuid()                               = 0
  52. getegid()                               = 0
  53. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  54. time(NULL)                              = 1365486541
  55. open("/proc/meminfo", O_RDONLY)         = 3
  56. fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
  57. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b14b8e35000
  58. read(3, "MemTotal:      1048576 kB\nMemFre"..., 4096) = 682
  59. close(3)                                = 0
  60. munmap(0x2b14b8e35000, 4096)            = 0
  61. rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], 0}, 8) = 0
  62. rt_sigaction(SIGCHLD, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, 8) = 0
  63. rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], 0}, 8) = 0
  64. rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, 8) = 0
  65. rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], 0}, 8) = 0
  66. rt_sigaction(SIGQUIT, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, 8) = 0
  67. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  68. rt_sigaction(SIGQUIT, {0x1, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, 8) = 0
  69. uname({sys="Linux", node="code", ...})  = 0
  70. stat("/root", {st_mode=S_IFDIR|0750, st_size=4096, ...}) = 0
  71. stat(".", {st_mode=S_IFDIR|0750, st_size=4096, ...}) = 0
  72. getpid()                                = 24159
  73. open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
  74. fstat(3, {st_mode=S_IFREG|0644, st_size=25464, ...}) = 0
  75. mmap(NULL, 25464, PROT_READ, MAP_SHARED, 3, 0) = 0x2b14b8e35000
  76. close(3)                                = 0
  77. getppid()                               = 24158
  78. stat(".", {st_mode=S_IFDIR|0750, st_size=4096, ...}) = 0
  79. stat("/usr/kerberos/sbin/sh", 0x7fffcbf24cf0) = -1 ENOENT (No such file or directory)
  80. stat("/usr/kerberos/bin/sh", 0x7fffcbf24cf0) = -1 ENOENT (No such file or directory)
  81. stat("/usr/local/sbin/sh", 0x7fffcbf24cf0) = -1 ENOENT (No such file or directory)
  82. stat("/usr/local/bin/sh", 0x7fffcbf24cf0) = -1 ENOENT (No such file or directory)
  83. stat("/sbin/sh", 0x7fffcbf24cf0)        = -1 ENOENT (No such file or directory)
  84. stat("/bin/sh", {st_mode=S_IFREG|0755, st_size=801512, ...}) = 0
  85. access("/bin/sh", X_OK)                 = 0
  86. access("/bin/sh", R_OK)                 = 0
  87. stat("/bin/sh", {st_mode=S_IFREG|0755, st_size=801512, ...}) = 0
  88. access("/bin/sh", X_OK)                 = 0
  89. access("/bin/sh", R_OK)                 = 0
  90. getpgrp()                               = 24158
  91. rt_sigaction(SIGCHLD, {0x436080, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, 8) = 0
  92. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  93. open("test.sh", O_RDONLY)               = 3
  94. ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, 0x7fffcbf24da0) = -1 ENOTTY (Inappropriate ioctl for device)
  95. lseek(3, 0, SEEK_CUR)                   = 0
  96. read(3, "#!/bin/bash\nset -xv\nvar=1\ncat ce"..., 80) = 80
  97. lseek(3, 0, SEEK_SET)                   = 0
  98. getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0
  99. dup2(3, 255)                            = 255
  100. close(3)                                = 0
  101. fcntl(255, F_SETFD, FD_CLOEXEC)         = 0
  102. fcntl(255, F_GETFL)                     = 0x8000 (flags O_RDONLY|O_LARGEFILE)
  103. fstat(255, {st_mode=S_IFREG|0644, st_size=137, ...}) = 0
  104. lseek(255, 0, SEEK_CUR)                 = 0
  105. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  106. read(255, "#!/bin/bash\nset -xv\nvar=1\ncat ce"..., 137) = 137
  107. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  108. fstat(2, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
  109. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b14b8e3c000
  110. write(2, "+ set -xv\n", 10+ set -xv
  111. )             = 10
  112. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  113. write(2, "var=1\n", 6var=1
  114. )                  = 6
  115. write(2, "+ var=1\n", 8+ var=1
  116. )                = 8
  117. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  118. write(2, "cat ceshi | while read lin1\n", 28cat ceshi | while read lin1
  119. ) = 28
  120. write(2, "do\n", 3do
  121. )                     = 3
  122. write(2, "echo \"start $var\"\n", 18echo "start $var"
  123. )   = 18
  124. write(2, "let 'var+=1'\n", 13let 'var+=1'
  125. )          = 13
  126. write(2, "echo $var\n", 10echo $var
  127. )             = 10
  128. write(2, "done\n", 5done
  129. )                   = 5
  130. rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
  131. pipe([3, 4])                            = 0
  132. rt_sigprocmask(SIG_BLOCK, [INT CHLD], [CHLD], 8) = 0
  133. lseek(255, -34, SEEK_CUR)               = 103
  134. clone(+ cat ceshi
  135. child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b14b5866e60) = 24160
  136. rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
  137. close(4)                                = 0
  138. close(4)                                = -1 EBADF (Bad file descriptor)
  139. rt_sigprocmask(SIG_BLOCK, [INT CHLD], [CHLD], 8) = 0
  140. clone(+ read lin1
  141. + echo 'start 1'
  142. start 1
  143. + let var+=1
  144. + echo 2
  145. 2
  146. + read lin1
  147. + echo 'start 2'
  148. start 2
  149. + let var+=1
  150. + echo 3
  151. 3
  152. + read lin1
  153. + echo 'start 3'
  154. start 3
  155. + let var+=1
  156. + echo 4
  157. 4
  158. + read lin1
  159. + echo 'start 4'
  160. start 4
  161. + let var+=1
  162. + echo 5
  163. 5
  164. + read lin1
  165. + echo 'start 5'
  166. start 5
  167. + let var+=1
  168. + echo 6
  169. 6
  170. + read lin1
  171. + echo 'start 6'
  172. start 6
  173. + let var+=1
  174. + echo 7
  175. 7
  176. + read lin1
  177. + echo 'start 7'
  178. start 7
  179. + let var+=1
  180. + echo 8
  181. 8
  182. + read lin1
  183. + echo 'start 8'
  184. start 8
  185. + let var+=1
  186. + echo 9
  187. 9
  188. + read lin1
  189. + echo 'start 9'
  190. start 9
  191. + let var+=1
  192. + echo 10
  193. 10
  194. + read lin1
  195. + echo 'start 10'
  196. start 10
  197. + let var+=1
  198. + echo 11
  199. 11
  200. + read lin1
  201. child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x2b14b5866e60) = 24161
  202. rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
  203. close(3)                                = 0
  204. rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
  205. rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
  206. rt_sigprocmask(SIG_BLOCK, [CHLD], [CHLD], 8) = 0
  207. rt_sigaction(SIGINT, {0x436c60, [], SA_RESTORER, 0x3898e302d0}, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, 8) = 0
  208. wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24160
  209. wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24161
  210. rt_sigprocmask(SIG_SETMASK, [CHLD], NULL, 8) = 0
  211. rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x3898e302d0}, {0x436c60, [], SA_RESTORER, 0x3898e302d0}, 8) = 0
  212. close(3)                                = -1 EBADF (Bad file descriptor)
  213. rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
  214. --- SIGCHLD (Child exited) @ 0 (0) ---
  215. wait4(-1, 0x7fffcbf24864, WNOHANG, NULL) = -1 ECHILD (No child processes)
  216. rt_sigreturn(0xffffffffffffffff)        = 0
  217. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  218. read(255, "echo \"check var values\"\necho $va"..., 137) = 34
  219. write(2, "echo \"check var values\"\n", 24echo "check var values"
  220. ) = 24
  221. write(2, "+ echo 'check var values'\n", 26+ echo 'check var values'
  222. ) = 26
  223. fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
  224. mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b14b8e3d000
  225. write(1, "check var values\n", 17check var values
  226. )      = 17
  227. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  228. write(2, "echo $var\n", 10echo $var
  229. )             = 10
  230. write(2, "+ echo 1\n", 9+ echo 1
  231. )               = 9
  232. write(1, "1\n", 21
  233. )                      = 2
  234. rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
  235. read(255, "", 137)                      = 0
  236. exit_group(0)                           = ?
复制代码
从上面的输出看var在while循环里是一个private的变量作用于只限于while循环体。
命令是strace sh -x test.sh

其中test.sh 是你上面的脚本,只是在循环中var多打印了一下。

论坛徽章:
0
发表于 2013-04-09 15:05 |显示全部楼层
发到shell版更合适。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2013-04-09 15:55 |显示全部楼层
回复 2# wenhq


    nB! 膜拜!咱只知道 while 由于管道另开一个进程,继承到子进程的变量的改变不会影响到父进程变量,你这真是深度解剖啊。
(不过表示高深莫测,文字太多,没细看……就跟武林高手的招术太复杂看不过来一样

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每月发帖之星
日期:2015-09-11 19:30:52IT运维版块每周发帖之星
日期:2015-09-11 19:20:31IT运维版块每日发帖之星
日期:2015-08-26 06:20:00每日论坛发贴之星
日期:2015-08-20 06:20:00IT运维版块每日发帖之星
日期:2015-08-20 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:15金牛座
日期:2014-05-04 16:58:09双子座
日期:2013-12-17 16:44:37辰龙
日期:2013-11-22 15:20:59狮子座
日期:2013-11-18 22:55:08射手座
日期:2013-11-12 10:54:26
发表于 2013-04-09 15:57 |显示全部楼层

回复 3# llzqq

见笑了。
大家互相学习。


   

论坛徽章:
0
发表于 2013-04-09 16:36 |显示全部楼层
子shell问题吧,第二个例子应该是这样:
  1. var=1
  2. cat ceshi | { while read lin1
  3. do
  4. let 'var+=1'
  5. done
  6. echo $var
  7. }
复制代码

论坛徽章:
0
发表于 2013-04-10 09:24 |显示全部楼层
额。。。看着头晕   

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
发表于 2013-04-10 10:04 |显示全部楼层
问题出在while前的管道上. 有个帖子专门讨论过这个问题, 你自己找找看。

如果要得到11, 用下面的代码。
  1. var=1
  2. while read lin1
  3. do
  4. let 'var+=1'
  5. done < ceshi
  6. echo $var
复制代码

论坛徽章:
0
发表于 2013-04-10 10:43 |显示全部楼层
回复 5# wenhq


    进来膜拜下....

论坛徽章:
0
发表于 2013-04-10 13:36 |显示全部楼层
请问你的这么一串东西是怎么跟出来的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP