2015-11-02 33 views
4

假设echo $PATH得到/first/dir:/second/dir:/third/dir

问:一个人如何在时代回响$PATH一个目录的内容,如:

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

最好,我试图找出如何做到这一点有for环路问题每个$PATH中的目录实例为echo的一个实例。

回答

0

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

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

根本没有理由重复您已经换行的分隔输出。这对于其中包含空格(或全局字符)的路径条目不起作用。 –

+0

@EtanReisner专门提问的问题 – doublesharp

+0

够公平的,我掩饰了这个偏好。尽管如此,这对空间或球体仍然不安全,并且意味着转换为空格或'NUL'可能会更好,然后解析(肯定是'while')循环。 –

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 

这在功能上等同于一个for循环遍历路径元件,执行该最后echo命令为每个元素。 -n 1告诉xargs只提供1个参数给它的命令;没有它,我们会得到与echo "$PATH" | sed -e 'y/:/ /'相同的输出。
由于这种使用xargs,已经内置支持拆分输入,如果没有给命令相呼应的输入,我们可以写为:

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

-d ':'告诉xargs的使用:分离它是输入而不是换行符,并且-n告诉/bin/echo不写一个换行符,否则我们会以空行结束。

+1

引用您的变量扩展。 '“$ PATH”' –

+0

问题要求在for循环中使用 – doublesharp

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

应该这样做。这将只需要输出echo "$PATH"并用换行符分隔符替换任何冒号。

请注意,$PATH左右的引号可防止输出$PATH中的多个连续空格崩溃,同时仍然输出变量的内容。

+1

引用您的变量扩展。 '“$ PATH”' –

+0

问题要求在for循环中使用 – doublesharp

+1

@doublesharp他说最好。我提供的解决方案不仅仅是为了满足他的需求,而且还考虑了Google/SO中的其他人的搜索。 – CydrickT

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}' 
+0

引用您的变量扩展。 ''$ PATH'' –

+1

设置'OFS =“\ n”',awk会为你换行。 (在你说服它之后,你已经修改了类似'$ 1 = $ 1'的行) –

1

作为附加选项(并且如果你需要的条目用于其他目的数组),您可以用自定义IFSread -a做到这一点:

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

或者自提要求对于具有一个版本的循环:

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

array + for循环是适用于* all *合法PATH值的唯一方法(包括那些目录名包含换行符字符)。 (这是'PATH'的限制,即包含':'的目录名称,虽然合法,但不能安全地添加到PATH中)。 – chepner

0

如果你能保证路径不包含空格,您可以:

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

如果有嵌入空格,这将会失败。

+0

这也失败与壳球。 'P = 'A:/ bin中/ *:B'; echo $ {P //:/}' –

相关问题