Answers:
这只会改变特定while循环的IFS值吗?
不,实际上它只会改变它的read
部分。在while
循环体内,之后,它将返回其默认值,因为它只会在read
命令的上下文中设置。
您可以在某个文件上编写一个简单的循环来证明这一点,例如使用包含两列的CSV文件:
#!/bin/bash
while IFS="," read a b; do
echo $a $b
done < "input.csv"
echo $IFS
输出的最后一行将出现空,因为默认情况下,IFS是<space>
,<tab>
和<newline>
,因此$' \t\n'
。有关详细信息,请参阅POSIX规范。
如果您(意外?)将IFS设置为整个脚本的其他值,请将unset IFS
其重置为默认值。
此外,如果通过“session”,您指的是单个脚本(或执行脚本的shell),一旦该脚本退出,该值将不会保存。当然,您的终端不会在多个会话中保留它。
while IFS='|' read var1 var2 var3
这只会改变特定while循环的IFS值吗?
不会。它只会更改特定的IFS值read
。一般而言,循环是从while
到done
,它可以包括许多命令。
这里既不特别IFS
也不read
特别。拿这个通用代码:
( export a=0
printenv a
while a=1 printenv a && printenv a; printenv a; true; do
printenv a
break
done; printenv a )
结果是:
0 1 0 0 0 0
只有第二个printenv
获得修改后的值!
笔记:
a
当前shell中的变量。printenv a
,不是echo $a
因为在后一种情况下shell会在开始之前扩展$a
到shell本身看到的值echo
(无论echo
是内置shell还是单独的可执行文件)。语法variable=foo some_command
几乎不会改变shell本身的变量(例外variable=foo export variable
)。如果改为每printenv a
到echo $a
我的代码,你会得到所有0
-s。是的,根据您的代码块,仅为循环设置IFS值。一旦控件退出循环,IFS就会在进入循环之前获得其值。这不会影响同一shell脚本中的其他读取操作。我试过这样的事情:
echo "Changing IFS value to ','."
OLD_IFS_VALUE=$IFS
IFS='|'
CURRENT_IFS_VALUE=$IFS
echo "IFS value before entering the loop : $CURRENT_IFS_VALUE"
while IFS=',' read name age city gender
do
echo $name $age $city $gender
done < "testdata1.csv"
echo "After loop value of IFS : $IFS"
所以我把IFS设置为'|' 在循环之前。在循环内部,我使用IFS值作为','。一旦控件退出循环,IFS值为“|”。
read
”。循环中有些地方IFS
没有,
。看我的回答。
man bash
。