如何将`$ PATH`的内容拆分成不同的行?

时间:2015-11-02 01:31:33

标签: bash shell

假设echo $PATH产生/first/dir:/second/dir:/third/dir

问题:如何一次回显$PATH一个目录的内容,如下所示:

```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```

最好,我试图找出如何使用for循环来解决这个问题,该循环在echo中为每个目录实例发出一个$PATH实例。

8 个答案:

答案 0 :(得分:9)

echo "$PATH" | tr ':' '\n'

应该做的伎俩。这将简单地取echo "$PATH"的输出,并用换行符分隔符替换任何冒号。

请注意$PATH周围的引号可以防止$PATH输出中多个连续空格的折叠,同时仍然输出变量的内容。

答案 1 :(得分:2)

这个怎么样:

echo "$PATH" | sed -e 's/:/\n/g'

(请参阅sed's s command; sed -e 'y/:/\n/'也可以使用,并且等同于其他答案中的tr ":" "\n"。)

除非绝对必要,否则最好不要复杂化:这里不需要for循环。还有其他方法可以为列表中的每个条目执行命令,更符合Unix Philosophy

  

这是Unix的理念:编写程序,做一件事,做得好。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。

如:

echo "$PATH" | sed -e 's/:/\n/g' | xargs -n 1 echo

这在功能上等同于对PATH元素的for循环迭代,为每个元素执行最后echo命令。 -n 1告诉xargs只为其提供1个参数的命令;没有它我们会得到与echo "$PATH" | sed -e 'y/:/ /'相同的输出 由于这使用xargs,它具有内置支持来分割输入,并且如果没有给出命令则回显输入,我们可以将其写为:

echo -n "$PATH" | xargs -d ':' -n 1

-d ':'告诉xargs使用:来分隔它的输入而不是换行符,-n告诉/bin/echo不要写新换行符,否则我们最终会得到一个空白的尾随线。

答案 2 :(得分:1)

我的想法是使用echoawk

echo $PATH | awk 'BEGIN {FS=":"} {for (i=0; i<=NF; i++) print $i}'

修改

这个命令比我以前的想法更好。

echo "$PATH" | awk 'BEGIN {FS=":"; OFS="\n"} {$1=$1; print $0}'

答案 3 :(得分:1)

作为附加选项(如果您出于某种其他目的需要数组中的条目),您可以使用自定义IFSread -a执行此操作:

IFS=: read -r -a patharr <<<"$PATH"
printf %s\\n "${patharr[@]}"

或者因为问题要求带有for循环的版本:

for dir in "${patharr[@]}"; do
    echo "$dir"
done

答案 4 :(得分:0)

您可以使用tr(翻译)将冒号(:)替换为换行符(\n),然后在for循环中迭代它。

directories=$(echo $PATH | tr ":" "\n")
for directory in $directories
do
    echo $directory
done

答案 5 :(得分:0)

如果您可以保证PATH不包含嵌入空格,您可以:

for dir in ${PATH//:/ }; do
    echo $dir
done

如果存在嵌入空格,则会严重失败。

答案 6 :(得分:0)

这是另一个较短的

echo -e ${PATH//:/\\n}

答案 7 :(得分:0)

# 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}