假设echo $PATH
得到/first/dir:/second/dir:/third/dir
。
问:一个人如何在时代回响$PATH
一个目录的内容,如:
```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```
最好,我试图找出如何做到这一点有for
环路问题每个$PATH
中的目录实例为echo
的一个实例。
假设echo $PATH
得到/first/dir:/second/dir:/third/dir
。
问:一个人如何在时代回响$PATH
一个目录的内容,如:
```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```
最好,我试图找出如何做到这一点有for
环路问题每个$PATH
中的目录实例为echo
的一个实例。
您可以使用tr
(translate)用换行符(\n
)替换冒号(:
),然后在for循环中迭代该冒号。
directories=$(echo $PATH | tr ":" "\n")
for directory in $directories
do
echo $directory
done
如何:
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
不写一个换行符,否则我们会以空行结束。
引用您的变量扩展。 '“$ PATH”' –
问题要求在for循环中使用 – doublesharp
echo "$PATH" | tr ':' '\n'
应该这样做。这将只需要输出echo "$PATH"
并用换行符分隔符替换任何冒号。
请注意,$PATH
左右的引号可防止输出$PATH
中的多个连续空格崩溃,同时仍然输出变量的内容。
引用您的变量扩展。 '“$ PATH”' –
问题要求在for循环中使用 – doublesharp
@doublesharp他说最好。我提供的解决方案不仅仅是为了满足他的需求,而且还考虑了Google/SO中的其他人的搜索。 – CydrickT
我的想法是使用echo
和awk
。
echo $PATH | awk 'BEGIN {FS=":"} {for (i=0; i<=NF; i++) print $i}'
编辑
这个命令是不是我以前的想法更好。
echo "$PATH" | awk 'BEGIN {FS=":"; OFS="\n"} {$1=$1; print $0}'
引用您的变量扩展。 ''$ PATH'' –
设置'OFS =“\ n”',awk会为你换行。 (在你说服它之后,你已经修改了类似'$ 1 = $ 1'的行) –
作为附加选项(并且如果你需要的条目用于其他目的数组),您可以用自定义IFS
和read -a
做到这一点:
IFS=: read -r -a patharr <<<"$PATH"
printf %s\\n "${patharr[@]}"
或者自提要求对于具有一个版本的循环:
for dir in "${patharr[@]}"; do
echo "$dir"
done
array + for循环是适用于* all *合法PATH值的唯一方法(包括那些目录名包含换行符字符)。 (这是'PATH'的限制,即包含':'的目录名称,虽然合法,但不能安全地添加到PATH中)。 – chepner
如果你能保证路径不包含空格,您可以:
for dir in ${PATH//:/ }; do
echo $dir
done
如果有嵌入空格,这将会失败。
这也失败与壳球。 'P = 'A:/ bin中/ *:B'; echo $ {P //:/}' –
根本没有理由重复您已经换行的分隔输出。这对于其中包含空格(或全局字符)的路径条目不起作用。 –
@EtanReisner专门提问的问题 – doublesharp
够公平的,我掩饰了这个偏好。尽管如此,这对空间或球体仍然不安全,并且意味着转换为空格或'NUL'可能会更好,然后解析(肯定是'while')循环。 –