假设我们要split以':'分隔的PATH变量,并迭代每个PATH中的目录。我们可以使用tr把':'转换成空格,之后直接迭代这个变量?
for d
in $
(
echo
$PATH
|
tr
':'
' '
);
do
echo $d
done
echo $d
done
这段代码在有时候正常工作,有时候不行。假设PATH中的的目录不含有空格,则会正常工作。
由于command substitution结束后,shell会进行word splitting,根据IFS的值,分割成不同的word。默认IFS=<space><tab><newline>。而在这里我们假设PATH=/usr/bin:/user/local/bin:/home/arum/foo bar,而上述代码的输出将是:
/usr/bin
/usr/local/bin
/home/arum/foo
bar
/usr/local/bin
/home/arum/foo
bar
我们原本是想直接迭代/home/arum/foo bar的目录,但是由于foo bar之间的空格是IFS的一部分,所以导致在word splitting过程中,被分成了2个部分。我们可以使用另一种方法,这种方法通过修改IFS来达到目的。
# save IFS
OLD_IFS= $IFS
IFS= ':'
for d in $PATH; do
echo $d
done
# restore IFS
IFS= $OLD_IFS
OLD_IFS= $IFS
IFS= ':'
for d in $PATH; do
echo $d
done
# restore IFS
IFS= $OLD_IFS
这段代码的输出就正确了。
我们还可以将分隔的结果保存到一个数组当中,以供以后使用。
a
=
(
$PATH
)