分页: 1 / 1

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

发表于 : 2012-08-05 22:50
evolution2012GL
#!/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的局部变量 一个是全局变量 是这样得吗?
谢谢

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

发表于 : 2012-08-05 22:57
枫叶饭团
bash变量有作用域?

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

发表于 : 2012-08-05 23:00
evolution2012GL
枫叶饭团 写了:bash变量有作用域?
那结果是 跳出 for循环 IFS又变回开始\n了呀

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

发表于 : 2012-08-06 8:50
aerofox
不是局部变量的关系。
在遇到下面这条语句时,

代码: 全选

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

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

发表于 : 2012-08-06 18:15
evolution2012GL
非常感谢 aerofox 我明白了

for entry in `cat /etc/passwd` 到这里时 `cat /etc/passwd` 已经是 参数列表了

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

发表于 : 2012-08-27 14:38
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这样的,可以很好的解决空格问题。

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

发表于 : 2012-08-28 9:18
evolution2012GL
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 非常感谢

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

发表于 : 2012-08-28 10:34
自由建客
伪局部作用域,很蛋疼的,凑合用吧。

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

发表于 : 2012-09-04 9:42
wpf0317
变量在shell中都是全局变量,如果想要局部变量,可以在变量前加local

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

发表于 : 2012-09-04 10:14
evolution2012GL
谢谢 自由建客
谢谢 wpf0317