string splitting

假设我们要split以':'分隔的PATH变量,并迭代每个PATH中的目录。我们可以使用tr把':'转换成空格,之后直接迭代这个变量?

for d in $ ( echo $PATH | tr ':' ' ' ); do
    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

我们原本是想直接迭代/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

这段代码的输出就正确了。

我们还可以将分隔的结果保存到一个数组当中,以供以后使用。

a = ( $PATH )

你可能感兴趣的:(工作,String,shell,command,Path)