假设echo $PATH
产生/first/dir:/second/dir:/third/dir
。
问题:如何一次回显$PATH
一个目录的内容,如下所示:
```
$ newcommand $PATH
/first/dir
/second/dir
/third/dir
```
最好,我试图找出如何使用for
循环来解决这个问题,该循环在echo
中为每个目录实例发出一个$PATH
实例。
答案 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)
我的想法是使用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}'
答案 3 :(得分:1)
作为附加选项(如果您出于某种其他目的需要数组中的条目),您可以使用自定义IFS
和read -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}