请问 bash脚本 局部全局变量问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
evolution2012GL
帖子: 20
注册时间: 2012-08-03 18:06

请问 bash脚本 局部全局变量问题

#1

帖子 evolution2012GL » 2012-08-05 22:50

#!/bin/bash
2 # changing the IFS value
3
4 IFS_OLD=$IFS
5 IFS=$'\n'
6 for entry in `cat /etc/passwd`
7 do
8 echo "Values in $entry -"
9 IFS=:
10 for value in $entry
11 do
12 echo " $value"
13 done
14 done
15 IFS=$IFS_OLD
***********************************************
运行结果
Values in root:x:0:0:root:/root:/bin/bash -
2 root
3 x
4 0
5 0
6 root
7 /root
8 /bin/bash
...
...
Values in timidity:x:116:127:TiMidity++ MIDI sequencer service:/etc/timidity :/bin/false -
306 timidity
307 x
308 116
309 127
310 TiMidity++ MIDI sequencer service
311 /etc/timidity
312 /bin/false
*****************************************************************************************************************
这个脚本是修改了IFS 先按照行读取 /etc/passwd 然后在此行中 按照: 依次显示
脚本中
第五行 IFS赋值为\n
for内部 第九行 IFS赋值为:
只要在循环体外 IFS为\n 循环体内IFS为:
for循环内外得 两个IFS为两个变量 一个是 for的局部变量 一个是全局变量 是这样得吗?
谢谢
头像
枫叶饭团
帖子: 14683
注册时间: 2010-06-16 1:05
系统: Mac OS X
来自: Tencent
联系:

Re: 请问 bash脚本 局部全局变量问题

#2

帖子 枫叶饭团 » 2012-08-05 22:57

bash变量有作用域?
evolution2012GL
帖子: 20
注册时间: 2012-08-03 18:06

Re: 请问 bash脚本 局部全局变量问题

#3

帖子 evolution2012GL » 2012-08-05 23:00

枫叶饭团 写了:bash变量有作用域?
那结果是 跳出 for循环 IFS又变回开始\n了呀
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 请问 bash脚本 局部全局变量问题

#4

帖子 aerofox » 2012-08-06 8:50

不是局部变量的关系。
在遇到下面这条语句时,

代码: 全选

for entry in `cat /etc/passwd`
IFS的值为'\n'。shell 已经用这个IFS把`cat /etc/passwd`的结果拆分为参数列表给for了,后续的循环中,IFS为什么值已经无法影响到这个拆分过程。
evolution2012GL
帖子: 20
注册时间: 2012-08-03 18:06

Re: 请问 bash脚本 局部全局变量问题

#5

帖子 evolution2012GL » 2012-08-06 18:15

非常感谢 aerofox 我明白了

for entry in `cat /etc/passwd` 到这里时 `cat /etc/passwd` 已经是 参数列表了
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: 请问 bash脚本 局部全局变量问题

#6

帖子 tusooa » 2012-08-27 14:38

aerofox 写了:不是局部变量的关系。
在遇到下面这条语句时,

代码: 全选

for entry in `cat /etc/passwd`
IFS的值为'\n'。shell 已经用这个IFS把`cat /etc/passwd`的结果拆分为参数列表给for了,后续的循环中,IFS为什么值已经无法影响到这个拆分过程。
不要改IFS。
读文件一定要用

代码: 全选

while read line; do something ; done < /etc/passwd
这种形式。IFS一旦乱掉,会发生不可预知的错误。
while read line这样的,可以很好的解决空格问题。

代码: 全选

] ls -ld //
evolution2012GL
帖子: 20
注册时间: 2012-08-03 18:06

Re: 请问 bash脚本 局部全局变量问题

#7

帖子 evolution2012GL » 2012-08-28 9:18

tusooa 写了:
aerofox 写了:不是局部变量的关系。
在遇到下面这条语句时,

代码: 全选

for entry in `cat /etc/passwd`
IFS的值为'\n'。shell 已经用这个IFS把`cat /etc/passwd`的结果拆分为参数列表给for了,后续的循环中,IFS为什么值已经无法影响到这个拆分过程。
不要改IFS。
读文件一定要用

代码: 全选

while read line; do something ; done < /etc/passwd
这种形式。IFS一旦乱掉,会发生不可预知的错误。
while read line这样的,可以很好的解决空格问题。
谢谢tusooa 非常感谢
头像
自由建客
帖子: 13468
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64

Re: 请问 bash脚本 局部全局变量问题

#8

帖子 自由建客 » 2012-08-28 10:34

伪局部作用域,很蛋疼的,凑合用吧。
wpf0317
帖子: 2
注册时间: 2012-08-19 11:37

Re: 请问 bash脚本 局部全局变量问题

#9

帖子 wpf0317 » 2012-09-04 9:42

变量在shell中都是全局变量,如果想要局部变量,可以在变量前加local
evolution2012GL
帖子: 20
注册时间: 2012-08-03 18:06

Re: 请问 bash脚本 局部全局变量问题

#10

帖子 evolution2012GL » 2012-09-04 10:14

谢谢 自由建客
谢谢 wpf0317
回复