# preserve the existing internal field separator
OLD_IFS=${IFS}
# define the internal field separator to be a colon
IFS=":"
# do what you need to do with $PATH
for DIRECTORY in ${PATH}
do
echo ${DIRECTORY}
done
# restore the original internal field separator
IFS=${OLD_IFS}
8条答案
按热度按时间fd3cxomn1#
应该可以了。这将简单地获取
echo "$PATH"
的输出,并将任何冒号替换为换行符。如果您需要循环使用:
注意,
$PATH
两边的引号可以防止$PATH
输出中的多个连续空格折叠,同时仍然输出变量的内容。bxpogfeg2#
作为一个附加选项(如果您需要数组中的条目用于其他目的),您可以使用自定义的
IFS
和read -a
来完成此操作:或者因为问题要求使用for循环的版本:
iq0todco3#
不如这样:
(See sed的
s
命令;sed -e 'y/:/\n/'
也可以使用,并且等效于其他答案中的tr ":" "\n"
。)除非绝对必要,否则最好不要把事情复杂化:这里不需要for循环。还有其他方法可以为列表中的每个条目执行命令,更符合Unix Philosophy:
这就是Unix的哲学:写程序做一件事并且做得很好。写程序一起工作。写程序处理文本流,因为那是一个通用的接口。
例如:
这在功能上等价于一个for循环,它遍历PATH元素,对每个元素执行最后一个
echo
命令,-n 1
告诉xargs
只提供一个参数给它的命令;没有它,我们将得到与echo "$PATH" | sed -e 'y/:/ /'
相同的输出。由于它使用
xargs
,它内置了对拆分输入的支持,并且在没有给出命令时回显输入,因此我们可以将其写为:-d ':'
告诉xargs使用:
而不是换行符来分隔输入,-n
告诉/bin/echo
不要写换行符,否则我们以一个空白的尾随行结束。kuarbcqp4#
下面是另一个较短的例子:
ldxq2e6h5#
您可以使用
tr
(translate)将冒号(:
)替换为换行符(\n
),然后在for循环中对其进行迭代。niknxzdl6#
我的想法是使用
echo
和awk
。这个命令比我以前的主意好。
zpgglvta7#
如果可以保证PATH不包含嵌入空格,则可以:
如果有嵌入的空格,这将严重失败。
5f0d552i8#