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

Geo*_*rge 5 bash shell

假设echo $PATH收益率/first/dir:/second/dir:/third/dir.

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

```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```
Run Code Online (Sandbox Code Playgroud)

最好,我试图弄清楚如何使用for循环发出一个echo目录的每个实例的一个实例$PATH.

Gam*_*ega 9

echo "$PATH" | tr ':' '\n'
Run Code Online (Sandbox Code Playgroud)

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

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

  • @doublesharp 他说最好。我提供的解决方案不仅满足他的需求,而且还考虑到在 Google/SO 中搜索此内容的其他人。 (5认同)
  • 引用你的变量扩展。`“$路径”` (2认同)
  • 呸! HTML剥夺了我的空间.在该变量的`foo`和`bar`之间放置多个空格并再次尝试.喜欢[this](http://ideone.com/QsCTKF). (2认同)

Ken*_*ney 6

这个怎么样:

echo "$PATH" | sed -e 's/:/\n/g'
Run Code Online (Sandbox Code Playgroud)

(参见sed 的s命令sed -e 'y/:/\n/'也可以工作,并且相当于tr ":" "\n"其他一些答案中的命令。)

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

这就是 Unix 哲学:编写只做一件事并把它做好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。

例如:

echo "$PATH" | sed -e 's/:/\n/g' | xargs -n 1 echo
Run Code Online (Sandbox Code Playgroud)

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

echo -n "$PATH" | xargs -d ':' -n 1
Run Code Online (Sandbox Code Playgroud)

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


Eta*_*ner 6

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

IFS=: read -r -a patharr <<<"$PATH"
printf %s\\n "${patharr[@]}"
Run Code Online (Sandbox Code Playgroud)

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

for dir in "${patharr[@]}"; do
    echo "$dir"
done
Run Code Online (Sandbox Code Playgroud)

  • 数组 + for 循环是唯一适用于*所有*合法的 `PATH` 值(包括目录名称包含换行符的值)的方法。(这是`PATH`的一个限制,包含`:`的目录名虽然合法,但不能安全地添加到`PATH`)。 (3认同)

Liu*_*Sha 5

这是另一个较短的:

echo -e ${PATH//:/\\n}
Run Code Online (Sandbox Code Playgroud)


dou*_*arp 2

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

directories=$(echo $PATH | tr ":" "\n")
for directory in $directories
do
    echo $directory
done
Run Code Online (Sandbox Code Playgroud)